Re: [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support

Anup Patel
2024-12-23T08:15:11Z

On Sun, Dec 22, 2024 at 9:09 AM <guoren@kernel.org> wrote:
>
> From: Guo Ren <guoren@linux.alibaba.com>
>
> Paravirtualized spinlocks allow a unfair qspinlock to replace the
> ticket-lock or native fair qspinlock implementation with something
> virtualization-friendly, for example, halt the virtual CPU rather
> than spinning.
>
> You could observe the paravirt qspinlock internal work situation with
> /sys/kernel/debug/tracing/trace:
>
> ls /sys/kernel/debug/tracing/events/paravirt/
> enable filter pv_kick pv_wait
>
> echo 1 > /sys/kernel/debug/tracing/events/paravirt/enable
> cat /sys/kernel/debug/tracing/trace
> entries-in-buffer/entries-written: 33927/33927 #P:12
>
> _-----=> irqs-off/BH-disabled
> / _----=> need-resched
> | / _---=> hardirq/softirq
> || / _--=> preempt-depth
> ||| / _-=> migrate-disable
> |||| / delay
> TASK-PID CPU# ||||| TIMESTAMP FUNCTION
> | | | ||||| | |
> sh-100 [001] d..2. 28.312294: pv_wait: cpu 1 out of wfi
> <idle>-0 [000] d.h4. 28.322030: pv_kick: cpu 0 kick target cpu 1
> sh-100 [001] d..2. 30.982631: pv_wait: cpu 1 out of wfi
> <idle>-0 [000] d.h4. 30.993289: pv_kick: cpu 0 kick target cpu 1
> sh-100 [002] d..2. 44.987573: pv_wait: cpu 2 out of wfi
> <idle>-0 [000] d.h4. 44.989000: pv_kick: cpu 0 kick target cpu 2
> <idle>-0 [003] d.s3. 51.593978: pv_kick: cpu 3 kick target cpu 4
> rcu_sched-15 [004] d..2. 51.595192: pv_wait: cpu 4 out of wfi
> lock_torture_wr-115 [004] ...2. 52.656482: pv_kick: cpu 4 kick target cpu 2
> lock_torture_wr-113 [002] d..2. 52.659146: pv_wait: cpu 2 out of wfi
> lock_torture_wr-114 [008] d..2. 52.659507: pv_wait: cpu 8 out of wfi
> lock_torture_wr-114 [008] d..2. 52.663503: pv_wait: cpu 8 out of wfi
> lock_torture_wr-113 [002] ...2. 52.666128: pv_kick: cpu 2 kick target cpu 8
> lock_torture_wr-114 [008] d..2. 52.667261: pv_wait: cpu 8 out of wfi
> lock_torture_wr-114 [009] .n.2. 53.141515: pv_kick: cpu 9 kick target cpu 11
> lock_torture_wr-113 [002] d..2. 53.143339: pv_wait: cpu 2 out of wfi
> lock_torture_wr-116 [007] d..2. 53.143412: pv_wait: cpu 7 out of wfi
> lock_torture_wr-118 [000] d..2. 53.143457: pv_wait: cpu 0 out of wfi
> lock_torture_wr-115 [008] d..2. 53.143481: pv_wait: cpu 8 out of wfi
> lock_torture_wr-117 [011] d..2. 53.143522: pv_wait: cpu 11 out of wfi
> lock_torture_wr-117 [011] ...2. 53.143987: pv_kick: cpu 11 kick target cpu 8
> lock_torture_wr-115 [008] ...2. 53.144269: pv_kick: cpu 8 kick target cpu 7
>
> This series is split from [1].
>
> [1]: https://lore.kernel.org/linux-riscv/20231225125847.2778638-1-guoren@kernel.org/
>
> Guo Ren (3):
> RISC-V: paravirt: Add pvqspinlock KVM backend
> RISC-V: paravirt: Add pvqspinlock frontend
> RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait

This should be an RFC series until the corresponding SBI extension
is frozen. AFAIK, no one has posted any SBI extension in this context
on any of the RVI mailing lists.

Please work with the PRS TG and Hypervisors SIG for the proposed
SBI extension.

Regards,
Anup

>
> arch/riscv/Kconfig | 12 +++
> arch/riscv/include/asm/Kbuild | 1 -
> arch/riscv/include/asm/kvm_vcpu_sbi.h | 1 +
> arch/riscv/include/asm/qspinlock.h | 35 +++++++++
> arch/riscv/include/asm/qspinlock_paravirt.h | 28 +++++++
> arch/riscv/include/asm/sbi.h | 5 ++
> arch/riscv/include/uapi/asm/kvm.h | 1 +
> arch/riscv/kernel/Makefile | 1 +
> arch/riscv/kernel/qspinlock_paravirt.c | 74 +++++++++++++++++++
> arch/riscv/kernel/setup.c | 4 +
> .../kernel/trace_events_filter_paravirt.h | 60 +++++++++++++++
> arch/riscv/kvm/Makefile | 1 +
> arch/riscv/kvm/vcpu_sbi.c | 4 +
> arch/riscv/kvm/vcpu_sbi_pvlock.c | 57 ++++++++++++++
> 14 files changed, 283 insertions(+), 1 deletion(-)
> create mode 100644 arch/riscv/include/asm/qspinlock.h
> create mode 100644 arch/riscv/include/asm/qspinlock_paravirt.h
> create mode 100644 arch/riscv/kernel/qspinlock_paravirt.c
> create mode 100644 arch/riscv/kernel/trace_events_filter_paravirt.h
> create mode 100644 arch/riscv/kvm/vcpu_sbi_pvlock.c
>
> --
> 2.40.1
>
>