Re: [PATCH] drm/amdgpu: cap GTT size to physical RAM on APUs

Christian König <[email protected]> Wed, 5 Aug 2026 10:06:09 +0200
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <[email protected]>
On 7/27/26 21:42, Harkirat Gill wrote:
> On APUs, the GTT pool is backed by system RAM, but its size is not bound
> to the non-carveout memory that actually backs it. A user can end up
> with GTT + VRAM exceeding total physical memory through the following
> sequence:
> 
>  - Have a large non-carveout memory space (~128GB) and accordingly set a
>    large GTT (~100GB) via the ttm module parameter.
>  - Lower the non-carveout memory space in BIOS by increasing the UMA
>    Frame Buffer Size (VRAM) to 64GB.
>  - The previously set GTT value (~100GB) persists, even though the new
>    non-carveout space (64GB) can no longer back it.
> 
> This leads to a case where kernel reports GTT (100GB) + VRAM (64GB)
> despite the sum being greater than total physical memory (128GB).
> 
> Cap the GTT size to totalram_pages() on APUs. totalram_pages() already
> excludes the VRAM carveout, so the resulting GTT can never exceed the
> system RAM that actually backs it.
> 
> Signed-off-by: Harkirat Gill <[email protected]>
> Assisted-by: Claude:claude-opus-4

Absolutely clear NAK.

This is exactly what the gtt_size module parameter is good for in the first place!

Regards,
Christian.

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 7920675af..da89d19dd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -2173,6 +2173,18 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
>  		gtt_size = configured_size;
>  	}
>  
> +	/* Cap GTT so that it does not exceed total physical RAM. */
> +	if (adev->flags & AMD_IS_APU) {
> +		u64 phys_ram = (u64)totalram_pages() << PAGE_SHIFT;
> +
> +		if (gtt_size > phys_ram) {
> +			gtt_size = phys_ram;
> +			dev_info(adev->dev,
> +				 "Capping GTT to %uM to not exceed available system memory\n",
> +				 (unsigned int)(gtt_size / (1024 * 1024)));
> +		}
> +	}
> +
>  	/* Initialize GTT memory pool */
>  	r = amdgpu_gtt_mgr_init(adev, gtt_size);
>  	if (r) {
> 
> base-commit: ea97ab2759506d9a818ffed1009bde01062b4091