* [PATCH 1/3] RISC-V: paravirt: Add pvqspinlock KVM backend
2024-12-22 3:39 [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support guoren
@ 2024-12-22 3:39 ` guoren
2024-12-22 3:39 ` [PATCH 2/3] RISC-V: paravirt: Add pvqspinlock frontend guoren
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: guoren @ 2024-12-22 3:39 UTC (permalink / raw)
To: paul.walmsley, palmer, guoren, bjorn, conor, leobras, peterz,
parri.andrea, will, longman, boqun.feng, arnd, alexghiti, ajones,
rkrcmar
Cc: linux-riscv, linux-kernel, Guo Ren
From: Guo Ren <guoren@linux.alibaba.com>
Add the files functions needed to support the SBI PVLOCK (paravirt
qspinlock kick_cpu) extension. Implement kvm_sbi_ext_pvlock_kick_-
cpu(), and we only need to call the kvm_vcpu_kick() and bring
target_vcpu from the halt state.
Reviewed-by: Leonardo Bras <leobras@redhat.com>
Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
---
arch/riscv/include/asm/kvm_vcpu_sbi.h | 1 +
arch/riscv/include/asm/sbi.h | 5 +++
arch/riscv/include/uapi/asm/kvm.h | 1 +
arch/riscv/kvm/Makefile | 1 +
arch/riscv/kvm/vcpu_sbi.c | 4 ++
arch/riscv/kvm/vcpu_sbi_pvlock.c | 57 +++++++++++++++++++++++++++
6 files changed, 69 insertions(+)
create mode 100644 arch/riscv/kvm/vcpu_sbi_pvlock.c
diff --git a/arch/riscv/include/asm/kvm_vcpu_sbi.h b/arch/riscv/include/asm/kvm_vcpu_sbi.h
index b96705258cf9..bc37131938ad 100644
--- a/arch/riscv/include/asm/kvm_vcpu_sbi.h
+++ b/arch/riscv/include/asm/kvm_vcpu_sbi.h
@@ -88,6 +88,7 @@ extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn;
extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta;
extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental;
extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor;
+extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pvlock;
#ifdef CONFIG_RISCV_PMU_SBI
extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu;
diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h
index 6c82318065cf..6b2adda2b064 100644
--- a/arch/riscv/include/asm/sbi.h
+++ b/arch/riscv/include/asm/sbi.h
@@ -35,6 +35,7 @@ enum sbi_ext_id {
SBI_EXT_DBCN = 0x4442434E,
SBI_EXT_STA = 0x535441,
SBI_EXT_NACL = 0x4E41434C,
+ SBI_EXT_PVLOCK = 0xAB0401,
/* Experimentals extensions must lie within this range */
SBI_EXT_EXPERIMENTAL_START = 0x08000000,
@@ -401,6 +402,10 @@ enum sbi_ext_nacl_feature {
#define SBI_NACL_SHMEM_SRET_X(__i) ((__riscv_xlen / 8) * (__i))
#define SBI_NACL_SHMEM_SRET_X_LAST 31
+enum sbi_ext_pvlock_fid {
+ SBI_EXT_PVLOCK_KICK_CPU = 0,
+};
+
/* SBI spec version fields */
#define SBI_SPEC_VERSION_DEFAULT 0x1
#define SBI_SPEC_VERSION_MAJOR_SHIFT 24
diff --git a/arch/riscv/include/uapi/asm/kvm.h b/arch/riscv/include/uapi/asm/kvm.h
index 3482c9a73d1b..4590570a8fc3 100644
--- a/arch/riscv/include/uapi/asm/kvm.h
+++ b/arch/riscv/include/uapi/asm/kvm.h
@@ -198,6 +198,7 @@ enum KVM_RISCV_SBI_EXT_ID {
KVM_RISCV_SBI_EXT_VENDOR,
KVM_RISCV_SBI_EXT_DBCN,
KVM_RISCV_SBI_EXT_STA,
+ KVM_RISCV_SBI_EXT_PVLOCK,
KVM_RISCV_SBI_EXT_MAX,
};
diff --git a/arch/riscv/kvm/Makefile b/arch/riscv/kvm/Makefile
index 0fb1840c3e0a..4e1a82a7eeab 100644
--- a/arch/riscv/kvm/Makefile
+++ b/arch/riscv/kvm/Makefile
@@ -32,6 +32,7 @@ kvm-y += vcpu_sbi_replace.o
kvm-y += vcpu_sbi_sta.o
kvm-$(CONFIG_RISCV_SBI_V01) += vcpu_sbi_v01.o
kvm-y += vcpu_switch.o
+kvm-y += vcpu_sbi_pvlock.o
kvm-y += vcpu_timer.o
kvm-y += vcpu_vector.o
kvm-y += vm.o
diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c
index 6e704ed86a83..c770bef51a2f 100644
--- a/arch/riscv/kvm/vcpu_sbi.c
+++ b/arch/riscv/kvm/vcpu_sbi.c
@@ -82,6 +82,10 @@ static const struct kvm_riscv_sbi_extension_entry sbi_ext[] = {
.ext_idx = KVM_RISCV_SBI_EXT_VENDOR,
.ext_ptr = &vcpu_sbi_ext_vendor,
},
+ {
+ .ext_idx = KVM_RISCV_SBI_EXT_PVLOCK,
+ .ext_ptr = &vcpu_sbi_ext_pvlock,
+ },
};
static const struct kvm_riscv_sbi_extension_entry *
diff --git a/arch/riscv/kvm/vcpu_sbi_pvlock.c b/arch/riscv/kvm/vcpu_sbi_pvlock.c
new file mode 100644
index 000000000000..55d889ddc2cd
--- /dev/null
+++ b/arch/riscv/kvm/vcpu_sbi_pvlock.c
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c), 2024 Alibaba Cloud
+ *
+ * Authors:
+ * Guo Ren <guoren@linux.alibaba.com>
+ */
+
+#include <linux/errno.h>
+#include <linux/err.h>
+#include <linux/kvm_host.h>
+#include <asm/sbi.h>
+#include <asm/kvm_vcpu_sbi.h>
+
+static int kvm_sbi_ext_pvlock_kick_cpu(struct kvm_vcpu *vcpu)
+{
+ struct kvm_cpu_context *cp = &vcpu->arch.guest_context;
+ struct kvm *kvm = vcpu->kvm;
+ struct kvm_vcpu *target;
+
+ target = kvm_get_vcpu_by_id(kvm, cp->a0);
+ if (!target)
+ return SBI_ERR_INVALID_PARAM;
+
+ kvm_vcpu_kick(target);
+
+ if (READ_ONCE(target->ready))
+ kvm_vcpu_yield_to(target);
+
+ return SBI_SUCCESS;
+}
+
+static int kvm_sbi_ext_pvlock_handler(struct kvm_vcpu *vcpu, struct kvm_run *run,
+ struct kvm_vcpu_sbi_return *retdata)
+{
+ int ret = 0;
+ struct kvm_cpu_context *cp = &vcpu->arch.guest_context;
+ unsigned long funcid = cp->a6;
+
+ switch (funcid) {
+ case SBI_EXT_PVLOCK_KICK_CPU:
+ ret = kvm_sbi_ext_pvlock_kick_cpu(vcpu);
+ break;
+ default:
+ ret = SBI_ERR_NOT_SUPPORTED;
+ }
+
+ retdata->err_val = ret;
+
+ return 0;
+}
+
+const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pvlock = {
+ .extid_start = SBI_EXT_PVLOCK,
+ .extid_end = SBI_EXT_PVLOCK,
+ .handler = kvm_sbi_ext_pvlock_handler,
+};
--
2.40.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 2/3] RISC-V: paravirt: Add pvqspinlock frontend
2024-12-22 3:39 [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support guoren
2024-12-22 3:39 ` [PATCH 1/3] RISC-V: paravirt: Add pvqspinlock KVM backend guoren
@ 2024-12-22 3:39 ` guoren
2024-12-22 3:39 ` [PATCH 3/3] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait guoren
2024-12-23 8:14 ` [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support Anup Patel
3 siblings, 0 replies; 7+ messages in thread
From: guoren @ 2024-12-22 3:39 UTC (permalink / raw)
To: paul.walmsley, palmer, guoren, bjorn, conor, leobras, peterz,
parri.andrea, will, longman, boqun.feng, arnd, alexghiti, ajones,
rkrcmar
Cc: linux-riscv, linux-kernel, Guo Ren
From: Guo Ren <guoren@linux.alibaba.com>
Add an unfair qspinlock virtualization-friendly frontend, by halting the
virtual CPU rather than spinning.
Using static_call to switch between:
native_queued_spin_lock_slowpath() __pv_queued_spin_lock_slowpath()
native_queued_spin_unlock() __pv_queued_spin_unlock()
Add the pv_wait & pv_kick implementations.
Reviewed-by: Leonardo Bras <leobras@redhat.com>
Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
---
arch/riscv/Kconfig | 12 ++++
arch/riscv/include/asm/Kbuild | 1 -
arch/riscv/include/asm/qspinlock.h | 35 +++++++++++
arch/riscv/include/asm/qspinlock_paravirt.h | 28 +++++++++
arch/riscv/kernel/Makefile | 1 +
arch/riscv/kernel/qspinlock_paravirt.c | 67 +++++++++++++++++++++
arch/riscv/kernel/setup.c | 4 ++
7 files changed, 147 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
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index d4a7ca0388c0..e241ac39ecd6 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -1071,6 +1071,18 @@ config PARAVIRT_TIME_ACCOUNTING
If in doubt, say N here.
+config PARAVIRT_SPINLOCKS
+ bool "Paravirtualization layer for spinlocks"
+ depends on QUEUED_SPINLOCKS
+ default y
+ help
+ Paravirtualized spinlocks allow a unfair qspinlock to replace the
+ test-set kvm-guest virt spinlock implementation with something
+ virtualization-friendly, for example, halt the virtual CPU rather
+ than spinning.
+
+ If you are unsure how to answer this question, answer Y.
+
config RELOCATABLE
bool "Build a relocatable kernel"
depends on MMU && 64BIT && !XIP_KERNEL
diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm/Kbuild
index de13d5a234f8..c726330d2b9f 100644
--- a/arch/riscv/include/asm/Kbuild
+++ b/arch/riscv/include/asm/Kbuild
@@ -12,6 +12,5 @@ generic-y += spinlock_types.h
generic-y += ticket_spinlock.h
generic-y += qrwlock.h
generic-y += qrwlock_types.h
-generic-y += qspinlock.h
generic-y += user.h
generic-y += vmlinux.lds.h
diff --git a/arch/riscv/include/asm/qspinlock.h b/arch/riscv/include/asm/qspinlock.h
new file mode 100644
index 000000000000..1d9f32334ff1
--- /dev/null
+++ b/arch/riscv/include/asm/qspinlock.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c), 2024 Alibaba
+ * Authors:
+ * Guo Ren <guoren@linux.alibaba.com>
+ */
+
+#ifndef _ASM_RISCV_QSPINLOCK_H
+#define _ASM_RISCV_QSPINLOCK_H
+
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+#include <asm/qspinlock_paravirt.h>
+
+/* How long a lock should spin before we consider blocking */
+#define SPIN_THRESHOLD (1 << 15)
+
+void native_queued_spin_lock_slowpath(struct qspinlock *lock, u32 val);
+void __pv_init_lock_hash(void);
+void __pv_queued_spin_lock_slowpath(struct qspinlock *lock, u32 val);
+
+static inline void queued_spin_lock_slowpath(struct qspinlock *lock, u32 val)
+{
+ static_call(pv_queued_spin_lock_slowpath)(lock, val);
+}
+
+#define queued_spin_unlock queued_spin_unlock
+static inline void queued_spin_unlock(struct qspinlock *lock)
+{
+ static_call(pv_queued_spin_unlock)(lock);
+}
+#endif /* CONFIG_PARAVIRT_SPINLOCKS */
+
+#include <asm-generic/qspinlock.h>
+
+#endif /* _ASM_RISCV_QSPINLOCK_H */
diff --git a/arch/riscv/include/asm/qspinlock_paravirt.h b/arch/riscv/include/asm/qspinlock_paravirt.h
new file mode 100644
index 000000000000..a365203dd782
--- /dev/null
+++ b/arch/riscv/include/asm/qspinlock_paravirt.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c), 2024 Alibaba Cloud
+ * Authors:
+ * Guo Ren <guoren@linux.alibaba.com>
+ */
+
+#ifndef _ASM_RISCV_QSPINLOCK_PARAVIRT_H
+#define _ASM_RISCV_QSPINLOCK_PARAVIRT_H
+
+void pv_wait(u8 *ptr, u8 val);
+void pv_kick(int cpu);
+
+void dummy_queued_spin_lock_slowpath(struct qspinlock *lock, u32 val);
+void dummy_queued_spin_unlock(struct qspinlock *lock);
+
+DECLARE_STATIC_CALL(pv_queued_spin_lock_slowpath, dummy_queued_spin_lock_slowpath);
+DECLARE_STATIC_CALL(pv_queued_spin_unlock, dummy_queued_spin_unlock);
+
+void __init pv_qspinlock_init(void);
+
+void __pv_queued_spin_unlock_slowpath(struct qspinlock *lock, u8 locked);
+
+bool pv_is_native_spin_unlock(void);
+
+void __pv_queued_spin_unlock(struct qspinlock *lock);
+
+#endif /* _ASM_RISCV_QSPINLOCK_PARAVIRT_H */
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index 063d1faf5a53..79f823e0e57d 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -123,3 +123,4 @@ obj-$(CONFIG_COMPAT) += compat_vdso/
obj-$(CONFIG_64BIT) += pi/
obj-$(CONFIG_ACPI) += acpi.o
obj-$(CONFIG_ACPI_NUMA) += acpi_numa.o
+obj-$(CONFIG_PARAVIRT_SPINLOCKS) += qspinlock_paravirt.o
diff --git a/arch/riscv/kernel/qspinlock_paravirt.c b/arch/riscv/kernel/qspinlock_paravirt.c
new file mode 100644
index 000000000000..4ec4765f57f3
--- /dev/null
+++ b/arch/riscv/kernel/qspinlock_paravirt.c
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c), 2024 Alibaba Cloud
+ * Authors:
+ * Guo Ren <guoren@linux.alibaba.com>
+ */
+
+#include <linux/static_call.h>
+#include <asm/qspinlock_paravirt.h>
+#include <asm/sbi.h>
+
+void pv_kick(int cpu)
+{
+ sbi_ecall(SBI_EXT_PVLOCK, SBI_EXT_PVLOCK_KICK_CPU,
+ cpuid_to_hartid_map(cpu), 0, 0, 0, 0, 0);
+ return;
+}
+
+void pv_wait(u8 *ptr, u8 val)
+{
+ unsigned long flags;
+
+ if (in_nmi())
+ return;
+
+ local_irq_save(flags);
+ if (READ_ONCE(*ptr) != val)
+ goto out;
+
+ wait_for_interrupt();
+out:
+ local_irq_restore(flags);
+}
+
+static void native_queued_spin_unlock(struct qspinlock *lock)
+{
+ smp_store_release(&lock->locked, 0);
+}
+
+DEFINE_STATIC_CALL(pv_queued_spin_lock_slowpath, native_queued_spin_lock_slowpath);
+EXPORT_STATIC_CALL(pv_queued_spin_lock_slowpath);
+
+DEFINE_STATIC_CALL(pv_queued_spin_unlock, native_queued_spin_unlock);
+EXPORT_STATIC_CALL(pv_queued_spin_unlock);
+
+void __init pv_qspinlock_init(void)
+{
+ if (num_possible_cpus() == 1)
+ return;
+
+ if (!sbi_probe_extension(SBI_EXT_PVLOCK))
+ return;
+
+ pr_info("PV qspinlocks enabled\n");
+ __pv_init_lock_hash();
+
+ static_call_update(pv_queued_spin_lock_slowpath, __pv_queued_spin_lock_slowpath);
+ static_call_update(pv_queued_spin_unlock, __pv_queued_spin_unlock);
+}
+
+bool pv_is_native_spin_unlock(void)
+{
+ if (static_call_query(pv_queued_spin_unlock) == native_queued_spin_unlock)
+ return true;
+ else
+ return false;
+}
diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
index 45010e71df86..8b51ff5c7300 100644
--- a/arch/riscv/kernel/setup.c
+++ b/arch/riscv/kernel/setup.c
@@ -278,6 +278,10 @@ static void __init riscv_spinlock_init(void)
pr_err("Queued spinlock without Zabha or Ziccrse");
else
pr_info("Queued spinlock %s: enabled\n", using_ext);
+
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+ pv_qspinlock_init();
+#endif
}
extern void __init init_rt_signal_env(void);
--
2.40.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 3/3] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait
2024-12-22 3:39 [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support guoren
2024-12-22 3:39 ` [PATCH 1/3] RISC-V: paravirt: Add pvqspinlock KVM backend guoren
2024-12-22 3:39 ` [PATCH 2/3] RISC-V: paravirt: Add pvqspinlock frontend guoren
@ 2024-12-22 3:39 ` guoren
2024-12-23 8:14 ` [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support Anup Patel
3 siblings, 0 replies; 7+ messages in thread
From: guoren @ 2024-12-22 3:39 UTC (permalink / raw)
To: paul.walmsley, palmer, guoren, bjorn, conor, leobras, peterz,
parri.andrea, will, longman, boqun.feng, arnd, alexghiti, ajones,
rkrcmar
Cc: linux-riscv, linux-kernel, Guo Ren
From: Guo Ren <guoren@linux.alibaba.com>
Add trace point for pv_kick&wait, here is the output:
ls /sys/kernel/debug/tracing/events/paravirt/
enable filter pv_kick pv_wait
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
Reviewed-by: Leonardo Bras <leobras@redhat.com>
Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
---
arch/riscv/kernel/qspinlock_paravirt.c | 7 +++
.../kernel/trace_events_filter_paravirt.h | 60 +++++++++++++++++++
2 files changed, 67 insertions(+)
create mode 100644 arch/riscv/kernel/trace_events_filter_paravirt.h
diff --git a/arch/riscv/kernel/qspinlock_paravirt.c b/arch/riscv/kernel/qspinlock_paravirt.c
index 4ec4765f57f3..781ed2190334 100644
--- a/arch/riscv/kernel/qspinlock_paravirt.c
+++ b/arch/riscv/kernel/qspinlock_paravirt.c
@@ -9,8 +9,13 @@
#include <asm/qspinlock_paravirt.h>
#include <asm/sbi.h>
+#define CREATE_TRACE_POINTS
+#include "trace_events_filter_paravirt.h"
+
void pv_kick(int cpu)
{
+ trace_pv_kick(smp_processor_id(), cpu);
+
sbi_ecall(SBI_EXT_PVLOCK, SBI_EXT_PVLOCK_KICK_CPU,
cpuid_to_hartid_map(cpu), 0, 0, 0, 0, 0);
return;
@@ -28,6 +33,8 @@ void pv_wait(u8 *ptr, u8 val)
goto out;
wait_for_interrupt();
+
+ trace_pv_wait(smp_processor_id());
out:
local_irq_restore(flags);
}
diff --git a/arch/riscv/kernel/trace_events_filter_paravirt.h b/arch/riscv/kernel/trace_events_filter_paravirt.h
new file mode 100644
index 000000000000..68570c7602eb
--- /dev/null
+++ b/arch/riscv/kernel/trace_events_filter_paravirt.h
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c), 2024 Alibaba Cloud
+ * Authors:
+ * Guo Ren <guoren@linux.alibaba.com>
+ */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM paravirt
+
+#if !defined(_TRACE_PARAVIRT_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_PARAVIRT_H
+
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(pv_kick,
+ TP_PROTO(int cpu, int target),
+ TP_ARGS(cpu, target),
+
+ TP_STRUCT__entry(
+ __field(int, cpu)
+ __field(int, target)
+ ),
+
+ TP_fast_assign(
+ __entry->cpu = cpu;
+ __entry->target = target;
+ ),
+
+ TP_printk("cpu %d pv_kick target cpu %d",
+ __entry->cpu,
+ __entry->target
+ )
+);
+
+TRACE_EVENT(pv_wait,
+ TP_PROTO(int cpu),
+ TP_ARGS(cpu),
+
+ TP_STRUCT__entry(
+ __field(int, cpu)
+ ),
+
+ TP_fast_assign(
+ __entry->cpu = cpu;
+ ),
+
+ TP_printk("cpu %d out of wfi",
+ __entry->cpu
+ )
+);
+
+#endif /* _TRACE_PARAVIRT_H || TRACE_HEADER_MULTI_READ */
+
+#undef TRACE_INCLUDE_PATH
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_PATH ../../../arch/riscv/kernel/
+#define TRACE_INCLUDE_FILE trace_events_filter_paravirt
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
--
2.40.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support
2024-12-22 3:39 [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support guoren
` (2 preceding siblings ...)
2024-12-22 3:39 ` [PATCH 3/3] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait guoren
@ 2024-12-23 8:14 ` Anup Patel
2024-12-23 17:07 ` Andrew Jones
3 siblings, 1 reply; 7+ messages in thread
From: Anup Patel @ 2024-12-23 8:14 UTC (permalink / raw)
To: guoren
Cc: paul.walmsley, palmer, bjorn, conor, leobras, peterz,
parri.andrea, will, longman, boqun.feng, arnd, alexghiti, ajones,
rkrcmar, linux-riscv, linux-kernel, Guo Ren
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
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support
2024-12-23 8:14 ` [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support Anup Patel
@ 2024-12-23 17:07 ` Andrew Jones
2024-12-24 5:40 ` Guo Ren
0 siblings, 1 reply; 7+ messages in thread
From: Andrew Jones @ 2024-12-23 17:07 UTC (permalink / raw)
To: Anup Patel
Cc: guoren, paul.walmsley, palmer, bjorn, conor, leobras, peterz,
parri.andrea, will, longman, boqun.feng, arnd, alexghiti, rkrcmar,
linux-riscv, linux-kernel, Guo Ren
On Mon, Dec 23, 2024 at 01:44:50PM +0530, Anup Patel wrote:
> 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.
>
I promised Guo I'd help out by writing a draft for the SBI extension. I'll
try to get something posted this week.
Thanks,
drew
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/3] riscv: Add PARAVIRT_SPINLOCKS support
2024-12-23 17:07 ` Andrew Jones
@ 2024-12-24 5:40 ` Guo Ren
0 siblings, 0 replies; 7+ messages in thread
From: Guo Ren @ 2024-12-24 5:40 UTC (permalink / raw)
To: Andrew Jones
Cc: Anup Patel, paul.walmsley, palmer, bjorn, conor, leobras, peterz,
parri.andrea, will, longman, boqun.feng, arnd, alexghiti, rkrcmar,
linux-riscv, linux-kernel, Guo Ren
On Tue, Dec 24, 2024 at 1:07 AM Andrew Jones <ajones@ventanamicro.com> wrote:
>
> On Mon, Dec 23, 2024 at 01:44:50PM +0530, Anup Patel wrote:
> > 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.
Oh, I forgot the RFC tag. Thanks for reminding me.
> >
> > Please work with the PRS TG and Hypervisors SIG for the proposed
> > SBI extension.
Yes, I will.
> >
>
> I promised Guo I'd help out by writing a draft for the SBI extension. I'll
> try to get something posted this week.
Thanks, drew.
--
Best Regards
Guo Ren
^ permalink raw reply [flat|nested] 7+ messages in thread