Commit 6f2c8d5f authored by Arunpravin Paneer Selvam's avatar Arunpravin Paneer Selvam Committed by Christian König

drm/amdgpu: Fix for drm buddy memory corruption

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: default avatarArunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
Reported-by: default avatarMike Lothian <mike@fireburn.co.uk>
Tested-by: default avatarMike Lothian <mike@fireburn.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20220714101214.7620-1-Arunpravin.PaneerSelvam@amd.comReviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
parent c96cfaf8
...@@ -395,11 +395,11 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, ...@@ -395,11 +395,11 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
unsigned long pages_per_block; unsigned long pages_per_block;
int r; int r;
lpfn = place->lpfn << PAGE_SHIFT; lpfn = (u64)place->lpfn << PAGE_SHIFT;
if (!lpfn) if (!lpfn)
lpfn = man->size; lpfn = man->size;
fpfn = place->fpfn << PAGE_SHIFT; fpfn = (u64)place->fpfn << PAGE_SHIFT;
max_bytes = adev->gmc.mc_vram_size; max_bytes = adev->gmc.mc_vram_size;
if (tbo->type != ttm_bo_type_kernel) if (tbo->type != ttm_bo_type_kernel)
...@@ -439,12 +439,12 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, ...@@ -439,12 +439,12 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
/* Allocate blocks in desired range */ /* Allocate blocks in desired range */
vres->flags |= DRM_BUDDY_RANGE_ALLOCATION; 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); mutex_lock(&mgr->lock);
while (remaining_size) { while (remaining_size) {
if (tbo->page_alignment) if (tbo->page_alignment)
min_block_size = tbo->page_alignment << PAGE_SHIFT; min_block_size = (u64)tbo->page_alignment << PAGE_SHIFT;
else else
min_block_size = mgr->default_page_size; min_block_size = mgr->default_page_size;
...@@ -453,12 +453,12 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, ...@@ -453,12 +453,12 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
/* Limit maximum size to 2GiB due to SG table limitations */ /* Limit maximum size to 2GiB due to SG table limitations */
size = min(remaining_size, 2ULL << 30); size = min(remaining_size, 2ULL << 30);
if (size >= pages_per_block << PAGE_SHIFT) if (size >= (u64)pages_per_block << PAGE_SHIFT)
min_block_size = pages_per_block << PAGE_SHIFT; min_block_size = (u64)pages_per_block << PAGE_SHIFT;
cur_size = size; 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 * Except for actual range allocation, modify the size and
* min_block_size conforming to continuous flag enablement * min_block_size conforming to continuous flag enablement
...@@ -498,7 +498,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, ...@@ -498,7 +498,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
LIST_HEAD(temp); LIST_HEAD(temp);
trim_list = &vres->blocks; 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 * If size value is rounded up to min_block_size, trim the last
......
...@@ -50,7 +50,7 @@ static inline u64 amdgpu_vram_mgr_block_start(struct drm_buddy_block *block) ...@@ -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) 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 amdgpu_vram_mgr_resource * static inline struct amdgpu_vram_mgr_resource *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment