From: sashiko-bot@kernel.org
To: "Christoph Schlameuss" <schlameuss@linux.ibm.com>
Cc: linux-s390@vger.kernel.org, "Vasily Gorbik" <gor@linux.ibm.com>,
kvm@vger.kernel.org, "Heiko Carstens" <hca@linux.ibm.com>,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
"Alexander Gordeev" <agordeev@linux.ibm.com>
Subject: Re: [PATCH v5 13/21] KVM: s390: vsie: Lazily keep original scb pinned after vsie exit
Date: Wed, 26 Aug 2026 15:25:24 +0000 [thread overview]
Message-ID: <20260826152524.C3D5C1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260826-vsie-sigpi-v5-13-cf471edb46b2@linux.ibm.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] Removing the old SCB address from the XArray when recycling a vsie_page causes an unbounded host memory leak.
- [High] Unconditional `xa_store()` silently overwrites concurrent entries, bypassing KVM's protection against concurrent nested SCB execution.
- [High] Misrouting of addressing exceptions to the 'double use' path causes improper guest PSW rewinding.
--
commit 5c64511a5db61f1b968b748560aa62a1a39b08a9
Author: Christoph Schlameuss <schlameuss@linux.ibm.com>
KVM: s390: vsie: Lazily keep original scb pinned after vsie exit
Keep the original SIE control block (SCB) pinned and only lazily unpin
it on reuse of the vsie_page for a different SCB. Track pinned pages and
ensure stale pins are released when needed.
> diff --git a/arch/s390/kvm/s390/vsie.c b/arch/s390/kvm/s390/vsie.c
> index 988370f491bf5..24af48af89cd9 100644
> --- a/arch/s390/kvm/s390/vsie.c
> +++ b/arch/s390/kvm/s390/vsie.c
[ ... ]
> @@ -1575,47 +1606,65 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr)
[ ... ]
> } else {
> /* reuse an existing entry that belongs to nobody */
> while (true) {
> - vsie_page = kvm->arch.vsie.pages[kvm->arch.vsie.next];
> + pages_idx = kvm->arch.vsie.next;
> + kvm->arch.vsie.next++;
> + kvm->arch.vsie.next %= kvm->arch.vsie.page_count;
> + vsie_page = kvm->arch.vsie.pages[pages_idx];
> if (try_get_vsie_page(vsie_page))
> break;
> - kvm->arch.vsie.next++;
> - kvm->arch.vsie.next %= nr_vcpus;
> }
> - if (vsie_page->scb_gpa != ULONG_MAX)
> - xa_erase(&kvm->arch.vsie.addr_to_page,
> - vsie_page->scb_gpa >> SCB_ALIGNMENT_SHIFT);
> - /* Mark it as invalid until it resides in the tree. */
> - vsie_page->scb_gpa = ULONG_MAX;
> +
> + unpin_scb(kvm, vsie_page);
> }
[Severity: Critical]
Why is xa_erase() removed here? Leaving the old guest SCB address mapping in
the XArray when recycling a vsie_page allows a malicious guest to repeatedly
execute vSIE with unique SCB addresses, continuously consuming host kernel
memory by allocating new XArray entries. Could this lead to an unbounded
host memory leak?
>
> - /* Double use of the same address or allocation failure. */
> - if (xa_insert(&kvm->arch.vsie.addr_to_page, addr >> SCB_ALIGNMENT_SHIFT, vsie_page,
> - GFP_KERNEL_ACCOUNT)) {
> + rc = init_vsie_page(vcpu, vsie_page, addr);
> + if (!rc)
> + xa_store(&kvm->arch.vsie.addr_to_page, addr >> SCB_ALIGNMENT_SHIFT, vsie_page,
> + GFP_KERNEL_ACCOUNT);
[Severity: High]
Does xa_store() here bypass the concurrent double-use protection?
The baseline code used xa_insert() which gracefully returns an error if an
entry already exists, preventing two vCPUs from executing the same nested SCB
concurrently.
By replacing this with an unconditional xa_store(), the second vCPU will
silently overwrite the XArray entry. Both vCPUs will enter nested SIE using
different shadow structures for the same physical guest SCB, and when they exit,
both will concurrently write back to scb_o in unshadow_scb().
Could this cause severe nested guest state corruption?
> +
> + mutex_unlock(&kvm->arch.vsie.mutex);
> + if (vsie_page_new)
> + free_vsie_page(vsie_page_new);
> + if (rc) {
> + vsie_page->scb_gpa = ULONG_MAX;
> put_vsie_page(vsie_page);
> - mutex_unlock(&kvm->arch.vsie.mutex);
> - return NULL;
> + return rc < 0 ? ERR_PTR(rc) : NULL;
> }
[Severity: High]
If a guest provides an invalid SCB address, pin_scb() injects a PGM_ADDRESSING
program exception and returns 1. Here, rc < 0 ? ERR_PTR(rc) : NULL will convert
this 1 into a NULL pointer return.
The caller kvm_s390_handle_vsie() interprets a NULL return strictly as a 'double
use' scenario and executes kvm_s390_rewind_psw(vcpu, 4). Doesn't this
incorrectly rewind the guest PSW after a program exception has already been
injected?
Furthermore, if follow-up patches in the series return ERR_PTR(rc) directly
(evaluating to ERR_PTR(1)), an IS_ERR check in the caller will fail to catch
it because 1 is a valid pointer address, leading to a host kernel panic when
dereferenced.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260826-vsie-sigpi-v5-0-cf471edb46b2@linux.ibm.com?part=13
next prev parent reply other threads:[~2026-08-26 15:25 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-26 15:05 [PATCH v5 00/21] KVM: s390: vsie: Add VSIE SIGP ECALL and SRSI Interpretation Christoph Schlameuss
2026-08-26 15:05 ` [PATCH v5 01/21] KVM: s390: vsie: Add SCAO read and write helpers Christoph Schlameuss
2026-08-26 15:12 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 02/21] KVM: s390: vsie: Move SCAO validation into a function Christoph Schlameuss
2026-08-26 15:15 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 03/21] KVM: s390: vsie: Add vsie_interp_extf detection Christoph Schlameuss
2026-08-26 15:12 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 04/21] KVM: s390: vsie: Add ssca_block and ssca_entry structs Christoph Schlameuss
2026-08-26 15:09 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 05/21] KVM: s390: vsie: Move pin/unpin guest page Christoph Schlameuss
2026-08-26 15:17 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 06/21] KVM: s390: vsie: Move pin/unpin_scb methods Christoph Schlameuss
2026-08-26 15:10 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 07/21] KVM: s390: vsie: Move release/acquire gmap shadow Christoph Schlameuss
2026-08-26 15:14 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 08/21] KVM: s390: vsie: Create helpers to alloc and free vsie_pages Christoph Schlameuss
2026-08-26 15:10 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 09/21] KVM: s390: vsie: Replace radix_tree with xarray addr_to_page Christoph Schlameuss
2026-08-26 15:14 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 10/21] KVM: s390: vsie: Refactor kvm_s390_vsie_destroy and extract reusable methods Christoph Schlameuss
2026-08-26 15:19 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 11/21] KVM: s390: vsie: Add helper reset_vsie_page() and unshadow_intercept() Christoph Schlameuss
2026-08-26 15:18 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 12/21] KVM: s390: vsie: Add helper unshadow_intercept() Christoph Schlameuss
2026-08-26 15:14 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 13/21] KVM: s390: vsie: Lazily keep original scb pinned after vsie exit Christoph Schlameuss
2026-08-26 15:25 ` sashiko-bot [this message]
2026-08-26 15:05 ` [PATCH v5 14/21] KVM: s390: vsie: Add helper to pin and unpin multiple guest pages Christoph Schlameuss
2026-08-26 15:15 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 15/21] KVM: s390: vsie: Add struct vsie_sca with pin and unpin methods Christoph Schlameuss
2026-08-26 15:26 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 16/21] KVM: s390: vsie: Shadow VSIE SCA in guest-1 Christoph Schlameuss
2026-08-26 15:25 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 17/21] KVM: s390: vsie: Allow guest-3 cpu add and remove with ssca Christoph Schlameuss
2026-08-26 15:23 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 18/21] KVM: s390: vsie: Add VSIE max shadow configuration Christoph Schlameuss
2026-08-26 15:24 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 19/21] KVM: s390: vsie: Add VSIE shadow stat counters Christoph Schlameuss
2026-08-26 15:19 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 20/21] KVM: s390: vsie: Create minimal scb shadows for not running g3 blocks Christoph Schlameuss
2026-08-26 15:35 ` sashiko-bot
2026-08-26 15:05 ` [PATCH v5 21/21] KVM: s390: vsie: Enable use of VSIE SSCA Christoph Schlameuss
2026-08-26 15:33 ` sashiko-bot
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=20260826152524.C3D5C1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=agordeev@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=schlameuss@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox