Kernel KVM virtualization development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Claudio Imbrenda" <imbrenda@linux.ibm.com>
Cc: "Vasily Gorbik" <gor@linux.ibm.com>,
	kvm@vger.kernel.org, linux-s390@vger.kernel.org,
	"Heiko Carstens" <hca@linux.ibm.com>,
	"Alexander Gordeev" <agordeev@linux.ibm.com>
Subject: Re: [PATCH v7 14/14] KVM: s390: Fix kvm_arch_commit_memory_region() when low on memory
Date: Fri, 31 Jul 2026 13:32:46 +0000	[thread overview]
Message-ID: <20260731133246.AD1FE1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260731130138.173983-15-imbrenda@linux.ibm.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

New issues:
- [High] Dropping `kvm->mmu_lock` during the retry loop allows vCPUs to fault in memory that will be subsequently overwritten, destroying guest storage keys.

Pre-existing issues:
- [Medium] Missing VM Kill on memory allocation failure leaves VM in an inconsistent state.
--

--- Patch [14]: [PATCH v7 14/14] KVM: s390: Fix kvm_arch_commit_memory_region() when low on memory ---
commit 7328596d47af3b280bf92a137aeed10b8bbc3124
Author: Claudio Imbrenda <imbrenda@linux.ibm.com>

KVM: s390: Fix kvm_arch_commit_memory_region() when low on memory

When low on memory, kvm_arch_commit_memory_region() might not perform
the required action completely, leaving the VM in an inconsistent state.
This patch fixes it by refilling the struct kvm_s390_mmu_cache and trying
again.

> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
> index 518a69c55e85c..fd8badb0d571c 100644
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c

[ ... ]

> @@ -5838,11 +5838,9 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
>  		return;
>  
>  	mc = kvm_s390_new_mmu_cache();
> -	if (!mc) {
> -		rc = -ENOMEM;
> +	if (!mc)
>  		goto out;
> -	}
> -
> +retry:
>  	scoped_guard(write_lock, &kvm->mmu_lock) {
>  		if (kvm->arch.migration_mode && kvm->arch.use_cmma && old) {
>  			_dat_walk_gfn_range(old->base_gfn, old->base_gfn + old->npages,

[Severity: High]
Since kvm_set_memory_region() makes the new memslot visible to vCPUs before
calling kvm_arch_commit_memory_region(), can a guest vCPU fault in the new
memslot while KVM is committing it?

If dat_create_slot() hits -ENOMEM due to a large memslot exhausting the MMU
cache during KVM_MR_CREATE, the retry loop drops kvm->mmu_lock to top up the
cache. During this unlocked window, the guest vCPU could install valid page
tables and storage keys.

When the retry loop reacquires the lock, it restarts dat_create_slot() from
the beginning of the memslot.

If this happens, wouldn't the callback blindly overwrite the guest's valid
PTEs with an empty token and permanently destroy the valid storage keys?

arch/s390/kvm/dat.c:_dat_slot_pte() {
    ...
    pgste = pgste_get_lock(ptep);
    pgste = __dat_ptep_xchg(ptep, pgste, new_pte, gfn, walk->asce, false);
    pgste.cmma_d = 0;
    pgste_set_unlock(ptep, pgste);
    ...
}

[ ... ]

> @@ -5865,9 +5863,15 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
>  		case KVM_MR_FLAGS_ONLY:
>  			break;
>  		default:
> +			rc = 0;
>  			WARN(1, "Unknown KVM MR CHANGE: %d\n", change);
>  		}
>  	}
> +	if (rc == -ENOMEM) {
> +		rc = kvm_s390_mmu_cache_topup(mc);
> +		if (!rc)
> +			goto retry;
> +	}
>  out:
>  	if (rc)
>  		pr_warn("failed to commit memory region\n");

[Severity: Medium]
This is a pre-existing issue, but if kvm_s390_mmu_cache_topup() fails and
returns -ENOMEM when host memory is exhausted, doesn't the code fall through
to the out label and only log a warning via pr_warn?

The commit message states that such a failure should kill the VM. Does this
actually kill the VM, or does it leave the VM running with partially deleted
or corrupted memory slot mappings since no KVM kill mechanism is invoked
here?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260731130138.173983-1-imbrenda@linux.ibm.com?part=14

      reply	other threads:[~2026-07-31 13:32 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-31 13:01 [PATCH v7 00/14] KVM: s390: Misc fixes Claudio Imbrenda
2026-07-31 13:01 ` [PATCH v7 01/14] KVM: s390: Fix unlikely NULL gmap dereference Claudio Imbrenda
2026-07-31 13:20   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 02/14] KVM: s390: Do not free SCA if it was not allocated Claudio Imbrenda
2026-07-31 13:13   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 03/14] KVM: s390: Fix kvm_s390_vcpu_unsetup_cmma() Claudio Imbrenda
2026-07-31 13:21   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 04/14] KVM: s390: Fix overclearing ESCA in case of error Claudio Imbrenda
2026-07-31 13:33   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 05/14] KVM: s390: ucontrol: Fix sca_clear_ext_call() Claudio Imbrenda
2026-07-31 13:19   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 06/14] KVM: s390: Fix leaking of PGM_ADDRESSING to userspace Claudio Imbrenda
2026-07-31 13:24   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 07/14] KVM: s390: Fix race in __do_essa() Claudio Imbrenda
2026-07-31 13:14   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 08/14] KVM: s390: cmma: Fix dirty tracking when removing memslot Claudio Imbrenda
2026-07-31 13:36   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 09/14] KVM: s390: ucontrol: Add missing locking around gmap_remove_child() Claudio Imbrenda
2026-07-31 13:35   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 10/14] KVM: s390: Free the mmu cache when kvm_arch_vcpu_create() fails Claudio Imbrenda
2026-07-31 13:11   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 11/14] KVM: s390: Return -EINTR if a signal is pending while faulting-in Claudio Imbrenda
2026-07-31 13:20   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 12/14] KVM: s390: Fix ordering when adding to SCA Claudio Imbrenda
2026-07-31 13:21   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 13/14] KVM: s390: Fix cleanup in kvm_s390_pv_create_cpu() Claudio Imbrenda
2026-07-31 13:21   ` sashiko-bot
2026-07-31 13:01 ` [PATCH v7 14/14] KVM: s390: Fix kvm_arch_commit_memory_region() when low on memory Claudio Imbrenda
2026-07-31 13:32   ` sashiko-bot [this message]

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=20260731133246.AD1FE1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=agordeev@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=imbrenda@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox