• Palmer Dabbelt's avatar
    Merge patch series "riscv: Apply Zawrs when available" · 5ee121a3
    Palmer Dabbelt authored
    Andrew Jones <ajones@ventanamicro.com> says:
    
    Zawrs provides two instructions (wrs.nto and wrs.sto), where both are
    meant to allow the hart to enter a low-power state while waiting on a
    store to a memory location. The instructions also both wait an
    implementation-defined "short" duration (unless the implementation
    terminates the stall for another reason). The difference is that while
    wrs.sto will terminate when the duration elapses, wrs.nto, depending on
    configuration, will either just keep waiting or an ILL exception will be
    raised. Linux will use wrs.nto, so if platforms have an implementation
    which falls in the "just keep waiting" category (which is not expected),
    then it should _not_ advertise Zawrs in the hardware description.
    
    Like wfi (and with the same {m,h}status bits to configure it), when
    wrs.nto is configured to raise exceptions it's expected that the higher
    privilege level will see the instruction was a wait instruction, do
    something, and then resume execution following the instruction. For
    example, KVM does configure exceptions for wfi (hstatus.VTW=1) and
    therefore also for wrs.nto. KVM does this for wfi since it's better to
    allow other tasks to be scheduled while a VCPU waits for an interrupt.
    For waits such as those where wrs.nto/sto would be used, which are
    typically locks, it is also a good idea for KVM to be involved, as it
    can attempt to schedule the lock holding VCPU.
    
    This series starts with Christoph's addition of the riscv
    smp_cond_load_relaxed function which applies wrs.sto when available.
    That patch has been reworked to use wrs.nto and to use the same approach
    as Arm for the wait loop, since we can't have arbitrary C code between
    the load-reserved and the wrs. Then, hwprobe support is added (since the
    instructions are also usable from usermode), and finally KVM is
    taught about wrs.nto, allowing guests to see and use the Zawrs
    extension.
    
    We still don't have test results from hardware, and it's not possible to
    prove that using Zawrs is a win when testing on QEMU, not even when
    oversubscribing VCPUs to guests. However, it is possible to use KVM
    selftests to force a scenario where we can prove Zawrs does its job and
    does it well. [4] is a test which does this and, on my machine, without
    Zawrs it takes 16 seconds to complete and with Zawrs it takes 0.25
    seconds.
    
    This series is also available here [1]. In order to use QEMU for testing
    a build with [2] is needed. In order to enable guests to use Zawrs with
    KVM using kvmtool, the branch at [3] may be used.
    
    [1] https://github.com/jones-drew/linux/commits/riscv/zawrs-v3/
    [2] https://lore.kernel.org/all/20240312152901.512001-2-ajones@ventanamicro.com/
    [3] https://github.com/jones-drew/kvmtool/commits/riscv/zawrs/
    [4] https://github.com/jones-drew/linux/commit/cb2beccebcece10881db842ed69bdd5715cfab5d
    
    Link: https://lore.kernel.org/r/20240426100820.14762-8-ajones@ventanamicro.com
    
    * b4-shazam-merge:
      KVM: riscv: selftests: Add Zawrs extension to get-reg-list test
      KVM: riscv: Support guest wrs.nto
      riscv: hwprobe: export Zawrs ISA extension
      riscv: Add Zawrs support for spinlocks
      dt-bindings: riscv: Add Zawrs ISA extension description
      riscv: Provide a definition for 'pause'
    Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
    5ee121a3
vcpu.c 22.4 KB