From: Claudio Imbrenda <imbrenda@linux.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org,
borntraeger@de.ibm.com, frankja@linux.ibm.com, david@kernel.org,
seiden@linux.ibm.com, nrb@linux.ibm.com,
schlameuss@linux.ibm.com, gra@linux.ibm.com
Subject: [PATCH v1 06/11] KVM: s390: Introduce extended topup for struct kvm_s390_mmu_cache
Date: Tue, 11 Aug 2026 17:56:36 +0200 [thread overview]
Message-ID: <20260811155641.219777-7-imbrenda@linux.ibm.com> (raw)
In-Reply-To: <20260811155641.219777-1-imbrenda@linux.ibm.com>
In most cases the mmu caches should not blow up in size unnecessarily,
since there is one for each vCPU, as it can add up to a quite big
amount of memory. In some cases, though, it is necessary to have a
particularly large mmu cache, to guarantee that specific operations can
complete without needing to refill the cache.
This patch refactors the existing kvm_s390_mmu_cache_topup() function
to allow for an extended top-up. Two wrappers are also provided, one
with the old name and old behaviour, and one that performs the extended
top-up.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
arch/s390/kvm/dat.c | 11 +++++++----
arch/s390/kvm/dat.h | 25 +++++++++++++++++++++----
2 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/arch/s390/kvm/dat.c b/arch/s390/kvm/dat.c
index f4dd6f783417..47ff8af1b22f 100644
--- a/arch/s390/kvm/dat.c
+++ b/arch/s390/kvm/dat.c
@@ -28,23 +28,26 @@
#include <asm/tlb.h>
#include "dat.h"
-int kvm_s390_mmu_cache_topup(struct kvm_s390_mmu_cache *mc)
+int _kvm_s390_mmu_cache_topup(struct kvm_s390_mmu_cache *mc, bool extended)
{
+ size_t n_crsts = extended ? KVM_S390_MMU_CACHE_N_CRSTS_MAX : KVM_S390_MMU_CACHE_N_CRSTS;
+ size_t n_pts = extended ? KVM_S390_MMU_CACHE_N_PTS_MAX : KVM_S390_MMU_CACHE_N_PTS;
+ size_t n_rmaps = extended ? KVM_S390_MMU_CACHE_N_RMAPS_MAX : KVM_S390_MMU_CACHE_N_RMAPS;
void *o;
- for ( ; mc->n_crsts < KVM_S390_MMU_CACHE_N_CRSTS; mc->n_crsts++) {
+ for ( ; mc->n_crsts < n_crsts; mc->n_crsts++) {
o = (void *)__get_free_pages(GFP_KERNEL_ACCOUNT | __GFP_COMP, CRST_ALLOC_ORDER);
if (!o)
return -ENOMEM;
mc->crsts[mc->n_crsts] = o;
}
- for ( ; mc->n_pts < KVM_S390_MMU_CACHE_N_PTS; mc->n_pts++) {
+ for ( ; mc->n_pts < n_pts; mc->n_pts++) {
o = (void *)__get_free_page(GFP_KERNEL_ACCOUNT);
if (!o)
return -ENOMEM;
mc->pts[mc->n_pts] = o;
}
- for ( ; mc->n_rmaps < KVM_S390_MMU_CACHE_N_RMAPS; mc->n_rmaps++) {
+ for ( ; mc->n_rmaps < n_rmaps; mc->n_rmaps++) {
o = kzalloc_obj(struct vsie_rmap, GFP_KERNEL_ACCOUNT);
if (!o)
return -ENOMEM;
diff --git a/arch/s390/kvm/dat.h b/arch/s390/kvm/dat.h
index 141ee7b9f019..461302f05e50 100644
--- a/arch/s390/kvm/dat.h
+++ b/arch/s390/kvm/dat.h
@@ -479,13 +479,20 @@ struct vsie_rmap {
static_assert(sizeof(struct vsie_rmap) == 2 * sizeof(long));
+/* Used when performing normal top-ups */
#define KVM_S390_MMU_CACHE_N_CRSTS 6
#define KVM_S390_MMU_CACHE_N_PTS 2
#define KVM_S390_MMU_CACHE_N_RMAPS 16
+
+/* Used to perform special extended top-ups */
+#define KVM_S390_MMU_CACHE_N_CRSTS_MAX 32
+#define KVM_S390_MMU_CACHE_N_PTS_MAX 8
+#define KVM_S390_MMU_CACHE_N_RMAPS_MAX 16
+
struct kvm_s390_mmu_cache {
- void *crsts[KVM_S390_MMU_CACHE_N_CRSTS];
- void *pts[KVM_S390_MMU_CACHE_N_PTS];
- void *rmaps[KVM_S390_MMU_CACHE_N_RMAPS];
+ void *crsts[KVM_S390_MMU_CACHE_N_CRSTS_MAX];
+ void *pts[KVM_S390_MMU_CACHE_N_PTS_MAX];
+ void *rmaps[KVM_S390_MMU_CACHE_N_RMAPS_MAX];
short int n_crsts;
short int n_pts;
short int n_rmaps;
@@ -555,7 +562,17 @@ int dat_get_cmma(union asce asce, gfn_t *start, unsigned int *count, u8 *values,
int dat_set_cmma_bits(struct kvm_s390_mmu_cache *mc, union asce asce, gfn_t gfn,
unsigned long count, unsigned long mask, const uint8_t *bits);
-int kvm_s390_mmu_cache_topup(struct kvm_s390_mmu_cache *mc);
+int _kvm_s390_mmu_cache_topup(struct kvm_s390_mmu_cache *mc, bool extended);
+
+static inline int kvm_s390_mmu_cache_topup(struct kvm_s390_mmu_cache *mc)
+{
+ return _kvm_s390_mmu_cache_topup(mc, false);
+}
+
+static inline int kvm_s390_mmu_cache_extended_topup(struct kvm_s390_mmu_cache *mc)
+{
+ return _kvm_s390_mmu_cache_topup(mc, true);
+}
#define GFP_KVM_S390_MMU_CACHE (GFP_ATOMIC | __GFP_ACCOUNT | __GFP_NOWARN)
--
2.55.0
next prev parent reply other threads:[~2026-08-11 15:56 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 15:56 [PATCH v1 00/11] KVM: s390: And then... even more fixes again Claudio Imbrenda
2026-08-11 15:56 ` [PATCH v1 01/11] KVM: s390: Properly handle NULL pointer in dat_cond_set_storage_key() Claudio Imbrenda
2026-08-12 7:02 ` Christian Borntraeger
2026-08-12 8:06 ` Christoph Schlameuss
2026-08-11 15:56 ` [PATCH v1 02/11] KVM: s390: Use srcu in kvm_arch_vcpu_unlocked_ioctl() Claudio Imbrenda
2026-08-11 17:26 ` Christian Borntraeger
2026-08-11 18:01 ` Claudio Imbrenda
2026-08-11 15:56 ` [PATCH v1 03/11] KVM: s390: Fix get_all_floating_irqs() Claudio Imbrenda
2026-08-12 7:11 ` Christian Borntraeger
2026-08-12 9:12 ` Claudio Imbrenda
2026-08-11 15:56 ` [PATCH v1 04/11] KVM: s390: Fix dirty marking in adapter_indicators_set*() Claudio Imbrenda
2026-08-11 15:56 ` [PATCH v1 05/11] KVM: s390: Fix pgste_get_trylock_multiple() Claudio Imbrenda
2026-08-11 17:07 ` Christian Borntraeger
2026-08-11 15:56 ` Claudio Imbrenda [this message]
2026-08-11 15:56 ` [PATCH v1 07/11] KVM: s390: Move all code into kvm_arch_prepare_memory_region() Claudio Imbrenda
2026-08-12 8:39 ` Christian Borntraeger
2026-08-11 15:56 ` [PATCH v1 08/11] KVM: s390: Fix IRQ injection with SIGP Stop and Store Status Claudio Imbrenda
2026-08-11 15:56 ` [PATCH v1 09/11] KVM: s390: Fix kvm_s390_clear_pv_state() Claudio Imbrenda
2026-08-12 7:22 ` Christian Borntraeger
2026-08-12 8:07 ` Christian Borntraeger
2026-08-11 15:56 ` [PATCH v1 10/11] KVM: s390: Fix potential tiny kernel stack leak Claudio Imbrenda
2026-08-11 17:03 ` Christian Borntraeger
2026-08-11 15:56 ` [PATCH v1 11/11] KVM: s390: Fix _gaccess_shadow_fault() Claudio Imbrenda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260811155641.219777-7-imbrenda@linux.ibm.com \
--to=imbrenda@linux.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=david@kernel.org \
--cc=frankja@linux.ibm.com \
--cc=gra@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=nrb@linux.ibm.com \
--cc=schlameuss@linux.ibm.com \
--cc=seiden@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is 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.