* [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.