* [GIT PULL 00/12] KVM: s390: Changes for 7.1
@ 2026-04-13 10:46 Janosch Frank
2026-04-13 10:46 ` [GIT PULL 01/12] KVM: s390: only deliver service interrupt with payload Janosch Frank
` (12 more replies)
0 siblings, 13 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini; +Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda
Hey Paolo,
here are our changes for 7.1:
- Claudio is finishing up gmap work by allowing 4k memslots
- Eric and Hendrik added nesting ESA support
- I've fixed up LPSW/E emulation, going through next as I don't expect
us to ever hit this
There's been two conflicts because 7.0 received a number of gmap fixes.
Please pull
The following changes since commit 11439c4635edd669ae435eec308f4ab8a0804808:
Linux 7.0-rc2 (2026-03-01 15:39:31 -0800)
are available in the Git repository at:
https://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git tags/kvm-s390-next-7.1-1
for you to fetch changes up to 9b8e8aad5896d66005d29920cb1643076a20b172:
KVM: s390: ucontrol: Fix memslot handling (2026-04-07 17:20:42 +0200)
----------------------------------------------------------------
- ESA nesting support
- 4k memslots
- LPSW/E fix
----------------------------------------------------------------
Claudio Imbrenda (6):
KVM: s390: Add some useful mask macros
KVM: s390: Add alignment checks for hugepages
KVM: s390: Allow 4k granularity for memslots
KVM: selftests: Remove 1M alignment requirement for s390
KVM: s390: selftests: enable some common memory-related tests
KVM: s390: ucontrol: Fix memslot handling
Eric Farman (4):
KVM: s390: only deliver service interrupt with payload
KVM: s390: vsie: Allow non-zarch guests
KVM: s390: vsie: Disable some bits when in ESA mode
KVM: s390: vsie: Accommodate ESA prefix pages
Hendrik Brueckner (1):
KVM: s390: Add KVM capability for ESA mode guests
Janosch Frank (1):
KVM: s390: Fix lpsw/e breaking event handling
Documentation/virt/kvm/api.rst | 8 +++++
arch/s390/include/asm/kvm_host.h | 1 +
arch/s390/include/asm/kvm_host_types.h | 3 +-
arch/s390/kvm/dat.h | 5 +++
arch/s390/kvm/faultin.c | 2 +-
arch/s390/kvm/gaccess.c | 2 +-
arch/s390/kvm/gmap.c | 32 +++++++++++++++----
arch/s390/kvm/gmap.h | 3 +-
arch/s390/kvm/interrupt.c | 3 ++
arch/s390/kvm/kvm-s390.c | 28 ++++++++--------
arch/s390/kvm/kvm-s390.h | 5 ++-
arch/s390/kvm/priv.c | 8 +++--
arch/s390/kvm/vsie.c | 29 ++++++++++++++---
include/uapi/linux/kvm.h | 1 +
tools/testing/selftests/kvm/Makefile.kvm | 9 ++----
tools/testing/selftests/kvm/dirty_log_test.c | 3 --
.../testing/selftests/kvm/include/kvm_util.h | 4 ---
.../selftests/kvm/kvm_page_table_test.c | 3 --
tools/testing/selftests/kvm/lib/kvm_util.c | 9 +-----
tools/testing/selftests/kvm/lib/memstress.c | 4 ---
.../selftests/kvm/pre_fault_memory_test.c | 4 ---
.../selftests/kvm/set_memory_region_test.c | 9 +-----
22 files changed, 102 insertions(+), 73 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 16+ messages in thread
* [GIT PULL 01/12] KVM: s390: only deliver service interrupt with payload
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 02/12] KVM: s390: Fix lpsw/e breaking event handling Janosch Frank
` (11 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Eric Farman
From: Eric Farman <farman@linux.ibm.com>
Routine __inject_service() may set both the SERVICE and SERVICE_EV
pending bits, and in the case of a pure service event the corresponding
trip through __deliver_service_ev() will clear the SERVICE_EV bit only.
This necessitates an additional trip through __deliver_service() for
the other pending interrupt bit, however it is possible that the
external interrupt parameters are zero and there is nothing to be
delivered to the guest.
To avoid sending empty data to the guest, let's only write out the SCLP
data when there is something for the guest to do, otherwise bail out.
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
arch/s390/kvm/interrupt.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 18932a65ca68..dd0413387a9e 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -956,6 +956,9 @@ static int __must_check __deliver_service(struct kvm_vcpu *vcpu)
set_bit(IRQ_PEND_EXT_SERVICE, &fi->masked_irqs);
spin_unlock(&fi->lock);
+ if (!ext.ext_params)
+ return 0;
+
VCPU_EVENT(vcpu, 4, "deliver: sclp parameter 0x%x",
ext.ext_params);
vcpu->stat.deliver_service_signal++;
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 02/12] KVM: s390: Fix lpsw/e breaking event handling
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
2026-04-13 10:46 ` [GIT PULL 01/12] KVM: s390: only deliver service interrupt with payload Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 03/12] KVM: s390: vsie: Allow non-zarch guests Janosch Frank
` (10 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini; +Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda
LPSW and LPSWE need to set the gbea on completion but currently don't.
Time to fix this up.
LPSWEY was designed to not set the bear.
Fixes: 48a3e950f4cee ("KVM: s390: Add support for machine checks.")
Reported-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
arch/s390/kvm/priv.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index a3250ad83a8e..cc0553da14cb 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -714,12 +714,13 @@ int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
{
psw_t *gpsw = &vcpu->arch.sie_block->gpsw;
psw32_t new_psw;
- u64 addr;
+ u64 addr, iaddr;
int rc;
u8 ar;
vcpu->stat.instruction_lpsw++;
+ iaddr = gpsw->addr - kvm_s390_get_ilen(vcpu);
if (gpsw->mask & PSW_MASK_PSTATE)
return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
@@ -737,18 +738,20 @@ int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
gpsw->addr = new_psw.addr & ~PSW32_ADDR_AMODE;
if (!is_valid_psw(gpsw))
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
+ vcpu->arch.sie_block->gbea = iaddr;
return 0;
}
static int handle_lpswe(struct kvm_vcpu *vcpu)
{
psw_t new_psw;
- u64 addr;
+ u64 addr, iaddr;
int rc;
u8 ar;
vcpu->stat.instruction_lpswe++;
+ iaddr = vcpu->arch.sie_block->gpsw.addr - kvm_s390_get_ilen(vcpu);
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
@@ -761,6 +764,7 @@ static int handle_lpswe(struct kvm_vcpu *vcpu)
vcpu->arch.sie_block->gpsw = new_psw;
if (!is_valid_psw(&vcpu->arch.sie_block->gpsw))
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
+ vcpu->arch.sie_block->gbea = iaddr;
return 0;
}
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 03/12] KVM: s390: vsie: Allow non-zarch guests
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
2026-04-13 10:46 ` [GIT PULL 01/12] KVM: s390: only deliver service interrupt with payload Janosch Frank
2026-04-13 10:46 ` [GIT PULL 02/12] KVM: s390: Fix lpsw/e breaking event handling Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 04/12] KVM: s390: vsie: Disable some bits when in ESA mode Janosch Frank
` (9 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Eric Farman, Hendrik Brueckner
From: Eric Farman <farman@linux.ibm.com>
Linux/KVM runs in z/Architecture-only mode. Although z/Architecture
is built upon a long history of hardware refinements, any other
CPU mode is not permitted.
Allow a userspace to explicitly enable the use of ESA mode for
nested guests, otherwise usage will be rejected.
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
arch/s390/include/asm/kvm_host.h | 1 +
arch/s390/kvm/vsie.c | 8 +++++---
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 64a50f0862aa..b58faad8a7ce 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -656,6 +656,7 @@ struct kvm_arch {
int user_stsi;
int user_instr0;
int user_operexec;
+ int allow_vsie_esamode;
struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS];
wait_queue_head_t ipte_wq;
int ipte_lock_count;
diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
index d249b10044eb..aa43c6848217 100644
--- a/arch/s390/kvm/vsie.c
+++ b/arch/s390/kvm/vsie.c
@@ -125,8 +125,8 @@ static int prepare_cpuflags(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
struct kvm_s390_sie_block *scb_o = vsie_page->scb_o;
int newflags, cpuflags = atomic_read(&scb_o->cpuflags);
- /* we don't allow ESA/390 guests */
- if (!(cpuflags & CPUSTAT_ZARCH))
+ /* we don't allow ESA/390 guests unless explicitly enabled */
+ if (!(cpuflags & CPUSTAT_ZARCH) && !vcpu->kvm->arch.allow_vsie_esamode)
return set_validity_icpt(scb_s, 0x0001U);
if (cpuflags & (CPUSTAT_RRF | CPUSTAT_MCDS))
@@ -135,7 +135,9 @@ static int prepare_cpuflags(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
return set_validity_icpt(scb_s, 0x0007U);
/* intervention requests will be set later */
- newflags = CPUSTAT_ZARCH;
+ newflags = 0;
+ if (cpuflags & CPUSTAT_ZARCH)
+ newflags = CPUSTAT_ZARCH;
if (cpuflags & CPUSTAT_GED && test_kvm_facility(vcpu->kvm, 8))
newflags |= CPUSTAT_GED;
if (cpuflags & CPUSTAT_GED2 && test_kvm_facility(vcpu->kvm, 78)) {
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 04/12] KVM: s390: vsie: Disable some bits when in ESA mode
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (2 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 03/12] KVM: s390: vsie: Allow non-zarch guests Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 05/12] KVM: s390: vsie: Accommodate ESA prefix pages Janosch Frank
` (8 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Eric Farman, Hendrik Brueckner
From: Eric Farman <farman@linux.ibm.com>
In the event that a nested guest is put in ESA mode,
ensure that some bits are scrubbed from the shadow SCB.
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
arch/s390/kvm/vsie.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
index aa43c6848217..2ce406861d22 100644
--- a/arch/s390/kvm/vsie.c
+++ b/arch/s390/kvm/vsie.c
@@ -387,6 +387,17 @@ static int shadow_crycb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
return 0;
}
+static void shadow_esa(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
+{
+ struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s;
+
+ /* Ensure these bits are indeed turned off */
+ scb_s->eca &= ~ECA_VX;
+ scb_s->ecb &= ~(ECB_GS | ECB_TE);
+ scb_s->ecb3 &= ~ECB3_RI;
+ scb_s->ecd &= ~ECD_HOSTREGMGMT;
+}
+
/* shadow (round up/down) the ibc to avoid validity icpt */
static void prepare_ibc(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
{
@@ -590,6 +601,9 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
scb_s->hpid = HPID_VSIE;
scb_s->cpnc = scb_o->cpnc;
+ if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_ZARCH))
+ shadow_esa(vcpu, vsie_page);
+
prepare_ibc(vcpu, vsie_page);
rc = shadow_crycb(vcpu, vsie_page);
out:
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 05/12] KVM: s390: vsie: Accommodate ESA prefix pages
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (3 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 04/12] KVM: s390: vsie: Disable some bits when in ESA mode Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 06/12] KVM: s390: Add KVM capability for ESA mode guests Janosch Frank
` (7 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Eric Farman, Hendrik Brueckner
From: Eric Farman <farman@linux.ibm.com>
The prefix page address occupies a different number
of bits for z/Architecture versus ESA mode. Adjust the
definition to cover both, and permit an ESA mode
address within the nested codepath.
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
arch/s390/include/asm/kvm_host_types.h | 3 +--
arch/s390/kvm/kvm-s390.h | 5 ++++-
arch/s390/kvm/vsie.c | 7 ++++++-
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host_types.h b/arch/s390/include/asm/kvm_host_types.h
index 1394d3fb648f..3f50942bdfe6 100644
--- a/arch/s390/include/asm/kvm_host_types.h
+++ b/arch/s390/include/asm/kvm_host_types.h
@@ -137,8 +137,7 @@ struct mcck_volatile_info {
struct kvm_s390_sie_block {
atomic_t cpuflags; /* 0x0000 */
__u32 : 1; /* 0x0004 */
- __u32 prefix : 18;
- __u32 : 1;
+ __u32 prefix : 19;
__u32 ibc : 12;
__u8 reserved08[4]; /* 0x0008 */
#define PROG_IN_SIE (1<<0)
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index bf1d7798c1af..dc0573b7aa4b 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -122,7 +122,9 @@ static inline int kvm_is_ucontrol(struct kvm *kvm)
#endif
}
-#define GUEST_PREFIX_SHIFT 13
+#define GUEST_PREFIX_SHIFT 12
+#define GUEST_PREFIX_MASK_ZARCH 0x7fffe
+#define GUEST_PREFIX_MASK_ESA 0x7ffff
static inline u32 kvm_s390_get_prefix(struct kvm_vcpu *vcpu)
{
return vcpu->arch.sie_block->prefix << GUEST_PREFIX_SHIFT;
@@ -133,6 +135,7 @@ static inline void kvm_s390_set_prefix(struct kvm_vcpu *vcpu, u32 prefix)
VCPU_EVENT(vcpu, 3, "set prefix of cpu %03u to 0x%x", vcpu->vcpu_id,
prefix);
vcpu->arch.sie_block->prefix = prefix >> GUEST_PREFIX_SHIFT;
+ vcpu->arch.sie_block->prefix &= GUEST_PREFIX_MASK_ZARCH;
kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
kvm_make_request(KVM_REQ_REFRESH_GUEST_PREFIX, vcpu);
}
diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
index 2ce406861d22..3f43fe05afd3 100644
--- a/arch/s390/kvm/vsie.c
+++ b/arch/s390/kvm/vsie.c
@@ -479,7 +479,7 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s;
/* READ_ONCE does not work on bitfields - use a temporary variable */
const uint32_t __new_prefix = scb_o->prefix;
- const uint32_t new_prefix = READ_ONCE(__new_prefix);
+ uint32_t new_prefix = READ_ONCE(__new_prefix);
const bool wants_tx = READ_ONCE(scb_o->ecb) & ECB_TE;
bool had_tx = scb_s->ecb & ECB_TE;
unsigned long new_mso = 0;
@@ -527,6 +527,11 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
scb_s->icpua = scb_o->icpua;
+ if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_ZARCH))
+ new_prefix &= GUEST_PREFIX_MASK_ESA;
+ else
+ new_prefix &= GUEST_PREFIX_MASK_ZARCH;
+
if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_SM))
new_mso = READ_ONCE(scb_o->mso) & 0xfffffffffff00000UL;
/* if the hva of the prefix changes, we have to remap the prefix */
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 06/12] KVM: s390: Add KVM capability for ESA mode guests
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (4 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 05/12] KVM: s390: vsie: Accommodate ESA prefix pages Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 07/12] KVM: s390: Add some useful mask macros Janosch Frank
` (6 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Hendrik Brueckner, Eric Farman
From: Hendrik Brueckner <brueckner@linux.ibm.com>
Now that all the bits are properly addressed, provide a mechanism
for testing ESA mode guests in nested configurations.
Signed-off-by: Hendrik Brueckner <brueckner@linux.ibm.com>
[farman@us.ibm.com: Updated commit message]
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Eric Farman <farman@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
Documentation/virt/kvm/api.rst | 8 ++++++++
arch/s390/kvm/kvm-s390.c | 6 ++++++
include/uapi/linux/kvm.h | 1 +
3 files changed, 15 insertions(+)
diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
index 6f85e1b321dd..682ae9278943 100644
--- a/Documentation/virt/kvm/api.rst
+++ b/Documentation/virt/kvm/api.rst
@@ -9428,6 +9428,14 @@ KVM exits with the register state of either the L1 or L2 guest
depending on which executed at the time of an exit. Userspace must
take care to differentiate between these cases.
+8.47 KVM_CAP_S390_VSIE_ESAMODE
+------------------------------
+
+:Architectures: s390
+
+The presence of this capability indicates that the nested KVM guest can
+start in ESA mode.
+
9. Known KVM API problems
=========================
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index bc7d6fa66eaf..a583c0a00efd 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -629,6 +629,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
case KVM_CAP_IRQFD_RESAMPLE:
case KVM_CAP_S390_USER_OPEREXEC:
case KVM_CAP_S390_KEYOP:
+ case KVM_CAP_S390_VSIE_ESAMODE:
r = 1;
break;
case KVM_CAP_SET_GUEST_DEBUG2:
@@ -926,6 +927,11 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
icpt_operexc_on_all_vcpus(kvm);
r = 0;
break;
+ case KVM_CAP_S390_VSIE_ESAMODE:
+ VM_EVENT(kvm, 3, "%s", "ENABLE: CAP_S390_VSIE_ESAMODE");
+ kvm->arch.allow_vsie_esamode = 1;
+ r = 0;
+ break;
default:
r = -EINVAL;
break;
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index 65500f5db379..e658f89d5d3e 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -985,6 +985,7 @@ struct kvm_enable_cap {
#define KVM_CAP_ARM_SEA_TO_USER 245
#define KVM_CAP_S390_USER_OPEREXEC 246
#define KVM_CAP_S390_KEYOP 247
+#define KVM_CAP_S390_VSIE_ESAMODE 248
struct kvm_irq_routing_irqchip {
__u32 irqchip;
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 07/12] KVM: s390: Add some useful mask macros
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (5 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 06/12] KVM: s390: Add KVM capability for ESA mode guests Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 08/12] KVM: s390: Add alignment checks for hugepages Janosch Frank
` (5 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Steffen Eiden
From: Claudio Imbrenda <imbrenda@linux.ibm.com>
Add _{SEGMENT,REGION3}_FR_MASK, similar to _{SEGMENT,REGION3}_MASK, but
working on gfn/pfn instead of addresses. Use them in gaccess.c instead
of using the normal masks plus gpa_to_gfn().
Also add _PAGES_PER_{SEGMENT,REGION3} to make future code more readable.
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
arch/s390/kvm/dat.h | 5 +++++
arch/s390/kvm/gaccess.c | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/s390/kvm/dat.h b/arch/s390/kvm/dat.h
index 123e11dcd70d..809cd7a8adb7 100644
--- a/arch/s390/kvm/dat.h
+++ b/arch/s390/kvm/dat.h
@@ -104,6 +104,11 @@ union pte {
} tok;
};
+#define _SEGMENT_FR_MASK (_SEGMENT_MASK >> PAGE_SHIFT)
+#define _REGION3_FR_MASK (_REGION3_MASK >> PAGE_SHIFT)
+#define _PAGES_PER_SEGMENT _PAGE_ENTRIES
+#define _PAGES_PER_REGION3 (_PAGES_PER_SEGMENT * _CRST_ENTRIES)
+
/* Soft dirty, needed as macro for atomic operations on ptes */
#define _PAGE_SD 0x002
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c
index 4630b2a067ea..a2ad11e2bf61 100644
--- a/arch/s390/kvm/gaccess.c
+++ b/arch/s390/kvm/gaccess.c
@@ -1461,7 +1461,7 @@ static int _do_shadow_crste(struct gmap *sg, gpa_t raddr, union crste *host, uni
lockdep_assert_held(&sg->kvm->mmu_lock);
lockdep_assert_held(&sg->parent->children_lock);
- gfn = f->gfn & gpa_to_gfn(is_pmd(*table) ? _SEGMENT_MASK : _REGION3_MASK);
+ gfn = f->gfn & (is_pmd(*table) ? _SEGMENT_FR_MASK : _REGION3_FR_MASK);
scoped_guard(spinlock, &sg->host_to_rmap_lock)
rc = gmap_insert_rmap(sg, gfn, gpa_to_gfn(raddr), host->h.tt);
if (rc)
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 08/12] KVM: s390: Add alignment checks for hugepages
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (6 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 07/12] KVM: s390: Add some useful mask macros Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 09/12] KVM: s390: Allow 4k granularity for memslots Janosch Frank
` (4 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Steffen Eiden
From: Claudio Imbrenda <imbrenda@linux.ibm.com>
When backing a guest page with a large page, check that the alignment
of the guest page matches the alignment of the host physical page
backing it within the large page.
Also check that the memslot is large enough to fit the large page.
Those checks are currently not needed, because memslots are guaranteed
to be 1m-aligned, but this will change.
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
arch/s390/kvm/faultin.c | 2 +-
arch/s390/kvm/gmap.c | 32 ++++++++++++++++++++++++++------
arch/s390/kvm/gmap.h | 3 ++-
3 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/arch/s390/kvm/faultin.c b/arch/s390/kvm/faultin.c
index e37cd18200f5..ddf0ca71f374 100644
--- a/arch/s390/kvm/faultin.c
+++ b/arch/s390/kvm/faultin.c
@@ -109,7 +109,7 @@ int kvm_s390_faultin_gfn(struct kvm_vcpu *vcpu, struct kvm *kvm, struct guest_fa
scoped_guard(read_lock, &kvm->mmu_lock) {
if (!mmu_invalidate_retry_gfn(kvm, inv_seq, f->gfn)) {
f->valid = true;
- rc = gmap_link(mc, kvm->arch.gmap, f);
+ rc = gmap_link(mc, kvm->arch.gmap, f, slot);
kvm_release_faultin_page(kvm, f->page, !!rc, f->write_attempt);
f->page = NULL;
}
diff --git a/arch/s390/kvm/gmap.c b/arch/s390/kvm/gmap.c
index ef0c6ebfdde2..e3c1b070a11d 100644
--- a/arch/s390/kvm/gmap.c
+++ b/arch/s390/kvm/gmap.c
@@ -613,17 +613,37 @@ int gmap_try_fixup_minor(struct gmap *gmap, struct guest_fault *fault)
return rc;
}
-static inline bool gmap_2g_allowed(struct gmap *gmap, gfn_t gfn)
+static inline bool gmap_2g_allowed(struct gmap *gmap, struct guest_fault *f,
+ struct kvm_memory_slot *slot)
{
return false;
}
-static inline bool gmap_1m_allowed(struct gmap *gmap, gfn_t gfn)
+/**
+ * gmap_1m_allowed() - Check whether a 1M hugepage is allowed.
+ * @gmap: The gmap of the guest.
+ * @f: Describes the fault that is being resolved.
+ * @slot: The memslot the faulting address belongs to.
+ *
+ * The function checks whether the GMAP_FLAG_ALLOW_HPAGE_1M flag is set for
+ * @gmap, whether the offset of the address in the 1M virtual frame is the
+ * same as the offset in the physical 1M frame, and finally whether the whole
+ * 1M page would fit in the given memslot.
+ *
+ * Return: true if a 1M hugepage is allowed to back the faulting address, false
+ * otherwise.
+ */
+static inline bool gmap_1m_allowed(struct gmap *gmap, struct guest_fault *f,
+ struct kvm_memory_slot *slot)
{
- return test_bit(GMAP_FLAG_ALLOW_HPAGE_1M, &gmap->flags);
+ return test_bit(GMAP_FLAG_ALLOW_HPAGE_1M, &gmap->flags) &&
+ !((f->gfn ^ f->pfn) & ~_SEGMENT_FR_MASK) &&
+ slot->base_gfn <= ALIGN_DOWN(f->gfn, _PAGES_PER_SEGMENT) &&
+ slot->base_gfn + slot->npages >= ALIGN(f->gfn + 1, _PAGES_PER_SEGMENT);
}
-int gmap_link(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, struct guest_fault *f)
+int gmap_link(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, struct guest_fault *f,
+ struct kvm_memory_slot *slot)
{
unsigned int order;
int rc, level;
@@ -633,9 +653,9 @@ int gmap_link(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, struct guest_fau
level = TABLE_TYPE_PAGE_TABLE;
if (f->page) {
order = folio_order(page_folio(f->page));
- if (order >= get_order(_REGION3_SIZE) && gmap_2g_allowed(gmap, f->gfn))
+ if (order >= get_order(_REGION3_SIZE) && gmap_2g_allowed(gmap, f, slot))
level = TABLE_TYPE_REGION3;
- else if (order >= get_order(_SEGMENT_SIZE) && gmap_1m_allowed(gmap, f->gfn))
+ else if (order >= get_order(_SEGMENT_SIZE) && gmap_1m_allowed(gmap, f, slot))
level = TABLE_TYPE_SEGMENT;
}
rc = dat_link(mc, gmap->asce, level, uses_skeys(gmap), f);
diff --git a/arch/s390/kvm/gmap.h b/arch/s390/kvm/gmap.h
index ccb5cd751e31..a2f74587ddbf 100644
--- a/arch/s390/kvm/gmap.h
+++ b/arch/s390/kvm/gmap.h
@@ -90,7 +90,8 @@ struct gmap *gmap_new(struct kvm *kvm, gfn_t limit);
struct gmap *gmap_new_child(struct gmap *parent, gfn_t limit);
void gmap_remove_child(struct gmap *child);
void gmap_dispose(struct gmap *gmap);
-int gmap_link(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, struct guest_fault *fault);
+int gmap_link(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, struct guest_fault *fault,
+ struct kvm_memory_slot *slot);
void gmap_sync_dirty_log(struct gmap *gmap, gfn_t start, gfn_t end);
int gmap_set_limit(struct gmap *gmap, gfn_t limit);
int gmap_ucas_translate(struct kvm_s390_mmu_cache *mc, struct gmap *gmap, gpa_t *gaddr);
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 09/12] KVM: s390: Allow 4k granularity for memslots
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (7 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 08/12] KVM: s390: Add alignment checks for hugepages Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 10/12] KVM: selftests: Remove 1M alignment requirement for s390 Janosch Frank
` (3 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Steffen Eiden
From: Claudio Imbrenda <imbrenda@linux.ibm.com>
Until now memslots on s390 needed to have 1M granularity and be 1M
aligned. Since the new gmap code can handle memslots with 4k
granularity and alignment, remove the restrictions.
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index a583c0a00efd..156878c95e06 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -5642,8 +5642,6 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
struct kvm_memory_slot *new,
enum kvm_mr_change change)
{
- gpa_t size;
-
if (kvm_is_ucontrol(kvm) && new->id < KVM_USER_MEM_SLOTS)
return -EINVAL;
@@ -5653,20 +5651,14 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
if (change != KVM_MR_DELETE && change != KVM_MR_FLAGS_ONLY) {
/*
- * A few sanity checks. We can have memory slots which have to be
- * located/ended at a segment boundary (1MB). The memory in userland is
- * ok to be fragmented into various different vmas. It is okay to mmap()
- * and munmap() stuff in this slot after doing this call at any time
+ * A few sanity checks. The memory in userland is ok to be
+ * fragmented into various different vmas. It is okay to mmap()
+ * and munmap() stuff in this slot after doing this call at any
+ * time.
*/
-
- if (new->userspace_addr & 0xffffful)
+ if (new->userspace_addr & ~PAGE_MASK)
return -EINVAL;
-
- size = new->npages * PAGE_SIZE;
- if (size & 0xffffful)
- return -EINVAL;
-
- if ((new->base_gfn * PAGE_SIZE) + size > kvm->arch.mem_limit)
+ if ((new->base_gfn + new->npages) * PAGE_SIZE > kvm->arch.mem_limit)
return -EINVAL;
}
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 10/12] KVM: selftests: Remove 1M alignment requirement for s390
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (8 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 09/12] KVM: s390: Allow 4k granularity for memslots Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 11/12] KVM: s390: selftests: enable some common memory-related tests Janosch Frank
` (2 subsequent siblings)
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Steffen Eiden
From: Claudio Imbrenda <imbrenda@linux.ibm.com>
Remove the 1M memslot alignment requirement for s390, since it is not
needed anymore.
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
tools/testing/selftests/kvm/dirty_log_test.c | 3 ---
tools/testing/selftests/kvm/include/kvm_util.h | 4 ----
tools/testing/selftests/kvm/kvm_page_table_test.c | 3 ---
tools/testing/selftests/kvm/lib/kvm_util.c | 9 +--------
tools/testing/selftests/kvm/lib/memstress.c | 4 ----
tools/testing/selftests/kvm/pre_fault_memory_test.c | 4 ----
tools/testing/selftests/kvm/set_memory_region_test.c | 9 +--------
7 files changed, 2 insertions(+), 34 deletions(-)
diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
index d58a641b0e6a..7627b328f18a 100644
--- a/tools/testing/selftests/kvm/dirty_log_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_test.c
@@ -641,9 +641,6 @@ static void run_test(enum vm_guest_mode mode, void *arg)
}
#ifdef __s390x__
- /* Align to 1M (segment size) */
- guest_test_phys_mem = align_down(guest_test_phys_mem, 1 << 20);
-
/*
* The workaround in guest_code() to write all pages prior to the first
* iteration isn't compatible with the dirty ring, as the dirty ring
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index 8b39cb919f4f..f861242b4ae8 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -1127,10 +1127,6 @@ vm_adjust_num_guest_pages(enum vm_guest_mode mode, unsigned int num_guest_pages)
{
unsigned int n;
n = vm_num_guest_pages(mode, vm_num_host_pages(mode, num_guest_pages));
-#ifdef __s390x__
- /* s390 requires 1M aligned guest sizes */
- n = (n + 255) & ~255;
-#endif
return n;
}
diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
index dd8b12f626d3..c60a24a92829 100644
--- a/tools/testing/selftests/kvm/kvm_page_table_test.c
+++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
@@ -261,9 +261,6 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg)
guest_page_size;
else
guest_test_phys_mem = p->phys_offset;
-#ifdef __s390x__
- alignment = max(0x100000UL, alignment);
-#endif
guest_test_phys_mem = align_down(guest_test_phys_mem, alignment);
/* Set up the shared data structure test_args */
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 1959bf556e88..f5e076591c64 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -985,7 +985,7 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type,
struct userspace_mem_region *region;
size_t backing_src_pagesz = get_backing_src_pagesz(src_type);
size_t mem_size = npages * vm->page_size;
- size_t alignment;
+ size_t alignment = 1;
TEST_REQUIRE_SET_USER_MEMORY_REGION2();
@@ -1039,13 +1039,6 @@ void vm_mem_add(struct kvm_vm *vm, enum vm_mem_backing_src_type src_type,
TEST_ASSERT(region != NULL, "Insufficient Memory");
region->mmap_size = mem_size;
-#ifdef __s390x__
- /* On s390x, the host address must be aligned to 1M (due to PGSTEs) */
- alignment = 0x100000;
-#else
- alignment = 1;
-#endif
-
/*
* When using THP mmap is not guaranteed to returned a hugepage aligned
* address so we have to pad the mmap. Padding is not needed for HugeTLB
diff --git a/tools/testing/selftests/kvm/lib/memstress.c b/tools/testing/selftests/kvm/lib/memstress.c
index 557c0a0a5658..1ea735d66e15 100644
--- a/tools/testing/selftests/kvm/lib/memstress.c
+++ b/tools/testing/selftests/kvm/lib/memstress.c
@@ -196,10 +196,6 @@ struct kvm_vm *memstress_create_vm(enum vm_guest_mode mode, int nr_vcpus,
args->gpa = (region_end_gfn - guest_num_pages - 1) * args->guest_page_size;
args->gpa = align_down(args->gpa, backing_src_pagesz);
-#ifdef __s390x__
- /* Align to 1M (segment size) */
- args->gpa = align_down(args->gpa, 1 << 20);
-#endif
args->size = guest_num_pages * args->guest_page_size;
pr_info("guest physical test memory: [0x%lx, 0x%lx)\n",
args->gpa, args->gpa + args->size);
diff --git a/tools/testing/selftests/kvm/pre_fault_memory_test.c b/tools/testing/selftests/kvm/pre_fault_memory_test.c
index 93e603d91311..f3de0386ba7b 100644
--- a/tools/testing/selftests/kvm/pre_fault_memory_test.c
+++ b/tools/testing/selftests/kvm/pre_fault_memory_test.c
@@ -175,11 +175,7 @@ static void __test_pre_fault_memory(unsigned long vm_type, bool private)
alignment = guest_page_size = vm_guest_mode_params[VM_MODE_DEFAULT].page_size;
gpa = (vm->max_gfn - TEST_NPAGES) * guest_page_size;
-#ifdef __s390x__
- alignment = max(0x100000UL, guest_page_size);
-#else
alignment = SZ_2M;
-#endif
gpa = align_down(gpa, alignment);
gva = gpa & ((1ULL << (vm->va_bits - 1)) - 1);
diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index 7fe427ff9b38..a398dc3a8c4b 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -413,14 +413,7 @@ static void test_add_max_memory_regions(void)
uint32_t max_mem_slots;
uint32_t slot;
void *mem, *mem_aligned, *mem_extra;
- size_t alignment;
-
-#ifdef __s390x__
- /* On s390x, the host address must be aligned to 1M (due to PGSTEs) */
- alignment = 0x100000;
-#else
- alignment = 1;
-#endif
+ size_t alignment = 1;
max_mem_slots = kvm_check_cap(KVM_CAP_NR_MEMSLOTS);
TEST_ASSERT(max_mem_slots > 0,
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 11/12] KVM: s390: selftests: enable some common memory-related tests
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (9 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 10/12] KVM: selftests: Remove 1M alignment requirement for s390 Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 10:46 ` [GIT PULL 12/12] KVM: s390: ucontrol: Fix memslot handling Janosch Frank
2026-04-13 11:23 ` [GIT PULL 00/12] KVM: s390: Changes for 7.1 Paolo Bonzini
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Steffen Eiden
From: Claudio Imbrenda <imbrenda@linux.ibm.com>
Enable the following tests on s390:
* memslot_modification_stress_test
* memslot_perf_test
* mmu_stress_test
Since the first two tests are now supported on all architectures, move
them into TEST_GEN_PROGS_COMMON and out of the indiviual architectures.
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
tools/testing/selftests/kvm/Makefile.kvm | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selftests/kvm/Makefile.kvm
index fdec90e85467..057f17d6b896 100644
--- a/tools/testing/selftests/kvm/Makefile.kvm
+++ b/tools/testing/selftests/kvm/Makefile.kvm
@@ -64,6 +64,8 @@ TEST_GEN_PROGS_COMMON += kvm_binary_stats_test
TEST_GEN_PROGS_COMMON += kvm_create_max_vcpus
TEST_GEN_PROGS_COMMON += kvm_page_table_test
TEST_GEN_PROGS_COMMON += set_memory_region_test
+TEST_GEN_PROGS_COMMON += memslot_modification_stress_test
+TEST_GEN_PROGS_COMMON += memslot_perf_test
# Compiled test targets
TEST_GEN_PROGS_x86 = $(TEST_GEN_PROGS_COMMON)
@@ -147,8 +149,6 @@ TEST_GEN_PROGS_x86 += coalesced_io_test
TEST_GEN_PROGS_x86 += dirty_log_perf_test
TEST_GEN_PROGS_x86 += guest_memfd_test
TEST_GEN_PROGS_x86 += hardware_disable_test
-TEST_GEN_PROGS_x86 += memslot_modification_stress_test
-TEST_GEN_PROGS_x86 += memslot_perf_test
TEST_GEN_PROGS_x86 += mmu_stress_test
TEST_GEN_PROGS_x86 += rseq_test
TEST_GEN_PROGS_x86 += steal_time
@@ -186,8 +186,6 @@ TEST_GEN_PROGS_arm64 += coalesced_io_test
TEST_GEN_PROGS_arm64 += dirty_log_perf_test
TEST_GEN_PROGS_arm64 += get-reg-list
TEST_GEN_PROGS_arm64 += guest_memfd_test
-TEST_GEN_PROGS_arm64 += memslot_modification_stress_test
-TEST_GEN_PROGS_arm64 += memslot_perf_test
TEST_GEN_PROGS_arm64 += mmu_stress_test
TEST_GEN_PROGS_arm64 += rseq_test
TEST_GEN_PROGS_arm64 += steal_time
@@ -205,6 +203,7 @@ TEST_GEN_PROGS_s390 += s390/ucontrol_test
TEST_GEN_PROGS_s390 += s390/user_operexec
TEST_GEN_PROGS_s390 += s390/keyop
TEST_GEN_PROGS_s390 += rseq_test
+TEST_GEN_PROGS_s390 += mmu_stress_test
TEST_GEN_PROGS_riscv = $(TEST_GEN_PROGS_COMMON)
TEST_GEN_PROGS_riscv += riscv/sbi_pmu_test
@@ -214,8 +213,6 @@ TEST_GEN_PROGS_riscv += arch_timer
TEST_GEN_PROGS_riscv += coalesced_io_test
TEST_GEN_PROGS_riscv += dirty_log_perf_test
TEST_GEN_PROGS_riscv += get-reg-list
-TEST_GEN_PROGS_riscv += memslot_modification_stress_test
-TEST_GEN_PROGS_riscv += memslot_perf_test
TEST_GEN_PROGS_riscv += mmu_stress_test
TEST_GEN_PROGS_riscv += rseq_test
TEST_GEN_PROGS_riscv += steal_time
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [GIT PULL 12/12] KVM: s390: ucontrol: Fix memslot handling
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (10 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 11/12] KVM: s390: selftests: enable some common memory-related tests Janosch Frank
@ 2026-04-13 10:46 ` Janosch Frank
2026-04-13 11:23 ` [GIT PULL 00/12] KVM: s390: Changes for 7.1 Paolo Bonzini
12 siblings, 0 replies; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 10:46 UTC (permalink / raw)
To: pbonzini
Cc: kvm, frankja, david, borntraeger, cohuck, linux-s390, imbrenda,
Steffen Eiden
From: Claudio Imbrenda <imbrenda@linux.ibm.com>
Fix memslots handling for UCONTROL guests. Attempts to delete user
memslots will fail, as they should, without the risk of a NULL pointer
dereference.
Fixes: 413c98f24c63 ("KVM: s390: fake memslot for ucontrol VMs")
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
arch/s390/kvm/kvm-s390.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 156878c95e06..63bc496d0c37 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -5642,7 +5642,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
struct kvm_memory_slot *new,
enum kvm_mr_change change)
{
- if (kvm_is_ucontrol(kvm) && new->id < KVM_USER_MEM_SLOTS)
+ if (kvm_is_ucontrol(kvm) && new && new->id < KVM_USER_MEM_SLOTS)
return -EINVAL;
/* When we are protected, we should not change the memory slots */
--
2.53.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [GIT PULL 00/12] KVM: s390: Changes for 7.1
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
` (11 preceding siblings ...)
2026-04-13 10:46 ` [GIT PULL 12/12] KVM: s390: ucontrol: Fix memslot handling Janosch Frank
@ 2026-04-13 11:23 ` Paolo Bonzini
2026-04-13 12:28 ` Janosch Frank
12 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2026-04-13 11:23 UTC (permalink / raw)
To: Janosch Frank; +Cc: kvm, david, borntraeger, cohuck, linux-s390, imbrenda
On Mon, Apr 13, 2026 at 12:47 PM Janosch Frank <frankja@linux.ibm.com> wrote:
>
> Hey Paolo,
>
> here are our changes for 7.1:
> - Claudio is finishing up gmap work by allowing 4k memslots
> - Eric and Hendrik added nesting ESA support
> - I've fixed up LPSW/E emulation, going through next as I don't expect
> us to ever hit this
>
> There's been two conflicts because 7.0 received a number of gmap fixes.
This is just nearby lines being touched, I think? No real conflict.
Pulled, thanks.
Paolo
> Please pull
>
>
> The following changes since commit 11439c4635edd669ae435eec308f4ab8a0804808:
>
> Linux 7.0-rc2 (2026-03-01 15:39:31 -0800)
>
> are available in the Git repository at:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git tags/kvm-s390-next-7.1-1
>
> for you to fetch changes up to 9b8e8aad5896d66005d29920cb1643076a20b172:
>
> KVM: s390: ucontrol: Fix memslot handling (2026-04-07 17:20:42 +0200)
>
> ----------------------------------------------------------------
> - ESA nesting support
> - 4k memslots
> - LPSW/E fix
> ----------------------------------------------------------------
>
> Claudio Imbrenda (6):
> KVM: s390: Add some useful mask macros
> KVM: s390: Add alignment checks for hugepages
> KVM: s390: Allow 4k granularity for memslots
> KVM: selftests: Remove 1M alignment requirement for s390
> KVM: s390: selftests: enable some common memory-related tests
> KVM: s390: ucontrol: Fix memslot handling
>
> Eric Farman (4):
> KVM: s390: only deliver service interrupt with payload
> KVM: s390: vsie: Allow non-zarch guests
> KVM: s390: vsie: Disable some bits when in ESA mode
> KVM: s390: vsie: Accommodate ESA prefix pages
>
> Hendrik Brueckner (1):
> KVM: s390: Add KVM capability for ESA mode guests
>
> Janosch Frank (1):
> KVM: s390: Fix lpsw/e breaking event handling
>
> Documentation/virt/kvm/api.rst | 8 +++++
> arch/s390/include/asm/kvm_host.h | 1 +
> arch/s390/include/asm/kvm_host_types.h | 3 +-
> arch/s390/kvm/dat.h | 5 +++
> arch/s390/kvm/faultin.c | 2 +-
> arch/s390/kvm/gaccess.c | 2 +-
> arch/s390/kvm/gmap.c | 32 +++++++++++++++----
> arch/s390/kvm/gmap.h | 3 +-
> arch/s390/kvm/interrupt.c | 3 ++
> arch/s390/kvm/kvm-s390.c | 28 ++++++++--------
> arch/s390/kvm/kvm-s390.h | 5 ++-
> arch/s390/kvm/priv.c | 8 +++--
> arch/s390/kvm/vsie.c | 29 ++++++++++++++---
> include/uapi/linux/kvm.h | 1 +
> tools/testing/selftests/kvm/Makefile.kvm | 9 ++----
> tools/testing/selftests/kvm/dirty_log_test.c | 3 --
> .../testing/selftests/kvm/include/kvm_util.h | 4 ---
> .../selftests/kvm/kvm_page_table_test.c | 3 --
> tools/testing/selftests/kvm/lib/kvm_util.c | 9 +-----
> tools/testing/selftests/kvm/lib/memstress.c | 4 ---
> .../selftests/kvm/pre_fault_memory_test.c | 4 ---
> .../selftests/kvm/set_memory_region_test.c | 9 +-----
> 22 files changed, 102 insertions(+), 73 deletions(-)
>
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [GIT PULL 00/12] KVM: s390: Changes for 7.1
2026-04-13 11:23 ` [GIT PULL 00/12] KVM: s390: Changes for 7.1 Paolo Bonzini
@ 2026-04-13 12:28 ` Janosch Frank
2026-04-13 12:33 ` Paolo Bonzini
0 siblings, 1 reply; 16+ messages in thread
From: Janosch Frank @ 2026-04-13 12:28 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kvm, david, borntraeger, cohuck, linux-s390, imbrenda
On 4/13/26 13:23, Paolo Bonzini wrote:
> On Mon, Apr 13, 2026 at 12:47 PM Janosch Frank <frankja@linux.ibm.com> wrote:
>>
>> Hey Paolo,
>>
>> here are our changes for 7.1:
>> - Claudio is finishing up gmap work by allowing 4k memslots
>> - Eric and Hendrik added nesting ESA support
>> - I've fixed up LPSW/E emulation, going through next as I don't expect
>> us to ever hit this
>>
>> There's been two conflicts because 7.0 received a number of gmap fixes.
>
> This is just nearby lines being touched, I think? No real conflict.
It's code that's missing in next since we had a lot of changes in
master. One is a conflict where the next list of selftests does not
include the irq routing test that I added in kvm-s390-master-7.0-1. I.e.
trivial.
The other is __gmap_link() that's introduced in a fix but is not around
yet for 4204067f99820 in next.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [GIT PULL 00/12] KVM: s390: Changes for 7.1
2026-04-13 12:28 ` Janosch Frank
@ 2026-04-13 12:33 ` Paolo Bonzini
0 siblings, 0 replies; 16+ messages in thread
From: Paolo Bonzini @ 2026-04-13 12:33 UTC (permalink / raw)
To: Janosch Frank; +Cc: kvm, david, borntraeger, cohuck, linux-s390, imbrenda
On Mon, Apr 13, 2026 at 2:28 PM Janosch Frank <frankja@linux.ibm.com> wrote:
> On 4/13/26 13:23, Paolo Bonzini wrote:
> > On Mon, Apr 13, 2026 at 12:47 PM Janosch Frank <frankja@linux.ibm.com> wrote:
> >> There's been two conflicts because 7.0 received a number of gmap fixes.
> >
> > This is just nearby lines being touched, I think? No real conflict.
> It's code that's missing in next since we had a lot of changes in
> master. One is a conflict where the next list of selftests does not
> include the irq routing test that I added in kvm-s390-master-7.0-1. I.e.
> trivial.
>
> The other is _gmap_link() that's introduced in a fix but is not around
> yet for 4204067f99820 in next.
Yes, exactly - those are master and next touching nearby lines, but
there's no modify/modify conflict within a function or anything like
that.
Paolo
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-04-13 12:34 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-13 10:46 [GIT PULL 00/12] KVM: s390: Changes for 7.1 Janosch Frank
2026-04-13 10:46 ` [GIT PULL 01/12] KVM: s390: only deliver service interrupt with payload Janosch Frank
2026-04-13 10:46 ` [GIT PULL 02/12] KVM: s390: Fix lpsw/e breaking event handling Janosch Frank
2026-04-13 10:46 ` [GIT PULL 03/12] KVM: s390: vsie: Allow non-zarch guests Janosch Frank
2026-04-13 10:46 ` [GIT PULL 04/12] KVM: s390: vsie: Disable some bits when in ESA mode Janosch Frank
2026-04-13 10:46 ` [GIT PULL 05/12] KVM: s390: vsie: Accommodate ESA prefix pages Janosch Frank
2026-04-13 10:46 ` [GIT PULL 06/12] KVM: s390: Add KVM capability for ESA mode guests Janosch Frank
2026-04-13 10:46 ` [GIT PULL 07/12] KVM: s390: Add some useful mask macros Janosch Frank
2026-04-13 10:46 ` [GIT PULL 08/12] KVM: s390: Add alignment checks for hugepages Janosch Frank
2026-04-13 10:46 ` [GIT PULL 09/12] KVM: s390: Allow 4k granularity for memslots Janosch Frank
2026-04-13 10:46 ` [GIT PULL 10/12] KVM: selftests: Remove 1M alignment requirement for s390 Janosch Frank
2026-04-13 10:46 ` [GIT PULL 11/12] KVM: s390: selftests: enable some common memory-related tests Janosch Frank
2026-04-13 10:46 ` [GIT PULL 12/12] KVM: s390: ucontrol: Fix memslot handling Janosch Frank
2026-04-13 11:23 ` [GIT PULL 00/12] KVM: s390: Changes for 7.1 Paolo Bonzini
2026-04-13 12:28 ` Janosch Frank
2026-04-13 12:33 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox