From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793810946; b=TLMsnRnQdJYA8p6vsoW/cxrAiH0oYXTd8EjNRWSG4bU1xDI95PtOunkY978JfaXpeR3L PWen7Ml5LQLqAscS2DZukdKTn8UJSnlhPjX8WxtOq6BiwoZQa4HZ684zZLPh/56RxDD/+ SUfXlJ5R0RdLSC8JBpxmjAWS+381ci9tZLMBhM9lBQ6JqyJYqEeND0oJYiGTMN167RHte j4jHLdBqrf3fMI4zq99kv8nxOcTf00S3j+QsfjY7mnsxhzy6UrRiYC918NlAlHGpvgf9U 2ZeDgrrO++22E7dm9UgPWNFc/3q5SecfWTyr6uTO9+E8cN5N4wcPCI+BJqirCLeoKDw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793810946; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=MTuN8WVsJv1I02LCGu8efiiNsZogL+1Yfc4bQSdZvsk=; b=pRymPJWNk7whKqNINVi55ixxyMmCTy45kXNxTZkETf6wUYTE87ONe77eGJhYi/T9qf7N /DK3TH/B9ukfYb03nz7f5wXb7bdrEENiy29lV2ZBElf9dbkatq5JrFW6eeyNOX9yFjR7s tTS0qyydq/rRh5T9ghEsmdfKv8F3CA8J9TamAerwN+fqO6KqS5/o1EVOuF8xeahsnEDrE oYIy/5C43Px2f6cUHv6NwaZbQ/lUnmPyXevcW0FPThOv0aeIMRahuIaS6sVT30K0UnxLJ wkhSdaTo6dfSKkhR4q4K1xjp3fP6Z5v8tHKCl4bI5w8VPFTmTuZfC72DSUe/dxJQ6NA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=MEcDEw27; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97779606A332; Wed, 4 Nov 2026 16:49:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=MEcDEw27 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 729B31F00A16; Wed, 4 Nov 2026 16:48:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793810946; bh=MTuN8WVsJv1I02LCGu8efiiNsZogL+1Yfc4bQSdZvsk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=MEcDEw27BmTAfTMR6Cs9edMuq5bUFf456+f7urheAWgzZwKe3xiSRJwKzGdjEHrql cWQChlV+swCc/ygmAzMyiRWeOKZ3Zod/MJSCs4YKVkNStHFTLRFr7XRBJ8i5AnMbKY xqA4KFGzKcLF5V5hzQC9xy1/MBVZqxg2YMICnQgWgPIDOfHqlNpTjBWubGbW90j7D3 D0drESx7uAuvVDS0zy/rHr7ySr1/jyVgjdV22PcJM/OCZCQmovnK5aPzD+Cdti/yIQ lKiKVpIBLzXK2llg4QBU5uz2PV8xkxY2ReMwYaMDuEVANuLVPYjGgcEv+YGQXff5mX FO6mCsNo9+sYg== From: "Aneesh Kumar K.V (Arm)" To: linux-coco@lists.linux.dev Cc: "Aneesh Kumar K.V (Arm)" , Andrew Morton , Baoquan He , Mike Rapoport , Pasha Tatashin , Pratyush Yadav , Catalin Marinas , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jason Gunthorpe , Joerg Roedel , Marc Zyngier , Marek Szyprowski , Robin Murphy , Steven Price , Sumit Semwal , Suzuki K Poulose , Thomas Gleixner , Will Deacon , Russell King , Benjamin Gaignard , Brian Starkey , John Stultz , Mark Rutland , Radu Rendec , "T.J. Mercier" , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Ritesh Harjani , Shrikanth Hegde , Alexander Gordeev , Gerald Schaefer , Heiko Carstens , Vasily Gorbik , Christian Borntraeger , Sven Schnelle , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H . Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe , "K . Y . Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Long Li , Paolo Bonzini , Vitaly Kuznetsov , Andy Lutomirski , Peter Zijlstra , dri-devel@lists.freedesktop.org, iommu@lists.linux.dev, linaro-mm-sig@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org, linux-mm@kvack.org, kvmarm@lists.linux.dev, patches@lists.linux.dev Subject: [PATCH v9 08/14] swiotlb: Align shared IO TLB pools to the shared granule size Date: Wed, 4 Nov 2026 22:15:49 +0530 Message-ID: <20261104164555.3555725-9-aneesh.kumar@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261104164555.3555725-1-aneesh.kumar@kernel.org> References: <20261104164555.3555725-1-aneesh.kumar@kernel.org> X-Mailing-List: linux-coco@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Align and size the early memblock pool to the common CoCo shared granule. Use the same rounded extent when the pool is transitioned and when it is released. This deliberately leaves the slot count unchanged: any rounded tail belongs to the pool allocation but is not advertised as allocatable SWIOTLB space. Replace the default and dynamic pool set_memory calls with the helpers so alignment validation and architecture dispatch are kept in one place. As before, pages are intentionally leaked if their private state cannot be restored safely. Cc: Marek Szyprowski Cc: Robin Murphy Signed-off-by: Aneesh Kumar K.V (Arm) --- kernel/dma/swiotlb.c | 47 +++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c index 2c57b49ac7c0..36fbec2241e4 100644 --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -38,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -367,13 +367,13 @@ void __init swiotlb_update_mem_attributes(void) if (!mem->nslabs || mem->late_alloc) return; - bytes = PAGE_ALIGN(mem->nslabs << IO_TLB_SHIFT); + + bytes = ALIGN(mem->nslabs << IO_TLB_SHIFT, cc_shared_granule_size()); if (io_tlb_default_mem.cc_shared) { int ret; - ret = set_memory_decrypted((unsigned long)mem->vaddr, - bytes >> PAGE_SHIFT); + ret = cc_make_shared(mem->vaddr, bytes); if (ret) { pr_warn("Failed to decrypt default memory pool, disabling it\n"); swiotlb_mark_pool_used(mem); @@ -434,8 +434,8 @@ static void __init *swiotlb_memblock_alloc(unsigned long nslabs, unsigned int flags, int (*remap)(void *tlb, unsigned long nslabs)) { - size_t bytes = PAGE_ALIGN(nslabs << IO_TLB_SHIFT); void *tlb; + size_t bytes = ALIGN(nslabs << IO_TLB_SHIFT, cc_shared_granule_size()); /* * By default allocate the bounce buffer memory from low memory, but @@ -443,9 +443,9 @@ static void __init *swiotlb_memblock_alloc(unsigned long nslabs, * memory encryption. */ if (flags & SWIOTLB_ANY) - tlb = memblock_alloc(bytes, PAGE_SIZE); + tlb = memblock_alloc(bytes, cc_shared_granule_size()); else - tlb = memblock_alloc_low(bytes, PAGE_SIZE); + tlb = memblock_alloc_low(bytes, cc_shared_granule_size()); if (!tlb) { pr_warn("%s: Failed to allocate %zu bytes tlb structure\n", @@ -454,7 +454,7 @@ static void __init *swiotlb_memblock_alloc(unsigned long nslabs, } if (remap && remap(tlb, nslabs) < 0) { - memblock_free(tlb, PAGE_ALIGN(bytes)); + memblock_free(tlb, bytes); pr_warn("%s: Failed to remap %zu bytes\n", __func__, bytes); return NULL; } @@ -576,7 +576,7 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, swiotlb_adjust_nareas(num_possible_cpus()); retry: - order = get_order(nslabs << IO_TLB_SHIFT); + order = get_order(ALIGN(nslabs << IO_TLB_SHIFT, cc_shared_granule_size())); nslabs = SLABS_PER_PAGE << order; while ((SLABS_PER_PAGE << order) > IO_TLB_MIN_SLABS) { @@ -585,6 +585,8 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, if (vstart) break; order--; + if (order < get_order(cc_shared_granule_size())) + break; nslabs = SLABS_PER_PAGE << order; retried = true; } @@ -598,8 +600,13 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, free_pages((unsigned long)vstart, order); nslabs = ALIGN(nslabs >> 1, IO_TLB_SEGSIZE); - if (nslabs < IO_TLB_MIN_SLABS) + if (nslabs <= IO_TLB_MIN_SLABS) return rc; + + /* Avoid infinite loop */ + if (WARN_ON(nslabs < (cc_shared_granule_size() >> IO_TLB_SHIFT))) + return rc; + retried = true; goto retry; } @@ -624,8 +631,7 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask, goto error_slots; if (io_tlb_default_mem.cc_shared) { - rc = set_memory_decrypted((unsigned long)vstart, - (nslabs << IO_TLB_SHIFT) >> PAGE_SHIFT); + rc = cc_make_shared(vstart, nslabs << IO_TLB_SHIFT); if (rc) { leak_pages = true; goto error_decrypt; @@ -665,11 +671,11 @@ void __init swiotlb_exit(void) pr_info("tearing down default memory pool\n"); tbl_vaddr = (unsigned long)phys_to_virt(mem->start); - tbl_size = PAGE_ALIGN(mem->end - mem->start); + tbl_size = ALIGN(mem->end - mem->start, cc_shared_granule_size()); slots_size = PAGE_ALIGN(array_size(sizeof(*mem->slots), mem->nslabs)); if (io_tlb_default_mem.cc_shared) { - if (set_memory_encrypted(tbl_vaddr, tbl_size >> PAGE_SHIFT)) + if (cc_make_private((void *)tbl_vaddr, tbl_size)) leak_pages = true; } @@ -709,12 +715,15 @@ void __init swiotlb_exit(void) static struct page *alloc_dma_pages(gfp_t gfp, size_t bytes, u64 phys_limit, unsigned long attrs) { - unsigned int order = get_order(bytes); bool cc_shared = attrs & __DMA_ATTR_ALLOC_CC_SHARED; + unsigned int order; struct page *page; phys_addr_t paddr; void *vaddr; + if (cc_shared) + bytes = ALIGN(bytes, cc_shared_granule_size()); + order = get_order(bytes); page = alloc_pages(gfp, order); if (!page) return NULL; @@ -726,13 +735,13 @@ static struct page *alloc_dma_pages(gfp_t gfp, size_t bytes, } vaddr = phys_to_virt(paddr); - if (cc_shared && set_memory_decrypted((unsigned long)vaddr, PFN_UP(bytes))) + if (cc_shared && cc_make_shared(vaddr, bytes)) goto error; return page; error: /* Intentional leak if pages cannot be encrypted again. */ - if (cc_shared && !set_memory_encrypted((unsigned long)vaddr, PFN_UP(bytes))) + if (cc_shared && !cc_make_private(vaddr, bytes)) __free_pages(page, order); return NULL; } @@ -805,9 +814,11 @@ static void swiotlb_free_tlb(void *vaddr, size_t bytes, bool cc_shared) dma_free_from_pool(NULL, vaddr, bytes)) return; + if (cc_shared) + bytes = ALIGN(bytes, cc_shared_granule_size()); /* Intentional leak if pages cannot be encrypted again. */ if (!cc_shared || - !set_memory_encrypted((unsigned long)vaddr, PFN_UP(bytes))) + !cc_make_private(vaddr, bytes)) __free_pages(virt_to_page(vaddr), get_order(bytes)); } -- 2.43.0