Thread (34 messages) 34 messages, 3 authors, 2025-02-06

Re: [PATCH 18/19] iommu: Update various drivers to pass in lg2sz instead of order to iommu pages

From: Jason Gunthorpe <jgg@nvidia.com>
Date: 2025-02-05 16:20:47
Also in: asahi, linux-iommu, linux-patches, linux-riscv, linux-rockchip, linux-samsung-soc, linux-sunxi, linux-tegra

On Wed, Feb 05, 2025 at 03:47:03PM +0000, Robin Murphy wrote:
On 2025-02-04 6:34 pm, Jason Gunthorpe wrote:
quoted
Convert most of the places calling get_order() as an argument to the
iommu-pages allocator into order_base_2() or the _sz flavour
instead. These places already have an exact size, there is no particular
reason to use order here.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
---
[...]
quoted
@@ -826,7 +825,7 @@ void *__init iommu_alloc_4k_pages(struct amd_iommu *iommu, gfp_t gfp,
  				  size_t size)
  {
  	int order = get_order(size);
-	void *buf = iommu_alloc_pages(gfp, order);
+	void *buf = iommu_alloc_pages_lg2(gfp, order + PAGE_SHIFT);
This is a size, really - it's right there above.
I didn't want to make major surgery to this thing, but yes it
could be:

void *__init iommu_alloc_4k_pages(struct amd_iommu *iommu, gfp_t gfp,
				  size_t size)
{
	void *buf;

	size = PAGE_ALIGN(size);
	buf = iommu_alloc_pages_sz(gfp, size);
	if (buf &&
	    check_feature(FEATURE_SNP) &&
	    set_memory_4k((unsigned long)buf, size / PAGE_SIZE )) {
		iommu_free_page(buf);
		buf = NULL;
	}

	return buf;
}
(although alloc_cwwb_sem() passing 1 looks highly suspicious - judging by
other cmd_sem references that probably should be PAGE_SIZE...)
Indeed, amd folks?
quoted
  	if (buf &&
  	    check_feature(FEATURE_SNP) &&
[...]
quoted
@@ -1702,8 +1701,10 @@ int dmar_enable_qi(struct intel_iommu *iommu)
  	 * Need two pages to accommodate 256 descriptors of 256 bits each
  	 * if the remapping hardware supports scalable mode translation.
  	 */
-	order = ecap_smts(iommu->ecap) ? 1 : 0;
-	desc = iommu_alloc_pages_node(iommu->node, GFP_ATOMIC, order);
+	desc = iommu_alloc_pages_node_lg2(iommu->node, GFP_ATOMIC,
+					  ecap_smts(iommu->ecap) ?
+						  order_base_2(SZ_8K) :
+						  order_base_2(SZ_4K));
These are also clearly sizes.
I didn't make a size wrapper version of the _node_ variation because
there are only three callers.
I don't see any need to have the log2 stuff at all, I think we just
switch iommu_alloc_pages{_node}() to take a size and keep things
simple.
Ok it is easy to remove lg2 calls from the drivers, but I would keep
the internal function like this because most of the size callers have
constants and the order_base_2() will become a constexpr when
inlined. Only a few places are not like that.

Thanks,
Jason
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help