All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Christoph Schlameuss" <schlameuss@linux.ibm.com>
Cc: "Vasily Gorbik" <gor@linux.ibm.com>,
	"Alexander Gordeev" <agordeev@linux.ibm.com>,
	kvm@vger.kernel.org, linux-s390@vger.kernel.org,
	"Heiko Carstens" <hca@linux.ibm.com>
Subject: Re: [PATCH 12/21] KVM: s390: vsie: Replace radix_tree with xarray addr_to_page
Date: Thu, 09 Jul 2026 15:25:39 +0000	[thread overview]
Message-ID: <20260709152540.596461F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260709-vsie-sigpi-v1-12-ea9f12066408@linux.ibm.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] Unconditional overwrite and logic error in `get_vsie_page` due to `xa_store()` misuse.
- [Medium] Missing `xa_destroy()` causes memory leak of XArray internal nodes during VM teardown.
- [Medium] Incorrect XArray initialization drops memcg accounting and adds free-slot tracking overhead.
--

--- Patch [12]: [PATCH 12/21] KVM: s390: vsie: Replace radix_tree with xarray addr_to_page ---
commit b9607cfaff7f6d624df41b31c8e80cc0a315a2e3
Author: Christoph Schlameuss <schlameuss@linux.ibm.com>

KVM: s390: vsie: Replace radix_tree with xarray addr_to_page

This commit replaces the radix_tree implementation in the s390 vsie with
an xarray for addr_to_page. Changing to the xarray API directly relaxes some
of the locking obligations and provides more symmetry with the next vsie
changes in the series.

> diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
> index 4090b4019f215..1734215ae73a9 100644
> --- a/arch/s390/kvm/vsie.c
> +++ b/arch/s390/kvm/vsie.c
[ ... ]
> @@ -1574,14 +1569,13 @@ static struct vsie_page *get_vsie_page(struct kvm *kvm, unsigned long addr)
>  			kvm->arch.vsie.next %= nr_vcpus;
>  		}
>  		if (vsie_page->scb_gpa != ULONG_MAX)
> -			radix_tree_delete(&kvm->arch.vsie.addr_to_page,
> -					  vsie_page->scb_gpa >> 9);
> +			xa_erase(&kvm->arch.vsie.addr_to_page, vsie_page->scb_gpa >> 9);
>  		/* Mark it as invalid until it resides in the tree. */
>  		vsie_page->scb_gpa = ULONG_MAX;
>  	}
>  
>  	/* Double use of the same address or allocation failure. */
> -	if (radix_tree_insert(&kvm->arch.vsie.addr_to_page, addr >> 9, vsie_page)) {
> +	if (xa_store(&kvm->arch.vsie.addr_to_page, addr >> 9, vsie_page, GFP_KERNEL)) {

[Severity: High]
Does this unintentionally change the error handling semantics by using
xa_store() instead of xa_insert()?

The original radix_tree_insert() correctly refused to overwrite existing
entries and returned an error (e.g., -EEXIST). However, xa_store()
unconditionally overwrites the entry and returns the previous pointer or an
error pointer on failure.

If an entry already exists, xa_store() returns the old vsie_page pointer,
which evaluates to true. The code incorrectly treats this as an error, calling
put_vsie_page() on the newly inserted page while returning NULL. The new page
remains in the xarray but its scb_gpa is left as ULONG_MAX, breaking lookups
for this address.

Also, should this be using GFP_KERNEL_ACCOUNT to maintain the accounting
properties of the original code?

>  		put_vsie_page(vsie_page);
>  		mutex_unlock(&kvm->arch.vsie.mutex);
>  		return NULL;
[ ... ]
> @@ -1660,7 +1654,7 @@ int kvm_s390_handle_vsie(struct kvm_vcpu *vcpu)
>  void kvm_s390_vsie_init(struct kvm *kvm)
>  {
>  	mutex_init(&kvm->arch.vsie.mutex);
> -	INIT_RADIX_TREE(&kvm->arch.vsie.addr_to_page, GFP_KERNEL_ACCOUNT);
> +	xa_init_flags(&kvm->arch.vsie.addr_to_page, XA_FLAGS_ALLOC);

[Severity: Medium]
Should this use XA_FLAGS_ACCOUNT (or 0) instead of XA_FLAGS_ALLOC?

The original code initialized the radix tree with GFP_KERNEL_ACCOUNT, ensuring
that memory allocated for internal nodes was accounted to the guest's memory
cgroup. Initializing with XA_FLAGS_ALLOC and storing with GFP_KERNEL drops this
accounting.

Additionally, XA_FLAGS_ALLOC enables internal free-slot tracking
(XA_FLAGS_TRACK_FREE) which is typically meant for ID allocators (like
xa_alloc()). Using this on an xarray indexed by sparse physical addresses adds
unnecessary overhead.

>  }
>  
>  /* Destroy the vsie data structures. To be called when a vm is destroyed. */
> @@ -1676,10 +1670,8 @@ void kvm_s390_vsie_destroy(struct kvm *kvm)
>  			if (vsie_page->gmap_cache.gmap)
>  				release_gmap_shadow(vsie_page);
>  		kvm->arch.vsie.pages[i] = NULL;
> -		/* free the radix tree entry */
>  		if (vsie_page->scb_gpa != ULONG_MAX)
> -			radix_tree_delete(&kvm->arch.vsie.addr_to_page,
> -					  vsie_page->scb_gpa >> 9);
> +			xa_erase(&kvm->arch.vsie.addr_to_page, vsie_page->scb_gpa >> 9);
>  		free_vsie_page(vsie_page);
>  	}
>  	kvm->arch.vsie.page_count = 0;

[Severity: Medium]
Will this leak the xarray internal nodes when tearing down a VM?

If any page was left with scb_gpa == ULONG_MAX (e.g., due to the xa_store()
issue mentioned above), xa_erase() is skipped for that entry.

Because the VM destruction path never calls
xa_destroy(&kvm->arch.vsie.addr_to_page), the xarray internal nodes allocated
for any remaining entries will be permanently leaked. Should xa_destroy() be
called here to guarantee all internal memory is freed?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260709-vsie-sigpi-v1-0-ea9f12066408@linux.ibm.com?part=12

  reply	other threads:[~2026-07-09 15:25 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-09 15:15 [PATCH 00/21] KVM: s390: vsie: Add VSIE SIGP Interpretation (vsie_sigpi) Christoph Schlameuss
2026-07-09 15:15 ` [PATCH 01/21] KVM: s390: Remove double 64bscao feature check Christoph Schlameuss
2026-07-09 15:15 ` [PATCH 02/21] KVM: s390: vsie: Remove duplicate assertion Christoph Schlameuss
2026-07-09 15:15 ` [PATCH 03/21] KVM: s390: vsie: Convert shift to phys_to_pfn() Christoph Schlameuss
2026-07-09 15:15 ` [PATCH 04/21] KVM: s390: vsie: Add SCAO read and write helpers Christoph Schlameuss
2026-07-09 15:24   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 05/21] KVM: s390: vsie: Move SCAO validation into a function Christoph Schlameuss
2026-07-09 15:26   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 06/21] KVM: s390: vsie: Add vsie_sigpif detection Christoph Schlameuss
2026-07-09 15:32   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 07/21] KVM: s390: vsie: Add ssca_block and ssca_entry structs for vsie_ie Christoph Schlameuss
2026-07-09 15:24   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 08/21] KVM: s390: vsie: Move pin/unpin_scb methods Christoph Schlameuss
2026-07-09 15:15 ` [PATCH 09/21] KVM: s390: vsie: Move pin/unpin guest page Christoph Schlameuss
2026-07-09 15:15 ` [PATCH 10/21] KVM: s390: vsie: Move release/acquire gmap shadow Christoph Schlameuss
2026-07-09 15:15 ` [PATCH 11/21] KVM: s390: vsie: Create helpers to alloc and free vsie_pages Christoph Schlameuss
2026-07-09 15:23   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 12/21] KVM: s390: vsie: Replace radix_tree with xarray addr_to_page Christoph Schlameuss
2026-07-09 15:25   ` sashiko-bot [this message]
2026-07-09 15:15 ` [PATCH 13/21] KVM: s390: vsie: Add helper to pin multiple guest pages Christoph Schlameuss
2026-07-09 15:28   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 14/21] KVM: s390: vsie: Add helper to release gmap shadow Christoph Schlameuss
2026-07-09 15:30   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 15/21] KVM: s390: vsie: Add struct vsie_sca with pin and unpin Christoph Schlameuss
2026-07-09 15:31   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 16/21] KVM: s390: vsie: Shadow VSIE SCA in guest-1 Christoph Schlameuss
2026-07-09 15:37   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 17/21] KVM: s390: vsie: Allow guest-3 cpu add and remove with vsie sigpif Christoph Schlameuss
2026-07-09 15:35   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 18/21] KVM: s390: vsie: Add VSIE max shadow configuration Christoph Schlameuss
2026-07-09 15:35   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 19/21] KVM: s390: vsie: Add VSIE shadow stat counters Christoph Schlameuss
2026-07-09 15:30   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 20/21] KVM: s390: vsie: Create minimal scb shadows for not running g3 blocks Christoph Schlameuss
2026-07-09 15:47   ` sashiko-bot
2026-07-09 15:15 ` [PATCH 21/21] KVM: s390: vsie: Enable VSIE SIGPI Christoph Schlameuss
2026-07-09 15:44   ` sashiko-bot
2026-07-14 14:49 ` [PATCH 00/21] KVM: s390: vsie: Add VSIE SIGP Interpretation (vsie_sigpi) Janosch Frank

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=20260709152540.596461F00A3A@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=agordeev@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 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.