[PATCH] drm/amdgpu: Fix for drm buddy memory corruption
Christian König
christian.koenig at amd.com
Fri Jul 15 13:46:27 UTC 2022
Am 14.07.22 um 12:12 schrieb Arunpravin Paneer Selvam:
> User reported gpu page fault when running graphics applications
> and in some cases garbaged graphics are observed as soon as X
> starts. This patch fixes all the issues.
>
> Fixed the typecast issue for fpfn and lpfn variables, thus
> preventing the overflow problem which resolves the memory
> corruption.
>
> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam at amd.com>
> Reported-by: Mike Lothian <mike at fireburn.co.uk>
> Tested-by: Mike Lothian <mike at fireburn.co.uk>
Reviewed-by: Christian König <christian.koenig at amd.com>
I've re-applied the patches to drm-misc-next, solved the conflict in
drm-tip and then pushed this to drm-misc-next-fixes.
With a little bit of luck everything should now be in place, but fingers
crossed.
Regards,
Christian.
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 16 ++++++++--------
> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h | 2 +-
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> index 49e4092f447f..34d789054ec8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> @@ -366,11 +366,11 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
> unsigned long pages_per_block;
> int r;
>
> - lpfn = place->lpfn << PAGE_SHIFT;
> + lpfn = (u64)place->lpfn << PAGE_SHIFT;
> if (!lpfn)
> lpfn = man->size;
>
> - fpfn = place->fpfn << PAGE_SHIFT;
> + fpfn = (u64)place->fpfn << PAGE_SHIFT;
>
> max_bytes = adev->gmc.mc_vram_size;
> if (tbo->type != ttm_bo_type_kernel)
> @@ -410,12 +410,12 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
> /* Allocate blocks in desired range */
> vres->flags |= DRM_BUDDY_RANGE_ALLOCATION;
>
> - remaining_size = vres->base.num_pages << PAGE_SHIFT;
> + remaining_size = (u64)vres->base.num_pages << PAGE_SHIFT;
>
> mutex_lock(&mgr->lock);
> while (remaining_size) {
> if (tbo->page_alignment)
> - min_block_size = tbo->page_alignment << PAGE_SHIFT;
> + min_block_size = (u64)tbo->page_alignment << PAGE_SHIFT;
> else
> min_block_size = mgr->default_page_size;
>
> @@ -424,12 +424,12 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
> /* Limit maximum size to 2GiB due to SG table limitations */
> size = min(remaining_size, 2ULL << 30);
>
> - if (size >= pages_per_block << PAGE_SHIFT)
> - min_block_size = pages_per_block << PAGE_SHIFT;
> + if (size >= (u64)pages_per_block << PAGE_SHIFT)
> + min_block_size = (u64)pages_per_block << PAGE_SHIFT;
>
> cur_size = size;
>
> - if (fpfn + size != place->lpfn << PAGE_SHIFT) {
> + if (fpfn + size != (u64)place->lpfn << PAGE_SHIFT) {
> /*
> * Except for actual range allocation, modify the size and
> * min_block_size conforming to continuous flag enablement
> @@ -469,7 +469,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
> LIST_HEAD(temp);
>
> trim_list = &vres->blocks;
> - original_size = vres->base.num_pages << PAGE_SHIFT;
> + original_size = (u64)vres->base.num_pages << PAGE_SHIFT;
>
> /*
> * If size value is rounded up to min_block_size, trim the last
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h
> index 9a2db87186c7..bef0f561ba60 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.h
> @@ -50,7 +50,7 @@ static inline u64 amdgpu_vram_mgr_block_start(struct drm_buddy_block *block)
>
> static inline u64 amdgpu_vram_mgr_block_size(struct drm_buddy_block *block)
> {
> - return PAGE_SIZE << drm_buddy_block_order(block);
> + return (u64)PAGE_SIZE << drm_buddy_block_order(block);
> }
>
> static inline struct drm_buddy_block *
More information about the dri-devel
mailing list