Commit 312b4dc1 authored by Arunpravin Paneer Selvam's avatar Arunpravin Paneer Selvam Committed by Alex Deucher

drm/amdgpu: Fix VRAM BO swap issue

DRM buddy manager allocates the contiguous memory requests in
a single block or multiple blocks. So for the ttm move operation
(incase of low vram memory) we should consider all the blocks to
compute the total memory size which compared with the struct
ttm_resource num_pages in order to verify that the blocks are
contiguous for the eviction process.

v2: Added a Fixes tag
v3: Rewrite the code to save a bit of calculations and
    variables (Christian)

Fixes: c9cad937 ("drm/amdgpu: add drm buddy support to amdgpu")
Signed-off-by: default avatarArunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 7e4ab9fb
...@@ -424,8 +424,9 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo, ...@@ -424,8 +424,9 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
static bool amdgpu_mem_visible(struct amdgpu_device *adev, static bool amdgpu_mem_visible(struct amdgpu_device *adev,
struct ttm_resource *mem) struct ttm_resource *mem)
{ {
uint64_t mem_size = (u64)mem->num_pages << PAGE_SHIFT; u64 mem_size = (u64)mem->num_pages << PAGE_SHIFT;
struct amdgpu_res_cursor cursor; struct amdgpu_res_cursor cursor;
u64 end;
if (mem->mem_type == TTM_PL_SYSTEM || if (mem->mem_type == TTM_PL_SYSTEM ||
mem->mem_type == TTM_PL_TT) mem->mem_type == TTM_PL_TT)
...@@ -434,12 +435,18 @@ static bool amdgpu_mem_visible(struct amdgpu_device *adev, ...@@ -434,12 +435,18 @@ static bool amdgpu_mem_visible(struct amdgpu_device *adev,
return false; return false;
amdgpu_res_first(mem, 0, mem_size, &cursor); amdgpu_res_first(mem, 0, mem_size, &cursor);
end = cursor.start + cursor.size;
while (cursor.remaining) {
amdgpu_res_next(&cursor, cursor.size);
/* ttm_resource_ioremap only supports contiguous memory */ /* ttm_resource_ioremap only supports contiguous memory */
if (cursor.size != mem_size) if (end != cursor.start)
return false; return false;
return cursor.start + cursor.size <= adev->gmc.visible_vram_size; end = cursor.start + cursor.size;
}
return end <= adev->gmc.visible_vram_size;
} }
/* /*
......
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