mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Christian König" <christian.koenig@amd.com>
To: Catalin Marinas <catalin.marinas@arm.com>,
	"Aneesh Kumar K.V (Arm)" <aneesh.kumar@kernel.org>
Cc: linux-coco@lists.linux.dev, kvmarm@lists.linux.dev,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, iommu@lists.linux.dev,
	Jason Gunthorpe <jgg@ziepe.ca>, Marc Zyngier <maz@kernel.org>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Robin Murphy <robin.murphy@arm.com>,
	Steven Price <steven.price@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Thomas Gleixner <tglx@kernel.org>, Will Deacon <will@kernel.org>,
	Sumit Semwal <sumit.semwal@linaro.org>,
	"T.J. Mercier" <tjmercier@google.com>
Subject: Re: [PATCH v6 7/9] dma-buf: system_heap: Enforce shared-granule alignment for cc-shared buffers
Date: Fri, 18 Sep 2026 17:23:32 +0200	[thread overview]
Message-ID: <97c30fce-9bda-4c61-b1b9-10297b89c8d9@amd.com> (raw)
In-Reply-To: <aq1V3oeDdvXobt8J@arm.com>

On 9/18/26 17:16, Catalin Marinas wrote:
> First, none of the DMA-BUF maintainers have been cc'ed. It might be fine
> for an RFC but this series got to version 6. We need their feedback.

Yeah, thanks for doing this.
> On Fri, Sep 04, 2026 at 04:04:50PM +0530, Aneesh Kumar K.V (Arm) wrote:
>> The system heap can allocate buffers that are decrypted and shared with the
>> host. For confidential-computing guests, those shared buffers must cover
>> whole shared-buffer granule; otherwise a userspace mmap of the dma-buf may
>> expose only part of a host-managed granule and allow unintended access to
>> adjacent private memory.
>>
>> Require cc-shared system-heap allocations to have a size aligned to
>> mem_cc_shared_granule_size(), and allocate pages at least as large as the
>> required granule. Keep the allocation bounded by the existing heap orders,
>> but fall back to an exact minimum-order allocation when the required
>> granule is not one of the preferred heap orders.

Uff, I don't think we can do that.

That is massively platform specific behavior in a non platform specific code.

When the architecture can only expose unencrypted memory in larger chunks than the only real alternative is to use bounce buffers and those are incompatible with DMA-buf.

Additional to that you can trivially circumvent this with a memfd and udmabuf, so you most likely don't win anything with that.

Regards,
Christian.

>>
>> Signed-off-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
>> ---
>>  drivers/dma-buf/heaps/system_heap.c | 50 +++++++++++++++++++++++------
>>  1 file changed, 41 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/dma-buf/heaps/system_heap.c b/drivers/dma-buf/heaps/system_heap.c
>> index c8959eadc71d..9cbfcebe2088 100644
>> --- a/drivers/dma-buf/heaps/system_heap.c
>> +++ b/drivers/dma-buf/heaps/system_heap.c
>> @@ -55,7 +55,6 @@ struct dma_heap_attachment {
>>  #define HIGH_ORDER_GFP  (((GFP_HIGHUSER | __GFP_ZERO | __GFP_NOWARN \
>>  				| __GFP_NORETRY) & ~__GFP_RECLAIM) \
>>  				| __GFP_COMP)
>> -static gfp_t order_flags[] = {HIGH_ORDER_GFP, HIGH_ORDER_GFP, LOW_ORDER_GFP};
>>  /*
>>   * The selection of the orders used for allocation (1MB, 64K, 4K) is designed
>>   * to match with the sizes often found in IOMMUs. Using order 4 pages instead
>> @@ -375,26 +374,44 @@ static const struct dma_buf_ops system_heap_buf_ops = {
>>  	.release = system_heap_dma_buf_release,
>>  };
>>  
>> +static struct page *system_heap_alloc_order(unsigned int order)
>> +{
>> +	gfp_t flags = order ? HIGH_ORDER_GFP : LOW_ORDER_GFP;
>> +
>> +	if (mem_accounting)
>> +		flags |= __GFP_ACCOUNT;
>> +
>> +	return alloc_pages(flags, order);
>> +}
>> +
>>  static struct page *alloc_largest_available(unsigned long size,
>> -					    unsigned int max_order)
>> +					    unsigned int max_order,
>> +					    unsigned int min_order)
>>  {
>>  	struct page *page;
>>  	int i;
>> -	gfp_t flags;
>>  
>>  	for (i = 0; i < NUM_ORDERS; i++) {
>>  		if (size <  (PAGE_SIZE << orders[i]))
>>  			continue;
>> -		if (max_order < orders[i])
>> +
>> +		if (max_order < orders[i] || orders[i] < min_order)
>>  			continue;
>> -		flags = order_flags[i];
>> -		if (mem_accounting)
>> -			flags |= __GFP_ACCOUNT;
>> -		page = alloc_pages(flags, orders[i]);
>> +
>> +		page = system_heap_alloc_order(orders[i]);
>>  		if (!page)
>>  			continue;
>>  		return page;
>>  	}
>> +	/*
>> +	 * The required minimum order might not be one of the preferred heap
>> +	 * orders. Allocate exactly min_order when it does not exceed the
>> +	 * remaining size.
>> +	 */
>> +	if (min_order && min_order <= max_order &&
>> +	    size >= (PAGE_SIZE << min_order))
>> +		return system_heap_alloc_order(min_order);
>> +
>>  	return NULL;
>>  }
>>  
>> @@ -409,6 +426,8 @@ static struct dma_buf *system_heap_allocate(struct dma_heap *heap,
>>  	unsigned int max_order = orders[0];
>>  	struct system_heap_priv *priv = dma_heap_get_drvdata(heap);
>>  	bool cc_shared = priv->cc_shared;
>> +	unsigned int min_order = 0;
>> +	size_t cc_granule_size;
>>  	struct dma_buf *dmabuf;
>>  	struct sg_table *table;
>>  	struct scatterlist *sg;
>> @@ -425,6 +444,18 @@ static struct dma_buf *system_heap_allocate(struct dma_heap *heap,
>>  	buffer->heap = heap;
>>  	buffer->len = len;
>>  	buffer->cc_shared = cc_shared;
>> +	if (cc_shared_buffer(buffer)) {
>> +		cc_granule_size = mem_cc_shared_granule_size();
>> +		if (!IS_ALIGNED(len, cc_granule_size)) {
>> +			ret = -EINVAL;
>> +			goto free_buffer;
>> +		}
>> +		min_order = get_order(cc_granule_size);
>> +		if (min_order > max_order) {
>> +			ret = -EINVAL;
>> +			goto free_buffer;
>> +		}
>> +	}
>>  
>>  	INIT_LIST_HEAD(&pages);
> 
> You need to get a proper base so that Sashiko can review this series. I
> ran it through Claude and the above is wrong to go to free_buffer which
> walks over the pages list that has not been initialised yet.
> 
> Another issue, I'm just copying it verbatim:
> 
> drivers/dma-buf/heaps/system_heap.c:379 (patch 7/9)
> system_heap_alloc_order() picks "order ? HIGH_ORDER_GFP :
> LOW_ORDER_GFP".  HIGH_ORDER_GFP clears __GFP_RECLAIM and sets
> __GFP_NORETRY, which was fine while orders 8/4 always had order 0 as a
> fallback.  The new min_order fallback at line 411 has no smaller order
> to fall back to - it is the mandatory minimum.  On a 16K-page host with
> a 4K-page guest, min_order = get_order(SZ_16K) = 2, which is not in
> orders[] = {8, 4, 0}, and order 0 is filtered out by "orders[i] <
> min_order".  Every tail allocation below 64K therefore goes through the
> non-reclaiming fallback and returns -ENOMEM under pressure that ordinary
> reclaim would have cleared.  Note any fix must keep __GFP_COMP:
> compound_order()/page_size() are used on the result
> (system_heap_set_page_decrypted(), the free paths and sg_set_page()).
> 


  reply	other threads:[~2026-09-18 15:23 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-04 10:34 [PATCH v6 0/9] coco: guest: Enforce host page-size alignment for shared buffers Aneesh Kumar K.V (Arm)
2026-09-04 10:34 ` [PATCH v6 1/9] mm/mem_encrypt: Add helpers for shared-buffer alignment Aneesh Kumar K.V (Arm)
2026-09-04 10:34 ` [PATCH v6 2/9] irqchip/gic-v3-its: Align shared ITS allocations to the CoCo shared granule size Aneesh Kumar K.V (Arm)
2026-09-04 10:34 ` [PATCH v6 3/9] dma-mapping: Pass allocation attrs to contiguous allocation helpers Aneesh Kumar K.V (Arm)
2026-09-04 10:34 ` [PATCH v6 4/9] dma-direct: Align CoCo shared DMA allocations to the shared granule size Aneesh Kumar K.V (Arm)
2026-09-18 14:16   ` Catalin Marinas
2026-09-04 10:34 ` [PATCH v6 5/9] swiotlb: Align shared IO TLB pools " Aneesh Kumar K.V (Arm)
2026-09-04 10:34 ` [PATCH v6 6/9] swiotlb: Reject misaligned restricted DMA pools for CoCo guests Aneesh Kumar K.V (Arm)
2026-09-04 10:34 ` [PATCH v6 7/9] dma-buf: system_heap: Enforce shared-granule alignment for cc-shared buffers Aneesh Kumar K.V (Arm)
2026-09-18 15:16   ` Catalin Marinas
2026-09-18 15:23     ` Christian König [this message]
2026-09-18 15:36       ` Jason Gunthorpe
2026-09-18 15:39         ` Christian König
2026-09-18 16:53           ` Jason Gunthorpe
2026-09-04 10:34 ` [PATCH v6 8/9] arm64: realm: Add RHI helper to query IPA state change alignment Aneesh Kumar K.V (Arm)
2026-09-16 16:12   ` Suzuki K Poulose
2026-09-18 10:39     ` Aneesh Kumar K.V
2026-09-04 10:34 ` [PATCH v6 9/9] arm64: realm: Expose the CCA shared granule size through mem_encrypt ops Aneesh Kumar K.V (Arm)
2026-09-16 16:17   ` Suzuki K Poulose
2026-09-18 16:52 ` [PATCH v6 0/9] coco: guest: Enforce host page-size alignment for shared buffers Catalin Marinas
2026-09-18 16:57   ` Jason Gunthorpe
2026-09-18 17:10     ` Catalin Marinas

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=97c30fce-9bda-4c61-b1b9-10297b89c8d9@amd.com \
    --to=christian.koenig@amd.com \
    --cc=aneesh.kumar@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@ziepe.ca \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-coco@lists.linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=maz@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=steven.price@arm.com \
    --cc=sumit.semwal@linaro.org \
    --cc=suzuki.poulose@arm.com \
    --cc=tglx@kernel.org \
    --cc=tjmercier@google.com \
    --cc=will@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®