From: Kechen Lu <kechenl@nvidia.com>
To: <kvm@vger.kernel.org>, <seanjc@google.com>, <pbonzini@redhat.com>
Cc: <chao.gao@intel.com>, <shaoqin.huang@intel.com>,
<vkuznets@redhat.com>, <kechenl@nvidia.com>,
<linux-kernel@vger.kernel.org>
Subject: [RFC PATCH v5 4/6] KVM: x86: Let userspace re-enable previously disabled exits
Date: Fri, 13 Jan 2023 22:01:12 +0000 [thread overview]
Message-ID: <20230113220114.2437-5-kechenl@nvidia.com> (raw)
In-Reply-To: <20230113220114.2437-1-kechenl@nvidia.com>
From: Sean Christopherson <seanjc@google.com>
Add an OVERRIDE flag to KVM_CAP_X86_DISABLE_EXITS allow userspace to
re-enable exits and/or override previous settings. There's no real use
case for the the per-VM ioctl, but a future per-vCPU variant wants to let
userspace toggle interception while the vCPU is running; add the OVERRIDE
functionality now to provide consistent between between the per-VM and
per-vCPU variants.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
Documentation/virt/kvm/api.rst | 5 +++++
arch/x86/kvm/x86.c | 32 ++++++++++++++++++++++++--------
include/uapi/linux/kvm.h | 4 +++-
3 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
index fb0fcc566d5a..3850202942d0 100644
--- a/Documentation/virt/kvm/api.rst
+++ b/Documentation/virt/kvm/api.rst
@@ -7095,6 +7095,7 @@ Valid bits in args[0] are::
#define KVM_X86_DISABLE_EXITS_HLT (1 << 1)
#define KVM_X86_DISABLE_EXITS_PAUSE (1 << 2)
#define KVM_X86_DISABLE_EXITS_CSTATE (1 << 3)
+ #define KVM_X86_DISABLE_EXITS_OVERRIDE (1ull << 63)
Enabling this capability on a VM provides userspace with a way to no
longer intercept some instructions for improved latency in some
@@ -7103,6 +7104,10 @@ physical CPUs. More bits can be added in the future; userspace can
just pass the KVM_CHECK_EXTENSION result to KVM_ENABLE_CAP to disable
all such vmexits.
+By default, this capability only disables exits. To re-enable an exit, or to
+override previous settings, userspace can set KVM_X86_DISABLE_EXITS_OVERRIDE,
+in which case KVM will enable/disable according to the mask (a '1' == disable).
+
Do not enable KVM_FEATURE_PV_UNHALT if you disable HLT exits.
7.14 KVM_CAP_S390_HPAGE_1M
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 60caa3fd40e5..3ea5f12536a0 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5484,6 +5484,28 @@ static int kvm_vcpu_ioctl_device_attr(struct kvm_vcpu *vcpu,
return r;
}
+
+#define kvm_ioctl_disable_exits(a, mask) \
+({ \
+ if (!kvm_can_mwait_in_guest()) \
+ (mask) &= KVM_X86_DISABLE_EXITS_MWAIT; \
+ if ((mask) & KVM_X86_DISABLE_EXITS_OVERRIDE) { \
+ (a).mwait_in_guest = (mask) & KVM_X86_DISABLE_EXITS_MWAIT; \
+ (a).hlt_in_guest = (mask) & KVM_X86_DISABLE_EXITS_HLT; \
+ (a).pause_in_guest = (mask) & KVM_X86_DISABLE_EXITS_PAUSE; \
+ (a).cstate_in_guest = (mask) & KVM_X86_DISABLE_EXITS_CSTATE; \
+ } else { \
+ if ((mask) & KVM_X86_DISABLE_EXITS_MWAIT) \
+ (a).mwait_in_guest = true; \
+ if ((mask) & KVM_X86_DISABLE_EXITS_HLT) \
+ (a).hlt_in_guest = true; \
+ if ((mask) & KVM_X86_DISABLE_EXITS_PAUSE) \
+ (a).pause_in_guest = true; \
+ if ((mask) & KVM_X86_DISABLE_EXITS_CSTATE) \
+ (a).cstate_in_guest = true; \
+ } \
+})
+
static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
struct kvm_enable_cap *cap)
{
@@ -6238,14 +6260,8 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
if (kvm->created_vcpus)
goto disable_exits_unlock;
- if (cap->args[0] & KVM_X86_DISABLE_EXITS_MWAIT)
- kvm->arch.mwait_in_guest = true;
- if (cap->args[0] & KVM_X86_DISABLE_EXITS_HLT)
- kvm->arch.hlt_in_guest = true;
- if (cap->args[0] & KVM_X86_DISABLE_EXITS_PAUSE)
- kvm->arch.pause_in_guest = true;
- if (cap->args[0] & KVM_X86_DISABLE_EXITS_CSTATE)
- kvm->arch.cstate_in_guest = true;
+ kvm_ioctl_disable_exits(kvm->arch, cap->args[0]);
+
r = 0;
disable_exits_unlock:
mutex_unlock(&kvm->lock);
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index 55155e262646..12ea7dd80471 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -823,10 +823,12 @@ struct kvm_ioeventfd {
#define KVM_X86_DISABLE_EXITS_HLT (1 << 1)
#define KVM_X86_DISABLE_EXITS_PAUSE (1 << 2)
#define KVM_X86_DISABLE_EXITS_CSTATE (1 << 3)
+#define KVM_X86_DISABLE_EXITS_OVERRIDE (1ull << 63)
#define KVM_X86_DISABLE_VALID_EXITS (KVM_X86_DISABLE_EXITS_MWAIT | \
KVM_X86_DISABLE_EXITS_HLT | \
KVM_X86_DISABLE_EXITS_PAUSE | \
- KVM_X86_DISABLE_EXITS_CSTATE)
+ KVM_X86_DISABLE_EXITS_CSTATE | \
+ KVM_X86_DISABLE_EXITS_OVERRIDE)
/* for KVM_ENABLE_CAP */
struct kvm_enable_cap {
--
2.34.1
next prev parent reply other threads:[~2023-01-13 22:03 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-13 22:01 [RFC PATCH v5 0/6] KVM: x86: add per-vCPU exits disable capability Kechen Lu
2023-01-13 22:01 ` [RFC PATCH v5 1/6] KVM: x86: only allow exits disable before vCPUs created Kechen Lu
2023-01-13 22:01 ` [RFC PATCH v5 2/6] KVM: x86: Move *_in_guest power management flags to vCPU scope Kechen Lu
2023-01-13 22:01 ` [RFC PATCH v5 3/6] KVM: x86: Reject disabling of MWAIT interception when not allowed Kechen Lu
2023-01-13 22:01 ` Kechen Lu [this message]
2023-01-13 22:01 ` [RFC PATCH v5 5/6] KVM: x86: add vCPU scoped toggling for disabled exits Kechen Lu
2023-01-13 22:01 ` [RFC PATCH v5 6/6] KVM: selftests: Add tests for VM and vCPU cap KVM_CAP_X86_DISABLE_EXITS Kechen Lu
2023-01-18 20:03 ` Zhi Wang
2023-01-18 20:26 ` Kechen Lu
2023-01-18 20:43 ` Kechen Lu
2023-01-18 8:30 ` [RFC PATCH v5 0/6] KVM: x86: add per-vCPU exits disable capability Zhi Wang
2023-01-18 13:32 ` Zhi Wang
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=20230113220114.2437-5-kechenl@nvidia.com \
--to=kechenl@nvidia.com \
--cc=chao.gao@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=shaoqin.huang@intel.com \
--cc=vkuznets@redhat.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.