[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20251124035402.3817179-1-maobibo@loongson.cn>
Date: Mon, 24 Nov 2025 11:53:58 +0800
From: Bibo Mao <maobibo@...ngson.cn>
To: Paolo Bonzini <pbonzini@...hat.com>,
Huacai Chen <chenhuacai@...nel.org>
Cc: kvm@...r.kernel.org,
loongarch@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: [PATCH v2 0/3] LoongArch: KVM: Add paravirt preempt support
vCPU preempt hint is useful with sched and lock on some platforms, here
new feature KVM_FEATURE_PREEMPT_HINT is added and VMM can selectively
enable it.
Test case kcbench is used to compile Linux kernel code, the test result
shows that it is useful on 3D6000 Dual-way machine with 64 cores and 128
hyperthreads, however no improvemet on 3C5000 Dual-way machine with 32
cores. With perf top command when running test case, the main difference
between over-commited VM and host is osq_lock(). if vcpu_is_preempted()
is implemented on VM, it can avoid unnecessary busy-loop waiting and
enter sleep state quickly if lock-hold vCPU is preempted.
Here is test result with kcbench on 3D6000 and 3C6000 hardware machines,
time unit is second to compile kernel with defconfig, performance is
better with smaller value.
3D6000 Dual-way 64 Core 128 Threads
One VM with 128 vCPUs, no overcommit, NUMA
Orginal With-patch Improvement
VM 91.72 92.4 < -1%
Host 89.7 89.75 < -0.1%
Two VMs overcommit with 128 vCPUs, UMA
Orginal With-patch Improvement
VM1 306.9 197.5 36%
VM2 303.7 197.8 35%
Host 89.7 89.75 < -0.1%
Two VMs overcommit with 128 vCPUs, NUMA
Orginal With-patch Improvement
VM1 317.1 159 50%
VM2 317.5 158 50%
Host 89.7 89.75 < -0.1%
3C5000 Dual-way 32 Core
One VM with 32 vCPUs, NUMA
Orginal With-patch Improvement
VM 208 207 < 0.5%
Host 184 185 < -0.5%
Two VMs overcommit with 32 vCPUs, UMA
Orginal With-patch Improvement
VM1 439 444 -1%
VM2 437 438 < -0.2%
Host 184 185 < -0.5%
Two VMs overcommit with 32 vCPUs, NUMA
Orginal With-patch Improvement
VM1 422 425 < -1%
VM2 418 415 < -1%
Host 184 185 < -0.5%
---
v1 ... v2:
1. Rename feature KVM_FEATURE_PREEMPT_HINT with KVM_FEATURE_PREEMPT,
remove HINT in feature name.
2. Rename reverve field with __u8 pad[47] rather than combination of
__u8 u8_pad[3] and __u32 pad[11]
3. Rename internal function _kvm_set_vcpu_preempted() with
kvm_vcpu_set_pv_preempted(), remove prefix "_" and also in order to
avoid duplication name with common API in future.
4. Remove static variable u8 preempted and macro KVM_VCPU_PREEMPTED is
used directly.
5. Move definition of vcpu_is_preempted() from file spinlock.h to
qspinlock.h, since CONFIG_PARAVIRT is used in qspinlock.h already.
6. Add CONFIG_SMP checking with vcpu_is_preempted() to solve compile
issue reported by LKP if CONFIG_SMP is disabled.
7. Add static key virt_preempt_key with vcpu_is_preempted(), remove
mp_ops.vcpu_is_preempted method.
---
Bibo Mao (3):
LoongArch: KVM: Add paravirt preempt feature in hypervisor side
LoongArch: Add paravirt support with vcpu_is_preempted() in guest side
LoongArch: Add paravirt preempt print prompt
arch/loongarch/include/asm/kvm_host.h | 2 +
arch/loongarch/include/asm/kvm_para.h | 4 +-
arch/loongarch/include/asm/qspinlock.h | 5 ++
arch/loongarch/include/uapi/asm/kvm.h | 1 +
arch/loongarch/include/uapi/asm/kvm_para.h | 1 +
arch/loongarch/kernel/paravirt.c | 24 +++++++++-
arch/loongarch/kvm/vcpu.c | 53 +++++++++++++++++++++-
arch/loongarch/kvm/vm.c | 5 +-
8 files changed, 91 insertions(+), 4 deletions(-)
base-commit: ac3fd01e4c1efce8f2c054cdeb2ddd2fc0fb150d
--
2.39.3
Powered by blists - more mailing lists