All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/4] KVM: s390: Implement KVM_PRE_FAULT_MEMORY
@ 2026-05-20 15:17 Claudio Imbrenda
  2026-05-20 15:17 ` [PATCH v1 1/4] " Claudio Imbrenda
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Claudio Imbrenda @ 2026-05-20 15:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, borntraeger, frankja, david, seiden, nrb,
	schlameuss, gra, pbonzini, seanjc, yan.y.zhao, isaku.yamahata

Implement KVM_PRE_FAULT_MEMORY on s390, and update documentation and
selftests accordingly.

Faulted-in pages will be marked as accessed, unlike x86, otherwise they
will trigger a minor fault when accessed. Avoiding such faults is one of
the points of KVM_PRE_FAULT_MEMORY.

CCing x86 people due to changes in the documentation and the selftests

Claudio Imbrenda (4):
  KVM: s390: Implement KVM_PRE_FAULT_MEMORY
  KVM: s390: Update KVM_PRE_FAULT_MEMORY API documentation
  KVM: selftests: Fix pre_fault_memory_test to run on s390
  KVM: selftests: Enable pre_fault_memory_test for s390

 Documentation/virt/kvm/api.rst                |  5 ++-
 arch/s390/kvm/Kconfig                         |  1 +
 arch/s390/kvm/kvm-s390.c                      | 41 +++++++++++++++++++
 tools/testing/selftests/kvm/Makefile.kvm      |  1 +
 .../selftests/kvm/pre_fault_memory_test.c     |  7 ++--
 5 files changed, 50 insertions(+), 5 deletions(-)

-- 
2.54.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v1 1/4] KVM: s390: Implement KVM_PRE_FAULT_MEMORY
  2026-05-20 15:17 [PATCH v1 0/4] KVM: s390: Implement KVM_PRE_FAULT_MEMORY Claudio Imbrenda
@ 2026-05-20 15:17 ` Claudio Imbrenda
  2026-05-20 15:17 ` [PATCH v1 2/4] KVM: s390: Update KVM_PRE_FAULT_MEMORY API documentation Claudio Imbrenda
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Claudio Imbrenda @ 2026-05-20 15:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, borntraeger, frankja, david, seiden, nrb,
	schlameuss, gra, pbonzini, seanjc, yan.y.zhao, isaku.yamahata

Implement and enable the KVM_PRE_FAULT_MEMORY ioctl for s390.

Faulted-in pages will be marked as accessed, unlike x86, otherwise they
will trigger a minor fault when accessed. Avoiding such faults is one of
the points of KVM_PRE_FAULT_MEMORY.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
 arch/s390/kvm/Kconfig    |  1 +
 arch/s390/kvm/kvm-s390.c | 41 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig
index 5b835bc6a194..8d3ee17a1bcb 100644
--- a/arch/s390/kvm/Kconfig
+++ b/arch/s390/kvm/Kconfig
@@ -30,6 +30,7 @@ config KVM
 	select KVM_VFIO
 	select VIRT_XFER_TO_GUEST_WORK
 	select KVM_MMU_LOCKLESS_AGING
+	select KVM_GENERIC_PRE_FAULT_MEMORY
 	help
 	  Support hosting paravirtualized guest machines using the SIE
 	  virtualization capability on the mainframe. This should work
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index e09960c2e6ed..dd220f3d6e94 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -630,6 +630,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 	case KVM_CAP_S390_USER_OPEREXEC:
 	case KVM_CAP_S390_KEYOP:
 	case KVM_CAP_S390_VSIE_ESAMODE:
+	case KVM_CAP_PRE_FAULT_MEMORY:
 		r = 1;
 		break;
 	case KVM_CAP_SET_GUEST_DEBUG2:
@@ -5736,6 +5737,46 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
 	return;
 }
 
+/**
+ * kvm_arch_vcpu_pre_fault_memory() -- pre-fault and link gmap dat tables
+ * @vcpu: the vcpu that shall appear to have generated the fault-in.
+ * @range: the range that needs to be faulted in.
+ *
+ * The given range is faulted in and the corresponding gmap page tables are
+ * created, as if the given vCPU had performed a read operation. If the range
+ * ends outside of a memslot, only the part inside the memslot is faulted in.
+ * If the range starts outside any memslots, an error is returned. An error is
+ * also returned for UCONTROL VMs, which should instead use the
+ * KVM_S390_VCPU_FAULT ioctl.
+ *
+ * Return:
+ * * %-ENOENT if the range lies outside of a memslot.
+ * * %-EINVAL in case of invalid state (for example if the VM is UCONTROL)
+ * * %-EIO if other errors happen while faulting-in the page (considered a
+ *   bug, will trigger a warning in the caller).
+ * * other error codes < 0 in case of other errors.
+ * * otherwise a number > 0 of bytes that have been faulted in successfully.
+ */
+long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_memory *range)
+{
+	unsigned long i;
+	int rc;
+
+	if (kvm_is_ucontrol(vcpu->kvm))
+		return -EINVAL;
+
+	for (i = 0; i < range->size; i += PAGE_SIZE) {
+		rc = kvm_s390_faultin_gfn_simple(vcpu, NULL, gpa_to_gfn(range->gpa + i), false);
+		if (rc == PGM_ADDRESSING)
+			return i ? i : -ENOENT;
+		if (rc == -EINTR)
+			return i ? i : -EINTR;
+		if (rc)
+			return -EIO;
+	}
+	return i;
+}
+
 /**
  * kvm_test_age_gfn() - test young
  * @kvm: the kvm instance
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v1 2/4] KVM: s390: Update KVM_PRE_FAULT_MEMORY API documentation
  2026-05-20 15:17 [PATCH v1 0/4] KVM: s390: Implement KVM_PRE_FAULT_MEMORY Claudio Imbrenda
  2026-05-20 15:17 ` [PATCH v1 1/4] " Claudio Imbrenda
@ 2026-05-20 15:17 ` Claudio Imbrenda
  2026-05-20 15:17 ` [PATCH v1 3/4] KVM: selftests: Fix pre_fault_memory_test to run on s390 Claudio Imbrenda
  2026-05-20 15:17 ` [PATCH v1 4/4] KVM: selftests: Enable pre_fault_memory_test for s390 Claudio Imbrenda
  3 siblings, 0 replies; 7+ messages in thread
From: Claudio Imbrenda @ 2026-05-20 15:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, borntraeger, frankja, david, seiden, nrb,
	schlameuss, gra, pbonzini, seanjc, yan.y.zhao, isaku.yamahata

Update the API documentation for KVM_PRE_FAULT_MEMORY to account for
its s390 implementation.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
 Documentation/virt/kvm/api.rst | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
index 52bbbb553ce1..e7998feaa940 100644
--- a/Documentation/virt/kvm/api.rst
+++ b/Documentation/virt/kvm/api.rst
@@ -6471,7 +6471,8 @@ Errors:
 
   ========== ===============================================================
   EINVAL     The specified `gpa` and `size` were invalid (e.g. not
-             page aligned, causes an overflow, or size is zero).
+             page aligned, causes an overflow, or size is zero), or the VM
+             is UCONTROL (s390).
   ENOENT     The specified `gpa` is outside defined memslots.
   EINTR      An unmasked signal is pending and no page was processed.
   EFAULT     The parameter address was invalid.
@@ -6494,7 +6495,7 @@ Errors:
 KVM_PRE_FAULT_MEMORY populates KVM's stage-2 page tables used to map memory
 for the current vCPU state.  KVM maps memory as if the vCPU generated a
 stage-2 read page fault, e.g. faults in memory as needed, but doesn't break
-CoW.  However, KVM does not mark any newly created stage-2 PTE as Accessed.
+CoW.  On x86, KVM does not mark any newly created stage-2 PTE as Accessed.
 
 In the case of confidential VM types where there is an initial set up of
 private guest memory before the guest is 'finalized'/measured, this ioctl
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v1 3/4] KVM: selftests: Fix pre_fault_memory_test to run on s390
  2026-05-20 15:17 [PATCH v1 0/4] KVM: s390: Implement KVM_PRE_FAULT_MEMORY Claudio Imbrenda
  2026-05-20 15:17 ` [PATCH v1 1/4] " Claudio Imbrenda
  2026-05-20 15:17 ` [PATCH v1 2/4] KVM: s390: Update KVM_PRE_FAULT_MEMORY API documentation Claudio Imbrenda
@ 2026-05-20 15:17 ` Claudio Imbrenda
  2026-05-20 15:27   ` Sean Christopherson
  2026-05-20 15:17 ` [PATCH v1 4/4] KVM: selftests: Enable pre_fault_memory_test for s390 Claudio Imbrenda
  3 siblings, 1 reply; 7+ messages in thread
From: Claudio Imbrenda @ 2026-05-20 15:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, borntraeger, frankja, david, seiden, nrb,
	schlameuss, gra, pbonzini, seanjc, yan.y.zhao, isaku.yamahata

Add a missing #include <ucall_common.h> which is needed and otherwise
not included on s390.

Fence the assertion  vcpu->run->exit_reason == KVM_EXIT_IO  so that it
is only checked on x86. On s390 the UCALL will return with a different
code.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
 tools/testing/selftests/kvm/pre_fault_memory_test.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/testing/selftests/kvm/pre_fault_memory_test.c
index fcb57fd034e6..42794892e902 100644
--- a/tools/testing/selftests/kvm/pre_fault_memory_test.c
+++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c
@@ -11,6 +11,7 @@
 #include <kvm_util.h>
 #include <processor.h>
 #include <pthread.h>
+#include <ucall_common.h>
 
 /* Arbitrarily chosen values */
 #define TEST_SIZE		(SZ_2M + PAGE_SIZE)
@@ -167,7 +168,6 @@ static void __test_pre_fault_memory(unsigned long vm_type, bool private)
 		.type = vm_type,
 	};
 	struct kvm_vcpu *vcpu;
-	struct kvm_run *run;
 	struct kvm_vm *vm;
 	struct ucall uc;
 
@@ -193,10 +193,11 @@ static void __test_pre_fault_memory(unsigned long vm_type, bool private)
 	vcpu_args_set(vcpu, 1, gva);
 	vcpu_run(vcpu);
 
-	run = vcpu->run;
-	TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
+#ifdef __x86_64__
+	TEST_ASSERT(vcpu->run->exit_reason == KVM_EXIT_IO,
 		    "Wanted KVM_EXIT_IO, got exit reason: %u (%s)",
 		    run->exit_reason, exit_reason_str(run->exit_reason));
+#endif
 
 	switch (get_ucall(vcpu, &uc)) {
 	case UCALL_ABORT:
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v1 4/4] KVM: selftests: Enable pre_fault_memory_test for s390
  2026-05-20 15:17 [PATCH v1 0/4] KVM: s390: Implement KVM_PRE_FAULT_MEMORY Claudio Imbrenda
                   ` (2 preceding siblings ...)
  2026-05-20 15:17 ` [PATCH v1 3/4] KVM: selftests: Fix pre_fault_memory_test to run on s390 Claudio Imbrenda
@ 2026-05-20 15:17 ` Claudio Imbrenda
  3 siblings, 0 replies; 7+ messages in thread
From: Claudio Imbrenda @ 2026-05-20 15:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, borntraeger, frankja, david, seiden, nrb,
	schlameuss, gra, pbonzini, seanjc, yan.y.zhao, isaku.yamahata

Enable the pre_fault_memory_test to run on s390.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
 tools/testing/selftests/kvm/Makefile.kvm | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selftests/kvm/Makefile.kvm
index 9118a5a51b89..fff939db89cd 100644
--- a/tools/testing/selftests/kvm/Makefile.kvm
+++ b/tools/testing/selftests/kvm/Makefile.kvm
@@ -210,6 +210,7 @@ TEST_GEN_PROGS_s390 += s390/keyop
 TEST_GEN_PROGS_s390 += rseq_test
 TEST_GEN_PROGS_s390 += s390/irq_routing
 TEST_GEN_PROGS_s390 += mmu_stress_test
+TEST_GEN_PROGS_s390 += pre_fault_memory_test
 
 TEST_GEN_PROGS_riscv = $(TEST_GEN_PROGS_COMMON)
 TEST_GEN_PROGS_riscv += riscv/sbi_pmu_test
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 3/4] KVM: selftests: Fix pre_fault_memory_test to run on s390
  2026-05-20 15:17 ` [PATCH v1 3/4] KVM: selftests: Fix pre_fault_memory_test to run on s390 Claudio Imbrenda
@ 2026-05-20 15:27   ` Sean Christopherson
  2026-05-20 16:20     ` Claudio Imbrenda
  0 siblings, 1 reply; 7+ messages in thread
From: Sean Christopherson @ 2026-05-20 15:27 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: linux-kernel, kvm, linux-s390, borntraeger, frankja, david,
	seiden, nrb, schlameuss, gra, pbonzini, yan.y.zhao,
	isaku.yamahata

On Wed, May 20, 2026, Claudio Imbrenda wrote:
> Add a missing #include <ucall_common.h> which is needed and otherwise
> not included on s390.
> 
> Fence the assertion  vcpu->run->exit_reason == KVM_EXIT_IO  so that it
> is only checked on x86. On s390 the UCALL will return with a different
> code.
> 
> Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
> ---
>  tools/testing/selftests/kvm/pre_fault_memory_test.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/testing/selftests/kvm/pre_fault_memory_test.c
> index fcb57fd034e6..42794892e902 100644
> --- a/tools/testing/selftests/kvm/pre_fault_memory_test.c
> +++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c
> @@ -11,6 +11,7 @@
>  #include <kvm_util.h>
>  #include <processor.h>
>  #include <pthread.h>
> +#include <ucall_common.h>
>  
>  /* Arbitrarily chosen values */
>  #define TEST_SIZE		(SZ_2M + PAGE_SIZE)
> @@ -167,7 +168,6 @@ static void __test_pre_fault_memory(unsigned long vm_type, bool private)
>  		.type = vm_type,
>  	};
>  	struct kvm_vcpu *vcpu;
> -	struct kvm_run *run;
>  	struct kvm_vm *vm;
>  	struct ucall uc;
>  
> @@ -193,10 +193,11 @@ static void __test_pre_fault_memory(unsigned long vm_type, bool private)
>  	vcpu_args_set(vcpu, 1, gva);
>  	vcpu_run(vcpu);
>  
> -	run = vcpu->run;
> -	TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
> +#ifdef __x86_64__

I'd say just delete this assertion entirely.  It's an extra layer of paranoia to
guard against stale ucall data, but x86's ucall_arch_get_ucall() already has
sufficient guards.

> +	TEST_ASSERT(vcpu->run->exit_reason == KVM_EXIT_IO,
>  		    "Wanted KVM_EXIT_IO, got exit reason: %u (%s)",
>  		    run->exit_reason, exit_reason_str(run->exit_reason));
> +#endif
>  
>  	switch (get_ucall(vcpu, &uc)) {
>  	case UCALL_ABORT:
> -- 
> 2.54.0
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v1 3/4] KVM: selftests: Fix pre_fault_memory_test to run on s390
  2026-05-20 15:27   ` Sean Christopherson
@ 2026-05-20 16:20     ` Claudio Imbrenda
  0 siblings, 0 replies; 7+ messages in thread
From: Claudio Imbrenda @ 2026-05-20 16:20 UTC (permalink / raw)
  To: Sean Christopherson
  Cc: linux-kernel, kvm, linux-s390, borntraeger, frankja, david,
	seiden, nrb, schlameuss, gra, pbonzini, yan.y.zhao,
	isaku.yamahata

On Wed, 20 May 2026 08:27:24 -0700
Sean Christopherson <seanjc@google.com> wrote:

> On Wed, May 20, 2026, Claudio Imbrenda wrote:
> > Add a missing #include <ucall_common.h> which is needed and otherwise
> > not included on s390.
> > 
> > Fence the assertion  vcpu->run->exit_reason == KVM_EXIT_IO  so that it
> > is only checked on x86. On s390 the UCALL will return with a different
> > code.
> > 
> > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
> > ---
> >  tools/testing/selftests/kvm/pre_fault_memory_test.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> > 
> > diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/testing/selftests/kvm/pre_fault_memory_test.c
> > index fcb57fd034e6..42794892e902 100644
> > --- a/tools/testing/selftests/kvm/pre_fault_memory_test.c
> > +++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c
> > @@ -11,6 +11,7 @@
> >  #include <kvm_util.h>
> >  #include <processor.h>
> >  #include <pthread.h>
> > +#include <ucall_common.h>
> >  
> >  /* Arbitrarily chosen values */
> >  #define TEST_SIZE		(SZ_2M + PAGE_SIZE)
> > @@ -167,7 +168,6 @@ static void __test_pre_fault_memory(unsigned long vm_type, bool private)
> >  		.type = vm_type,
> >  	};
> >  	struct kvm_vcpu *vcpu;
> > -	struct kvm_run *run;
> >  	struct kvm_vm *vm;
> >  	struct ucall uc;
> >  
> > @@ -193,10 +193,11 @@ static void __test_pre_fault_memory(unsigned long vm_type, bool private)
> >  	vcpu_args_set(vcpu, 1, gva);
> >  	vcpu_run(vcpu);
> >  
> > -	run = vcpu->run;
> > -	TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
> > +#ifdef __x86_64__  
> 
> I'd say just delete this assertion entirely.  It's an extra layer of paranoia to
> guard against stale ucall data, but x86's ucall_arch_get_ucall() already has
> sufficient guards.

will do, thanks!

> 
> > +	TEST_ASSERT(vcpu->run->exit_reason == KVM_EXIT_IO,
> >  		    "Wanted KVM_EXIT_IO, got exit reason: %u (%s)",
> >  		    run->exit_reason, exit_reason_str(run->exit_reason));
> > +#endif
> >  
> >  	switch (get_ucall(vcpu, &uc)) {
> >  	case UCALL_ABORT:
> > -- 
> > 2.54.0
> >   


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-05-20 16:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-20 15:17 [PATCH v1 0/4] KVM: s390: Implement KVM_PRE_FAULT_MEMORY Claudio Imbrenda
2026-05-20 15:17 ` [PATCH v1 1/4] " Claudio Imbrenda
2026-05-20 15:17 ` [PATCH v1 2/4] KVM: s390: Update KVM_PRE_FAULT_MEMORY API documentation Claudio Imbrenda
2026-05-20 15:17 ` [PATCH v1 3/4] KVM: selftests: Fix pre_fault_memory_test to run on s390 Claudio Imbrenda
2026-05-20 15:27   ` Sean Christopherson
2026-05-20 16:20     ` Claudio Imbrenda
2026-05-20 15:17 ` [PATCH v1 4/4] KVM: selftests: Enable pre_fault_memory_test for s390 Claudio Imbrenda

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.