All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
To: sashiko-reviews@lists.linux.dev
Cc: "Andrew Morton" <akpm@linux-foundation.org>,
	"Baoquan He" <baoquan.he@linux.dev>,
	"Mike Rapoport" <rppt@kernel.org>,
	"Pasha Tatashin" <pasha.tatashin@soleen.com>,
	"Pratyush Yadav" <pratyush@kernel.org>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Jason Gunthorpe" <jgg@ziepe.ca>,
	"Joerg Roedel" <joro@8bytes.org>, "Marc Zyngier" <maz@kernel.org>,
	"Marek Szyprowski" <m.szyprowski@samsung.com>,
	"Robin Murphy" <robin.murphy@arm.com>,
	"Steven Price" <steven.price@arm.com>,
	"Sumit Semwal" <sumit.semwal@linaro.org>,
	"Suzuki K Poulose" <suzuki.poulose@arm.com>,
	"Thomas Gleixner" <tglx@kernel.org>,
	"Will Deacon" <will@kernel.org>,
	"Russell King" <linux@armlinux.org.uk>,
	"Benjamin Gaignard" <benjamin.gaignard@collabora.com>,
	"Brian Starkey" <Brian.Starkey@arm.com>,
	"John Stultz" <jstultz@google.com>,
	"Mark Rutland" <mark.rutland@arm.com>,
	"Radu Rendec" <radu@rendec.net>,
	"T.J. Mercier" <tjmercier@google.com>,
	"Madhavan Srinivasan" <maddy@linux.ibm.com>,
	"Michael Ellerman" <mpe@ellerman.id.au>,
	"Nicholas Piggin" <npiggin@gmail.com>,
	"Christophe Leroy" <chleroy@kernel.org>,
	"Ritesh Harjani" <ritesh.list@gmail.com>,
	"Shrikanth Hegde" <sshegde@linux.ibm.com>,
	"Alexander Gordeev" <agordeev@linux.ibm.com>,
	"Gerald Schaefer" <gerald.schaefer@linux.ibm.com>,
	"Heiko Carstens" <hca@linux.ibm.com>,
	"Vasily Gorbik" <gor@linux.ibm.com>,
	"Christian Borntraeger" <borntraeger@linux.ibm.com>,
	"Sven Schnelle" <svens@linux.ibm.com>,
	"Ingo Molnar" <mingo@redhat.com>,
	"Borislav Petkov" <bp@alien8.de>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	x86@kernel.org, "H . Peter Anvin" <hpa@zytor.com>,
	"Kiryl Shutsemau" <kas@kernel.org>,
	"Rick Edgecombe" <rick.p.edgecombe@intel.com>,
	"K . Y . Srinivasan" <kys@microsoft.com>,
	"Haiyang Zhang" <haiyangz@microsoft.com>,
	"Wei Liu" <wei.liu@kernel.org>,
	"Dexuan Cui" <decui@microsoft.com>,
	"Long Li" <longli@microsoft.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Vitaly Kuznetsov" <vkuznets@redhat.com>,
	"Andy Lutomirski" <luto@kernel.org>,
	"Peter Zijlstra" <peterz@infradead.org>,
	dri-devel@lists.freedesktop.org, linux-mm@kvack.org,
	kvmarm@lists.linux.dev, "Oliver Upton" <oupton@kernel.org>,
	media-ci@linuxtv.org
Subject: Re: [PATCH v9 01/14] mm: Add an allocator for CoCo shared memory
Date: Thu, 12 Nov 2026 22:19:41 +0530	[thread overview]
Message-ID: <yq5ay0aygfkq.fsf@kernel.org> (raw)
In-Reply-To: <sashiko-outbox-199539@kernel.org>

sashiko-bot@kernel.org writes:

> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] mm: invalid cc_make_private() call on cc_make_shared() failure
> --
>
> commit 8a434c0ee7399613dbf060530383d80bbc1ab7af
> Author: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
>
> mm: Add an allocator for CoCo shared memory
>
> This commit introduces a common allocator and transition helpers for
> confidential-computing shared memory, including alloc_cc_shared_pages(),
> alloc_cc_shared_pages_node(), and free_cc_shared_pages().
>
>> diff --git a/mm/cc_shared.c b/mm/cc_shared.c
>> new file mode 100644
>> index 0000000000000..5c4c971cfb7b2
>> --- /dev/null
>> +++ b/mm/cc_shared.c
>> @@ -0,0 +1,233 @@
>
> [ ... ]
>
>> +static int __alloc_cc_shared_pages_node(int nid, gfp_t gfp,
>> +					size_t requested,
>> +					struct cc_shared_pages *mem)
>> +{
>> +	struct cc_shared_layout layout;
>> +	struct page *page;
>> +	unsigned int order;
>> +	bool zero = gfp & __GFP_ZERO;
>> +	int ret;
>> +
>> +	ret = cc_shared_calc_layout(requested, &layout);
>> +	if (ret)
>> +		return ret;
>> +
>> +	order = get_order(layout.shared_size);
>> +	if (order > MAX_PAGE_ORDER)
>> +		return -EINVAL;
>> +	/*
>> +	 * State transitions require a linear-map address and may modify memory.
>> +	 * Allocate from low memory and defer requested zeroing until afterwards.
>> +	 * Shared allocations have no migration support, so they must not
>> +	 * be allocated with __GFP_MOVABLE.
>> +	 */
>> +	gfp &= ~(__GFP_HIGHMEM | __GFP_ZERO | __GFP_MOVABLE);
>> +	if (nid == NUMA_NO_NODE)
>> +		page = alloc_pages(gfp, order);
>> +	else
>> +		page = alloc_pages_node(nid, gfp, order);
>> +	if (!page)
>> +		return -ENOMEM;
>> +
>> +	ret = cc_make_shared(page_address(page), layout.shared_size);
>> +	if (ret) {
>> +		if (!cc_make_private(page_address(page), layout.shared_size))
>> +			__free_pages(page, order);
>> +		else
>> +			pr_warn_ratelimited("leaking %zu bytes with uncertain shared state\n",
>> +					    layout.shared_size);
>> +		return ret;
>> +	}
>
> [Severity: High]
> Is it safe to call cc_make_private() across the entire layout.shared_size
> range when cc_make_shared() fails in __alloc_cc_shared_pages_node()?
>
> When cc_make_shared() fails via set_memory_decrypted(), the pages in the
> range may not have been transitioned to shared state at all, or only a prefix
> of the range may have been transitioned.
>
> For example, on x86 TDX in arch/x86/mm/pat/set_memory.c and
> arch/x86/coco/tdx/tdx.c:
>
> __set_memory_enc_pgtable() {
> 	ret = x86_platform.guest.enc_status_change_prepare(addr, numpages, enc);
> 	if (ret)
> 		goto vmm_fail;
>
> 	ret = __change_page_attr_set_clr(&cpa, 1);
> 	...
> 	if (ret)
> 		return ret;
>
> 	ret = x86_platform.guest.enc_status_change_finish(addr, numpages, enc);
> 	if (ret)
> 		goto vmm_fail;
> }
>
> tdx_enc_status_change_finish() {
> 	if (!enc && !tdx_enc_status_changed(vaddr, numpages, enc))
> 		return -EIO;
>
> 	if (enc)
> 		atomic_long_sub(numpages, &nr_shared);
> 	else
> 		atomic_long_add(numpages, &nr_shared);
>
> 	return 0;
> }
>
> If set_memory_decrypted() (enc = false) fails with -EBUSY on mem_enc_lock or
> with -ENOMEM in __change_page_attr_set_clr() before
> tdx_enc_status_change_finish() is reached, the pages remain private and
> accepted in the TDX module, and nr_shared is not incremented. Calling
> cc_make_private() (set_memory_encrypted(), enc = true) then invokes
> tdx_enc_status_change_prepare() -> tdx_accept_memory() -> try_accept_one() on
> already-accepted private memory, which fails and jumps to vmm_fail in
> __set_memory_enc_pgtable(), triggering a spurious WARN_ONCE and leaking memory
> that was never shared.
>
> Conversely, if tdx_enc_status_change_finish() fails during cc_make_shared()
> before atomic_long_add(numpages, &nr_shared), and the subsequent
> cc_make_private() call succeeds, tdx_enc_status_change_finish() will execute
> atomic_long_sub(numpages, &nr_shared), underflowing nr_shared and corrupting
> the accounting checked in tdx_kexec_finish().
>
> Similarly, on arm64 pKVM in drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c,
> pkvm_set_memory_decrypted() shares pages one by one and stops at the first
> failing page, leaving the remaining pages private. Calling cc_make_private()
> across the full range then invokes KVM_MEM_UNSHARE on private pages, which
> fails with -EPERM.
>
> Other callers in the kernel (such as dma_direct_alloc_pages(),
> atomic_pool_expand(), and swiotlb_init_late()) do not call
> set_memory_encrypted() when set_memory_decrypted() fails, and instead leak the
> pages directly because the transition state of the range is unknown. Should
> __alloc_cc_shared_pages_node() do the same here instead of calling
> cc_make_private()?
>

Yes, I agree that we should do this. Something like:

modified   kernel/dma/swiotlb.c
@@ -748,14 +748,9 @@ static struct page *alloc_dma_pages(gfp_t gfp, size_t bytes,
 
 	vaddr = phys_to_virt(paddr);
 	if (cc_shared && cc_make_shared(vaddr, bytes))
-		goto error;
+		/* leak pages on error */
+		return NULL;
 	return page;
-
-error:
-	/* Intentional leak if pages cannot be encrypted again. */
-	if (cc_shared && !cc_make_private(vaddr, bytes))
-		__free_pages(page, order);
-	return NULL;
 }
 
 /**
modified   mm/cc_shared.c
@@ -133,11 +133,16 @@ static int __alloc_cc_shared_pages_node(int nid, gfp_t gfp,
 
 	ret = cc_make_shared(page_address(page), layout.shared_size);
 	if (ret) {
-		if (!cc_make_private(page_address(page), layout.shared_size))
-			__free_pages(page, order);
-		else
-			pr_warn_ratelimited("leaking %zu bytes with uncertain shared state\n",
-					    layout.shared_size);
+		/*
+		 * A failed transition may leave the range partially
+		 * shared, with no indication of which pages changed state.
+		 * Converting the whole range back to private is not safe
+		 * on architectures that cannot handle pages which are
+		 * already private. Leak the allocation rather than return
+		 * pages with uncertain state to the allocator.
+		 */
+		pr_warn_ratelimited("leaking %zu bytes with uncertain shared state\n",
+				    layout.shared_size);
 		return ret;
 	}
 

  reply	other threads:[~2026-11-12 16:50 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-04 16:45 [PATCH v9 00/14] coco: guest: Add a shared-granule allocator for host-shared memory Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 01/14] mm: Add an allocator for CoCo shared memory Aneesh Kumar K.V (Arm)
2026-11-05 16:52   ` sashiko-bot
2026-11-12 16:49     ` Aneesh Kumar K.V [this message]
2026-11-06 14:41   ` Suzuki K Poulose
2026-11-06 15:30     ` Aneesh Kumar K.V
2026-11-06 15:34       ` Suzuki K Poulose
2026-11-04 16:45 ` [PATCH v9 02/14] mm: Zero memory during shared memory transitions Aneesh Kumar K.V (Arm)
2026-11-05 16:52   ` sashiko-bot
2026-11-04 16:45 ` [PATCH v9 03/14] irqchip/gic-v3-its: Resolve the default NUMA node explicitly Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 04/14] irqchip/gic-v3-its: Allocate shared tables using CoCo shared memory allocator Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 05/14] dma-contiguous: Derive shared alignment from DMA attributes Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 06/14] dma-pool: Allocate CoCo atomic pools using CoCo shared memory allocator Aneesh Kumar K.V (Arm)
2026-11-05 16:52   ` sashiko-bot
2026-11-04 16:45 ` [PATCH v9 07/14] dma-direct: Align CoCo shared DMA allocations to the shared granule size Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 08/14] swiotlb: Align shared IO TLB pools " Aneesh Kumar K.V (Arm)
2026-11-05 16:52   ` sashiko-bot
2026-11-04 16:45 ` [PATCH v9 09/14] swiotlb: Reject misaligned restricted DMA pools for CoCo guests Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 10/14] dma-buf: system_heap: Limit scatterlist entries to the buffer size Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 11/14] dma-buf: system_heap: Allocate shared buffers using CoCo shared memory allocator Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 12/14] swiotlb: Make rounded shared pool capacity allocatable Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 13/14] mm: Assert CoCo shared allocations may sleep Aneesh Kumar K.V (Arm)
2026-11-04 16:45 ` [PATCH v9 14/14] irqchip/gic-v3-its: Preallocate VPE L1 tables Aneesh Kumar K.V (Arm)
2026-11-05 16:20   ` Marc Zyngier
2026-11-06 15:45     ` Aneesh Kumar K.V
2026-11-05 16:52   ` 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=yq5ay0aygfkq.fsf@kernel.org \
    --to=aneesh.kumar@kernel.org \
    --cc=Brian.Starkey@arm.com \
    --cc=agordeev@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=baoquan.he@linux.dev \
    --cc=benjamin.gaignard@collabora.com \
    --cc=borntraeger@linux.ibm.com \
    --cc=bp@alien8.de \
    --cc=catalin.marinas@arm.com \
    --cc=chleroy@kernel.org \
    --cc=christian.koenig@amd.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=decui@microsoft.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gerald.schaefer@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=haiyangz@microsoft.com \
    --cc=hca@linux.ibm.com \
    --cc=hpa@zytor.com \
    --cc=jgg@ziepe.ca \
    --cc=joro@8bytes.org \
    --cc=jstultz@google.com \
    --cc=kas@kernel.org \
    --cc=kvmarm@lists.linux.dev \
    --cc=kys@microsoft.com \
    --cc=linux-mm@kvack.org \
    --cc=linux@armlinux.org.uk \
    --cc=longli@microsoft.com \
    --cc=luto@kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=maddy@linux.ibm.com \
    --cc=mark.rutland@arm.com \
    --cc=maz@kernel.org \
    --cc=media-ci@linuxtv.org \
    --cc=mingo@redhat.com \
    --cc=mpe@ellerman.id.au \
    --cc=npiggin@gmail.com \
    --cc=oupton@kernel.org \
    --cc=pasha.tatashin@soleen.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=pratyush@kernel.org \
    --cc=radu@rendec.net \
    --cc=rick.p.edgecombe@intel.com \
    --cc=ritesh.list@gmail.com \
    --cc=robin.murphy@arm.com \
    --cc=rppt@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=sshegde@linux.ibm.com \
    --cc=steven.price@arm.com \
    --cc=sumit.semwal@linaro.org \
    --cc=suzuki.poulose@arm.com \
    --cc=svens@linux.ibm.com \
    --cc=tglx@kernel.org \
    --cc=tjmercier@google.com \
    --cc=vkuznets@redhat.com \
    --cc=wei.liu@kernel.org \
    --cc=will@kernel.org \
    --cc=x86@kernel.org \
    /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.