From: Sean Christopherson <seanjc@google.com>
To: Yosry Ahmed <yosry@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 11/12] KVM: selftests: Support running stress save+restore and #PF test in L2
Date: Tue, 28 Jul 2026 07:43:49 -0700 [thread overview]
Message-ID: <amjAJQ1VZIcoefYg@google.com> (raw)
In-Reply-To: <20260727235228.1007324-12-yosry@kernel.org>
On Mon, Jul 27, 2026, Yosry Ahmed wrote:
> Extend the stress test to allow running the access+#PF code in L2
> instead of L1 by adding proper L1 guest code to bootstrap L2. By
> default, the test runs in L2 after running in L1 if nested is supported.
>
> Assisted-by: Gemini:gemini-3.1-pro
> Signed-off-by: Yosry Ahmed <yosry@kernel.org>
> ---
> .../kvm/x86/save_restore_pf_stress_test.c | 61 ++++++++++++++++++-
> 1 file changed, 58 insertions(+), 3 deletions(-)
>
> diff --git a/tools/testing/selftests/kvm/x86/save_restore_pf_stress_test.c b/tools/testing/selftests/kvm/x86/save_restore_pf_stress_test.c
> index 664ed280b2e76..0e5ddeb5af444 100644
> --- a/tools/testing/selftests/kvm/x86/save_restore_pf_stress_test.c
> +++ b/tools/testing/selftests/kvm/x86/save_restore_pf_stress_test.c
> @@ -8,10 +8,13 @@
> #include <pthread.h>
> #include <signal.h>
> #include <unistd.h>
> +#include <getopt.h>
>
> #include "test_util.h"
> #include "kvm_util.h"
> #include "processor.h"
> +#include "svm_util.h"
> +#include "vmx.h"
>
> #define NR_ITERATIONS 500
>
> @@ -81,6 +84,36 @@ static void guest_access_memory(void *arg)
> }
> }
>
> +static void l1_svm_code(struct svm_test_data *svm)
> +{
> + generic_svm_setup(svm, guest_access_memory);
> + run_guest(svm->vmcb, svm->vmcb_gpa);
> + GUEST_ASSERT(false);
> +}
> +
> +static void l1_vmx_code(struct vmx_pages *vmx)
> +{
> + GUEST_ASSERT(prepare_for_vmx_operation(vmx));
> + GUEST_ASSERT(load_vmcs(vmx));
> + prepare_vmcs(vmx, guest_access_memory);
> +
> + /* Ignore any #PF */
This comment is rather ambiguous, especially when the #UD interception comes
along, because unless the reader is reading carefully and sees the PFEC_MASK
and PFEC_MATCH logic below, it's quite easy to read this as "intercept #PF to
ignore them".
I don't see any reason to write the code this way. Yeah yeah, it's the SDM's
suggested way to ignore #PFs, but IMO that's unnecessarily convoluted. The more
obvious way is to leave all fields '0'.
In other words, just delete this entire block of code and rely on the default
VMX allocation logic to disable interception of all exceptions.
Oh, damnit. Argh. I see why you need this. init_vmcs_control_fields() is buggy
and actually configures #PF for interception. Apparently Paolo didn't read the
"If there is inequality, the meaning of that bit is reversed (for example, a VM
exit occurs if that bit is clear)." part :-D
So, let's fix that in a prep patch (AFAICT, no existing tests cares about #PF
interception) so that this test doesn't have to carry confusing code, and because
intercpeting #PF but nothing else by default is bound to cause problems.
diff --git tools/testing/selftests/kvm/lib/x86/vmx.c tools/testing/selftests/kvm/lib/x86/vmx.c
index cd09c9de4485..089e1a8af53f 100644
--- tools/testing/selftests/kvm/lib/x86/vmx.c
+++ tools/testing/selftests/kvm/lib/x86/vmx.c
@@ -232,7 +232,7 @@ static inline void init_vmcs_control_fields(struct vmx_pages *vmx)
vmwrite(EXCEPTION_BITMAP, 0);
vmwrite(PAGE_FAULT_ERROR_CODE_MASK, 0);
- vmwrite(PAGE_FAULT_ERROR_CODE_MATCH, -1); /* Never match */
+ vmwrite(PAGE_FAULT_ERROR_CODE_MATCH, 0);
vmwrite(CR3_TARGET_COUNT, 0);
vmwrite(VM_EXIT_CONTROLS, rdmsr(MSR_IA32_VMX_EXIT_CTLS) |
VM_EXIT_HOST_ADDR_SPACE_SIZE); /* 64-bit host */
> + GUEST_ASSERT(!vmwrite(EXCEPTION_BITMAP, BIT(PF_VECTOR)));
> + GUEST_ASSERT(!vmwrite(PAGE_FAULT_ERROR_CODE_MASK, 0));
> + GUEST_ASSERT(!vmwrite(PAGE_FAULT_ERROR_CODE_MATCH, -1));
> +
> + GUEST_ASSERT(!vmlaunch());
> + GUEST_ASSERT(false);
> +}
next prev parent reply other threads:[~2026-07-28 14:43 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-27 23:52 [PATCH v4 00/12] KVM: selftests: Stress save+restore and #PF (ft. nested) Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 01/12] KVM: selftests: Use __stringify() instead of custom XSTR() macros Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 02/12] KVM: selftests: Fix RAX and RFLAGS VMCB offsets when running L2 Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 03/12] KVM: selftests: Rework GPR registers switching for SVM (and fix offsets) Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 04/12] KVM: selftests: Handle rflags save/restore for SVM in guest_regs Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 05/12] KVM: selftests: Reuse GPR switching logic for nVMX Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 06/12] KVM: selftests: Drop HORRIFIC_L2_UCALL_CLOBBER_HACK Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 07/12] KVM: selftests: Add a blank line before logging assertion failures Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 08/12] KVM: selftests: Expose PTE masks to guests as part of an MMU Yosry Ahmed
2026-07-27 23:52 ` [PATCH v4 09/12] KVM: selftests: Add basic stress test for save+restore and #PF handling Yosry Ahmed
2026-07-28 14:53 ` Sean Christopherson
2026-07-27 23:52 ` [PATCH v4 10/12] KVM: selftests: Trigger save+restore randomly in the #PF stress test Yosry Ahmed
2026-07-28 14:58 ` Sean Christopherson
2026-07-27 23:52 ` [PATCH v4 11/12] KVM: selftests: Support running stress save+restore and #PF test in L2 Yosry Ahmed
2026-07-28 14:43 ` Sean Christopherson [this message]
2026-07-27 23:52 ` [PATCH v4 12/12] KVM: selftests: Trigger L2->L1 exits stress save+restore and #PF test Yosry Ahmed
2026-07-28 15:07 ` [PATCH v4 00/12] KVM: selftests: Stress save+restore and #PF (ft. nested) Sean Christopherson
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=amjAJQ1VZIcoefYg@google.com \
--to=seanjc@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=yosry@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox