Re: [PATCH] iommu/amd: Do not reallocate GA log buffers on resume

Ankit Soni <[email protected]>
Newsgroups dev.linux.lists.iommu,org.kernel.vger.linux-kernel
Message-ID <k5brbvuoqzz6k2lhyw54lusicjws5q3q7lxqs3bbalax5qz7fw@z6vxf6ftl5zi>
On Wed, Aug 19, 2026 at 05:23:49AM +0200, Karl Mehltretter wrote:
> Commit c5e1a1eb9279 ("iommu/amd: Simplify and Consolidate Virtual APIC
> (AVIC) Enablement") moved the GA log allocation from iommu_init_pci()
> to enable_iommus_vapic(), which is called on every resume.
> 
> iommu_init_ga_log() assigns iommu->ga_log and iommu->ga_log_tail
> unconditionally. Each resume therefore replaces the boot-time pointers
> and leaks both old allocations. The function also uses GFP_KERNEL from a
> syscore resume callback, where interrupts are disabled and the non-boot
> CPUs are offline.
> 
> Return early if both buffers are already allocated. Clear the pointers
> in free_ga_log() so a partial allocation failure cannot leave ga_log
> dangling.
> 
> Fixes: c5e1a1eb9279 ("iommu/amd: Simplify and Consolidate Virtual APIC (AVIC) Enablement")
> Assisted-by: Claude:claude-opus-5
> Signed-off-by: Karl Mehltretter <[email protected]>

Reviewed-by: Ankit Soni <[email protected]>

Thanks,
Ankit

> ---
> Tested with custom QEMU with GA log emulation. Stock QEMU does not
> advertise GAMSup and cannot reach this path. After five pm_test=core
> cycles, nr_iommu_pages increased from 17 to 25 without the patch.
> 
> Testing on AVIC-capable hardware would be welcome.
> 
>  drivers/iommu/amd/init.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
> index 40726dfef2733..c6b106d5921e 100644
> --- a/drivers/iommu/amd/init.c
> +++ b/drivers/iommu/amd/init.c
> @@ -909,7 +909,9 @@ static void free_ga_log(struct amd_iommu *iommu)
>  {
>  #ifdef CONFIG_IRQ_REMAP
>  	iommu_free_pages(iommu->ga_log);
> +	iommu->ga_log = NULL;
>  	iommu_free_pages(iommu->ga_log_tail);
> +	iommu->ga_log_tail = NULL;
>  #endif
>  }
>  
> @@ -956,6 +958,9 @@ static int iommu_init_ga_log(struct amd_iommu *iommu)
>  	if (WARN_ON_ONCE(!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)))
>  		return -EINVAL;
>  
> +	if (iommu->ga_log && iommu->ga_log_tail)
> +		return 0;
> +
>  	iommu->ga_log = iommu_alloc_pages_node_sz(nid, GFP_KERNEL, GA_LOG_SIZE);
>  	if (!iommu->ga_log)
>  		goto err_out;
> 
> base-commit: 4477a78374a57c3809b172ad30cceabda48c47c6
> -- 
> 2.53.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.