* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox