Skip to content
  • Jamie Iles's avatar
    83ecdb18
    accel/tcg/tcg-accel-ops-rr: ensure fairness with icount · 83ecdb18
    Jamie Iles authored
    
    
    The round-robin scheduler will iterate over the CPU list with an
    assigned budget until the next timer expiry and may exit early because
    of a TB exit.  This is fine under normal operation but with icount
    enabled and SMP it is possible for a CPU to be starved of run time and
    the system live-locks.
    
    For example, booting a riscv64 platform with '-icount
    shift=0,align=off,sleep=on -smp 2' we observe a livelock once the kernel
    has timers enabled and starts performing TLB shootdowns.  In this case
    we have CPU 0 in M-mode with interrupts disabled sending an IPI to CPU
    1.  As we enter the TCG loop, we assign the icount budget to next timer
    interrupt to CPU 0 and begin executing where the guest is sat in a busy
    loop exhausting all of the budget before we try to execute CPU 1 which
    is the target of the IPI but CPU 1 is left with no budget with which to
    execute and the process repeats.
    
    We try here to add some fairness by splitting the budget across all of
    the CPUs on the thread fairly before entering each one.  The CPU count
    is cached on CPU list generation ID to avoid iterating the list on each
    loop iteration.  With this change it is possible to boot an SMP rv64
    guest with icount enabled and no hangs.
    
    Reviewed-by: default avatarPhilippe Mathieu-Daudé <philmd@linaro.org>
    Tested-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Signed-off-by: default avatarJamie Iles <quic_jiles@quicinc.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-Id: <20230427020925.51003-3-quic_jiles@quicinc.com>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    83ecdb18
    accel/tcg/tcg-accel-ops-rr: ensure fairness with icount
    Jamie Iles authored
    
    
    The round-robin scheduler will iterate over the CPU list with an
    assigned budget until the next timer expiry and may exit early because
    of a TB exit.  This is fine under normal operation but with icount
    enabled and SMP it is possible for a CPU to be starved of run time and
    the system live-locks.
    
    For example, booting a riscv64 platform with '-icount
    shift=0,align=off,sleep=on -smp 2' we observe a livelock once the kernel
    has timers enabled and starts performing TLB shootdowns.  In this case
    we have CPU 0 in M-mode with interrupts disabled sending an IPI to CPU
    1.  As we enter the TCG loop, we assign the icount budget to next timer
    interrupt to CPU 0 and begin executing where the guest is sat in a busy
    loop exhausting all of the budget before we try to execute CPU 1 which
    is the target of the IPI but CPU 1 is left with no budget with which to
    execute and the process repeats.
    
    We try here to add some fairness by splitting the budget across all of
    the CPUs on the thread fairly before entering each one.  The CPU count
    is cached on CPU list generation ID to avoid iterating the list on each
    loop iteration.  With this change it is possible to boot an SMP rv64
    guest with icount enabled and no hangs.
    
    Reviewed-by: default avatarPhilippe Mathieu-Daudé <philmd@linaro.org>
    Tested-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Signed-off-by: default avatarJamie Iles <quic_jiles@quicinc.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-Id: <20230427020925.51003-3-quic_jiles@quicinc.com>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Loading