stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: Patch "iommu/amd: Simplify pagetable freeing" has been added to the 5.15-stable tree
       [not found] <20220305210025.146536-1-sashal@kernel.org>
@ 2022-03-07 10:35 ` Robin Murphy
  2022-03-07 10:58   ` Sasha Levin
  0 siblings, 1 reply; 2+ messages in thread
From: Robin Murphy @ 2022-03-07 10:35 UTC (permalink / raw)
  To: Sasha Levin, stable-commits; +Cc: Joerg Roedel, stable

On 2022-03-05 21:00, Sasha Levin wrote:
> This is a note to let you know that I've just added the patch titled
> 
>      iommu/amd: Simplify pagetable freeing
> 
> to the 5.15-stable tree which can be found at:
>      http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
> 
> The filename of the patch is:
>       iommu-amd-simplify-pagetable-freeing.patch
> and it can be found in the queue-5.15 subdirectory.
> 
> If you, or anyone else, feels it should not be added to the stable tree,
> please let <stable@vger.kernel.org> know about it.

I don't think this one qualifies for stable - it was just a refactoring 
to aid future development. The "fixing" of types is merely cosmetic, and 
the code size benefit was just a little bonus, hardly significant.

Thanks,
Robin.

> commit 3ccd31a933e9a08a64a803d7fda5cb64a48e5229
> Author: Robin Murphy <robin.murphy@arm.com>
> Date:   Fri Dec 17 15:30:58 2021 +0000
> 
>      iommu/amd: Simplify pagetable freeing
>      
>      [ Upstream commit 6b3106e9ba2de7320a71291cedcefdcf1195ad58 ]
>      
>      For reasons unclear, pagetable freeing is an effectively recursive
>      method implemented via an elaborate system of templated functions that
>      turns out to account for 25% of the object file size. Implementing it
>      using regular straightforward recursion makes the code simpler, and
>      seems like a good thing to do before we work on it further. As part of
>      that, also fix the types to avoid all the needless casting back and
>      forth which just gets in the way.
>      
>      Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>      Link: https://lore.kernel.org/r/d3d00c9f3fa0df4756b867072c201e6e82f9ce39.1639753638.git.robin.murphy@arm.com
>      Signed-off-by: Joerg Roedel <jroedel@suse.de>
>      Signed-off-by: Sasha Levin <sashal@kernel.org>
> 
> diff --git a/drivers/iommu/amd/io_pgtable.c b/drivers/iommu/amd/io_pgtable.c
> index 182c93a43efd..4165e1372b6e 100644
> --- a/drivers/iommu/amd/io_pgtable.c
> +++ b/drivers/iommu/amd/io_pgtable.c
> @@ -84,49 +84,45 @@ static void free_page_list(struct page *freelist)
>   	}
>   }
>   
> -static struct page *free_pt_page(unsigned long pt, struct page *freelist)
> +static struct page *free_pt_page(u64 *pt, struct page *freelist)
>   {
> -	struct page *p = virt_to_page((void *)pt);
> +	struct page *p = virt_to_page(pt);
>   
>   	p->freelist = freelist;
>   
>   	return p;
>   }
>   
> -#define DEFINE_FREE_PT_FN(LVL, FN)						\
> -static struct page *free_pt_##LVL (unsigned long __pt, struct page *freelist)	\
> -{										\
> -	unsigned long p;							\
> -	u64 *pt;								\
> -	int i;									\
> -										\
> -	pt = (u64 *)__pt;							\
> -										\
> -	for (i = 0; i < 512; ++i) {						\
> -		/* PTE present? */						\
> -		if (!IOMMU_PTE_PRESENT(pt[i]))					\
> -			continue;						\
> -										\
> -		/* Large PTE? */						\
> -		if (PM_PTE_LEVEL(pt[i]) == 0 ||					\
> -		    PM_PTE_LEVEL(pt[i]) == 7)					\
> -			continue;						\
> -										\
> -		p = (unsigned long)IOMMU_PTE_PAGE(pt[i]);			\
> -		freelist = FN(p, freelist);					\
> -	}									\
> -										\
> -	return free_pt_page((unsigned long)pt, freelist);			\
> -}
> +static struct page *free_pt_lvl(u64 *pt, struct page *freelist, int lvl)
> +{
> +	u64 *p;
> +	int i;
> +
> +	for (i = 0; i < 512; ++i) {
> +		/* PTE present? */
> +		if (!IOMMU_PTE_PRESENT(pt[i]))
> +			continue;
>   
> -DEFINE_FREE_PT_FN(l2, free_pt_page)
> -DEFINE_FREE_PT_FN(l3, free_pt_l2)
> -DEFINE_FREE_PT_FN(l4, free_pt_l3)
> -DEFINE_FREE_PT_FN(l5, free_pt_l4)
> -DEFINE_FREE_PT_FN(l6, free_pt_l5)
> +		/* Large PTE? */
> +		if (PM_PTE_LEVEL(pt[i]) == 0 ||
> +		    PM_PTE_LEVEL(pt[i]) == 7)
> +			continue;
>   
> -static struct page *free_sub_pt(unsigned long root, int mode,
> -				struct page *freelist)
> +		/*
> +		 * Free the next level. No need to look at l1 tables here since
> +		 * they can only contain leaf PTEs; just free them directly.
> +		 */
> +		p = IOMMU_PTE_PAGE(pt[i]);
> +		if (lvl > 2)
> +			freelist = free_pt_lvl(p, freelist, lvl - 1);
> +		else
> +			freelist = free_pt_page(p, freelist);
> +	}
> +
> +	return free_pt_page(pt, freelist);
> +}
> +
> +static struct page *free_sub_pt(u64 *root, int mode, struct page *freelist)
>   {
>   	switch (mode) {
>   	case PAGE_MODE_NONE:
> @@ -136,19 +132,11 @@ static struct page *free_sub_pt(unsigned long root, int mode,
>   		freelist = free_pt_page(root, freelist);
>   		break;
>   	case PAGE_MODE_2_LEVEL:
> -		freelist = free_pt_l2(root, freelist);
> -		break;
>   	case PAGE_MODE_3_LEVEL:
> -		freelist = free_pt_l3(root, freelist);
> -		break;
>   	case PAGE_MODE_4_LEVEL:
> -		freelist = free_pt_l4(root, freelist);
> -		break;
>   	case PAGE_MODE_5_LEVEL:
> -		freelist = free_pt_l5(root, freelist);
> -		break;
>   	case PAGE_MODE_6_LEVEL:
> -		freelist = free_pt_l6(root, freelist);
> +		free_pt_lvl(root, freelist, mode);
>   		break;
>   	default:
>   		BUG();
> @@ -364,7 +352,7 @@ static u64 *fetch_pte(struct amd_io_pgtable *pgtable,
>   
>   static struct page *free_clear_pte(u64 *pte, u64 pteval, struct page *freelist)
>   {
> -	unsigned long pt;
> +	u64 *pt;
>   	int mode;
>   
>   	while (cmpxchg64(pte, pteval, 0) != pteval) {
> @@ -375,7 +363,7 @@ static struct page *free_clear_pte(u64 *pte, u64 pteval, struct page *freelist)
>   	if (!IOMMU_PTE_PRESENT(pteval))
>   		return freelist;
>   
> -	pt   = (unsigned long)IOMMU_PTE_PAGE(pteval);
> +	pt   = IOMMU_PTE_PAGE(pteval);
>   	mode = IOMMU_PTE_MODE(pteval);
>   
>   	return free_sub_pt(pt, mode, freelist);
> @@ -512,7 +500,6 @@ static void v1_free_pgtable(struct io_pgtable *iop)
>   	struct amd_io_pgtable *pgtable = container_of(iop, struct amd_io_pgtable, iop);
>   	struct protection_domain *dom;
>   	struct page *freelist = NULL;
> -	unsigned long root;
>   
>   	if (pgtable->mode == PAGE_MODE_NONE)
>   		return;
> @@ -529,8 +516,7 @@ static void v1_free_pgtable(struct io_pgtable *iop)
>   	BUG_ON(pgtable->mode < PAGE_MODE_NONE ||
>   	       pgtable->mode > PAGE_MODE_6_LEVEL);
>   
> -	root = (unsigned long)pgtable->root;
> -	freelist = free_sub_pt(root, pgtable->mode, freelist);
> +	freelist = free_sub_pt(pgtable->root, pgtable->mode, freelist);
>   
>   	free_page_list(freelist);
>   }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Patch "iommu/amd: Simplify pagetable freeing" has been added to the 5.15-stable tree
  2022-03-07 10:35 ` Patch "iommu/amd: Simplify pagetable freeing" has been added to the 5.15-stable tree Robin Murphy
@ 2022-03-07 10:58   ` Sasha Levin
  0 siblings, 0 replies; 2+ messages in thread
From: Sasha Levin @ 2022-03-07 10:58 UTC (permalink / raw)
  To: Robin Murphy; +Cc: stable-commits, Joerg Roedel, stable

On Mon, Mar 07, 2022 at 10:35:19AM +0000, Robin Murphy wrote:
>On 2022-03-05 21:00, Sasha Levin wrote:
>>This is a note to let you know that I've just added the patch titled
>>
>>     iommu/amd: Simplify pagetable freeing
>>
>>to the 5.15-stable tree which can be found at:
>>     http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
>>
>>The filename of the patch is:
>>      iommu-amd-simplify-pagetable-freeing.patch
>>and it can be found in the queue-5.15 subdirectory.
>>
>>If you, or anyone else, feels it should not be added to the stable tree,
>>please let <stable@vger.kernel.org> know about it.
>
>I don't think this one qualifies for stable - it was just a 
>refactoring to aid future development. The "fixing" of types is merely 
>cosmetic, and the code size benefit was just a little bonus, hardly 
>significant.

I took it and "iommu/amd: Use put_pages_list" to avoid the conflict when
taking 6b0b2d9a6a30 ("iommu/amd: Fix I/O page table memory leak").

Let me see if I can rework it to not need the 2 prereq patches...

-- 
Thanks,
Sasha

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-03-07 11:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20220305210025.146536-1-sashal@kernel.org>
2022-03-07 10:35 ` Patch "iommu/amd: Simplify pagetable freeing" has been added to the 5.15-stable tree Robin Murphy
2022-03-07 10:58   ` Sasha Levin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).