From: Xiaoyao Li <xiaoyao.li@intel.com>
To: Manali Shukla <manali.shukla@amd.com>,
kvm@vger.kernel.org, linux-kselftest@vger.kernel.org
Cc: seanjc@google.com, pbonzini@redhat.com, nikunj@amd.com,
thomas.lendacky@amd.com, bp@alien8.de
Subject: Re: [PATCH v4 3/5] KVM: SVM: Enable Bus lock threshold exit
Date: Wed, 16 Apr 2025 14:00:09 +0800 [thread overview]
Message-ID: <b03f3593-e56b-4a98-8ddd-e54fe7885c81@intel.com> (raw)
In-Reply-To: <20250324130248.126036-4-manali.shukla@amd.com>
On 3/24/2025 9:02 PM, Manali Shukla wrote:
> From: Nikunj A Dadhania <nikunj@amd.com>
>
> Virtual machines can exploit bus locks to degrade the performance of
> the system. Bus locks can be caused by Non-WB(Write back) and
> misaligned locked RMW (Read-modify-Write) instructions and require
> systemwide synchronization among all processors which can result into
> significant performance penalties.
>
> To address this issue, the Bus Lock Threshold feature is introduced to
> provide ability to hypervisor to restrict guests' capability of
> initiating mulitple buslocks, thereby preventing system slowdowns.
>
> Support for the buslock threshold is indicated via CPUID function
> 0x8000000A_EDX[29].
>
> On the processors that support the Bus Lock Threshold feature, the
> VMCB provides a Bus Lock Threshold enable bit and an unsigned 16-bit
> Bus Lock threshold count.
>
> VMCB intercept bit
> VMCB Offset Bits Function
> 14h 5 Intercept bus lock operations
>
> Bus lock threshold count
> VMCB Offset Bits Function
> 120h 15:0 Bus lock counter
>
> When a VMRUN instruction is executed, the bus lock threshold count is
> loaded into an internal count register. Before the processor executes
> a bus lock in the guest, it checks the value of this register:
>
> - If the value is greater than '0', the processor successfully
> executes the bus lock and decrements the count.
>
> - If the value is '0', the bus lock is not executed, and a #VMEXIT to
> the VMM is taken.
>
> The bus lock threshold #VMEXIT is reported to the VMM with the VMEXIT
> code A5h, SVM_EXIT_BUS_LOCK.
>
> Signed-off-by: Nikunj A Dadhania <nikunj@amd.com>
> Co-developed-by: Manali Shukla <manali.shukla@amd.com>
> Signed-off-by: Manali Shukla <manali.shukla@amd.com>
> ---
> arch/x86/include/asm/svm.h | 5 ++++-
> arch/x86/include/uapi/asm/svm.h | 2 ++
> arch/x86/kvm/svm/svm.c | 8 ++++++++
> 3 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h
> index 9b7fa99ae951..9dc54da1835a 100644
> --- a/arch/x86/include/asm/svm.h
> +++ b/arch/x86/include/asm/svm.h
> @@ -116,6 +116,7 @@ enum {
> INTERCEPT_INVPCID,
> INTERCEPT_MCOMMIT,
> INTERCEPT_TLBSYNC,
> + INTERCEPT_BUSLOCK,
> INTERCEPT_IDLE_HLT = 166,
> };
>
> @@ -159,7 +160,9 @@ struct __attribute__ ((__packed__)) vmcb_control_area {
> u64 avic_physical_id; /* Offset 0xf8 */
> u8 reserved_7[8];
> u64 vmsa_pa; /* Used for an SEV-ES guest */
> - u8 reserved_8[720];
> + u8 reserved_8[16];
> + u16 bus_lock_counter; /* Offset 0x120 */
> + u8 reserved_9[702];
> /*
> * Offset 0x3e0, 32 bytes reserved
> * for use by hypervisor/software.
> diff --git a/arch/x86/include/uapi/asm/svm.h b/arch/x86/include/uapi/asm/svm.h
> index ec1321248dac..9c640a521a67 100644
> --- a/arch/x86/include/uapi/asm/svm.h
> +++ b/arch/x86/include/uapi/asm/svm.h
> @@ -95,6 +95,7 @@
> #define SVM_EXIT_CR14_WRITE_TRAP 0x09e
> #define SVM_EXIT_CR15_WRITE_TRAP 0x09f
> #define SVM_EXIT_INVPCID 0x0a2
> +#define SVM_EXIT_BUS_LOCK 0x0a5
> #define SVM_EXIT_IDLE_HLT 0x0a6
> #define SVM_EXIT_NPF 0x400
> #define SVM_EXIT_AVIC_INCOMPLETE_IPI 0x401
> @@ -225,6 +226,7 @@
> { SVM_EXIT_CR4_WRITE_TRAP, "write_cr4_trap" }, \
> { SVM_EXIT_CR8_WRITE_TRAP, "write_cr8_trap" }, \
> { SVM_EXIT_INVPCID, "invpcid" }, \
> + { SVM_EXIT_BUS_LOCK, "buslock" }, \
> { SVM_EXIT_IDLE_HLT, "idle-halt" }, \
> { SVM_EXIT_NPF, "npf" }, \
> { SVM_EXIT_AVIC_INCOMPLETE_IPI, "avic_incomplete_ipi" }, \
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index 8abeab91d329..244e099e7262 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -1375,6 +1375,9 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
> svm->vmcb->control.int_ctl |= V_GIF_ENABLE_MASK;
> }
>
> + if (vcpu->kvm->arch.bus_lock_detection_enabled)
> + svm_set_intercept(svm, INTERCEPT_BUSLOCK);
> +
> if (sev_guest(vcpu->kvm))
> sev_init_vmcb(svm);
>
> @@ -5299,6 +5302,11 @@ static __init void svm_set_cpu_caps(void)
> kvm_cpu_cap_set(X86_FEATURE_SVME_ADDR_CHK);
> }
>
> + if (cpu_feature_enabled(X86_FEATURE_BUS_LOCK_THRESHOLD)) {
> + pr_info("Bus Lock Threshold supported\n");
It will be printed every time kvm-amd.ko module gets loaded.
I think it's for your development and debug purpose. Comparing to the
existing features in svm_set_cpu_caps(), nothing makes it special for
BUS_LOCK_THRESHOLD to require a kernel message. So I think we can just
remove it.
> + kvm_caps.has_bus_lock_exit = true;
Besides, this patch doesn't ensure the bisectability. It allows
userspace to enable KVM_BUS_LOCK_DETECTION_EXIT and set intercept of
INTERCEPT_BUSLOCK but without providing the handler.
So either move next patch before it or just merge them.
> + }
> +
> /* CPUID 0x80000008 */
> if (boot_cpu_has(X86_FEATURE_LS_CFG_SSBD) ||
> boot_cpu_has(X86_FEATURE_AMD_SSBD))
next prev parent reply other threads:[~2025-04-16 6:00 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-24 13:02 [PATCH v4 0/5] Add support for the Bus Lock Threshold Manali Shukla
2025-03-24 13:02 ` [PATCH v4 1/5] KVM: x86: Preparatory patch to move linear_rip out of kvm_pio_request Manali Shukla
2025-04-23 15:22 ` Sean Christopherson
2025-03-24 13:02 ` [PATCH v4 2/5] x86/cpufeatures: Add CPUID feature bit for the Bus Lock Threshold Manali Shukla
2025-03-24 21:56 ` Borislav Petkov
2025-04-09 6:00 ` Manali Shukla
2025-04-09 9:21 ` Borislav Petkov
2025-04-10 23:25 ` Sean Christopherson
2025-04-23 5:58 ` Manali Shukla
2025-03-24 13:02 ` [PATCH v4 3/5] KVM: SVM: Enable Bus lock threshold exit Manali Shukla
2025-04-16 6:00 ` Xiaoyao Li [this message]
2025-04-23 6:15 ` Manali Shukla
2025-04-23 15:29 ` Sean Christopherson
2025-04-30 11:15 ` Manali Shukla
2025-03-24 13:02 ` [PATCH v4 4/5] KVM: SVM: Add support for KVM_CAP_X86_BUS_LOCK_EXIT on SVM CPUs Manali Shukla
2025-04-16 6:14 ` Xiaoyao Li
2025-04-23 11:26 ` Manali Shukla
2025-04-23 15:30 ` Sean Christopherson
2025-04-30 11:18 ` Manali Shukla
2025-04-23 15:44 ` Sean Christopherson
2025-04-30 11:30 ` Manali Shukla
2025-03-24 13:02 ` [PATCH v4 5/5] KVM: selftests: Add bus lock exit test Manali Shukla
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b03f3593-e56b-4a98-8ddd-e54fe7885c81@intel.com \
--to=xiaoyao.li@intel.com \
--cc=bp@alien8.de \
--cc=kvm@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=manali.shukla@amd.com \
--cc=nikunj@amd.com \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=thomas.lendacky@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.