mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 00:16:44 +07:00
drm/ttm: Wait for a BO to become idle before unbinding it from GTT
Fixes hangs under memory pressure, e.g. running the piglit test
tex3d-maxsize concurrently with other tests.
Fixes: 17d33bc9d6
("drm/ttm: drop waiting for idle in ttm_bo_evict.")
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
fdba11f407
commit
7b8082bc07
@ -336,7 +336,7 @@ static int amdgpu_move_vram_ram(struct ttm_buffer_object *bo,
|
|||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
r = ttm_bo_move_ttm(bo, true, no_wait_gpu, new_mem);
|
r = ttm_bo_move_ttm(bo, true, interruptible, no_wait_gpu, new_mem);
|
||||||
out_cleanup:
|
out_cleanup:
|
||||||
ttm_bo_mem_put(bo, &tmp_mem);
|
ttm_bo_mem_put(bo, &tmp_mem);
|
||||||
return r;
|
return r;
|
||||||
@ -369,7 +369,7 @@ static int amdgpu_move_ram_vram(struct ttm_buffer_object *bo,
|
|||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
r = ttm_bo_move_ttm(bo, true, no_wait_gpu, &tmp_mem);
|
r = ttm_bo_move_ttm(bo, true, interruptible, no_wait_gpu, &tmp_mem);
|
||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
|
@ -1151,7 +1151,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = ttm_bo_move_ttm(bo, true, no_wait_gpu, new_mem);
|
ret = ttm_bo_move_ttm(bo, true, intr, no_wait_gpu, new_mem);
|
||||||
out:
|
out:
|
||||||
ttm_bo_mem_put(bo, &tmp_mem);
|
ttm_bo_mem_put(bo, &tmp_mem);
|
||||||
return ret;
|
return ret;
|
||||||
@ -1179,7 +1179,7 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = ttm_bo_move_ttm(bo, true, no_wait_gpu, &tmp_mem);
|
ret = ttm_bo_move_ttm(bo, true, intr, no_wait_gpu, &tmp_mem);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -346,7 +346,7 @@ static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
|
|||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
r = ttm_bo_move_ttm(bo, true, no_wait_gpu, new_mem);
|
r = ttm_bo_move_ttm(bo, true, interruptible, no_wait_gpu, new_mem);
|
||||||
out_cleanup:
|
out_cleanup:
|
||||||
ttm_bo_mem_put(bo, &tmp_mem);
|
ttm_bo_mem_put(bo, &tmp_mem);
|
||||||
return r;
|
return r;
|
||||||
@ -379,7 +379,7 @@ static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
|
|||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
r = ttm_bo_move_ttm(bo, true, no_wait_gpu, &tmp_mem);
|
r = ttm_bo_move_ttm(bo, true, interruptible, no_wait_gpu, &tmp_mem);
|
||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
goto out_cleanup;
|
goto out_cleanup;
|
||||||
}
|
}
|
||||||
|
@ -354,7 +354,8 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
|
|||||||
|
|
||||||
if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) &&
|
if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) &&
|
||||||
!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED))
|
!(new_man->flags & TTM_MEMTYPE_FLAG_FIXED))
|
||||||
ret = ttm_bo_move_ttm(bo, evict, no_wait_gpu, mem);
|
ret = ttm_bo_move_ttm(bo, evict, interruptible, no_wait_gpu,
|
||||||
|
mem);
|
||||||
else if (bdev->driver->move)
|
else if (bdev->driver->move)
|
||||||
ret = bdev->driver->move(bo, evict, interruptible,
|
ret = bdev->driver->move(bo, evict, interruptible,
|
||||||
no_wait_gpu, mem);
|
no_wait_gpu, mem);
|
||||||
|
@ -45,7 +45,7 @@ void ttm_bo_free_old_node(struct ttm_buffer_object *bo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
|
int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
|
||||||
bool evict,
|
bool evict, bool interruptible,
|
||||||
bool no_wait_gpu, struct ttm_mem_reg *new_mem)
|
bool no_wait_gpu, struct ttm_mem_reg *new_mem)
|
||||||
{
|
{
|
||||||
struct ttm_tt *ttm = bo->ttm;
|
struct ttm_tt *ttm = bo->ttm;
|
||||||
@ -53,6 +53,14 @@ int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (old_mem->mem_type != TTM_PL_SYSTEM) {
|
if (old_mem->mem_type != TTM_PL_SYSTEM) {
|
||||||
|
ret = ttm_bo_wait(bo, interruptible, no_wait_gpu);
|
||||||
|
|
||||||
|
if (unlikely(ret != 0)) {
|
||||||
|
if (ret != -ERESTARTSYS)
|
||||||
|
pr_err("Failed to expire sync object before unbinding TTM\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ttm_tt_unbind(ttm);
|
ttm_tt_unbind(ttm);
|
||||||
ttm_bo_free_old_node(bo);
|
ttm_bo_free_old_node(bo);
|
||||||
ttm_flag_masked(&old_mem->placement, TTM_PL_FLAG_SYSTEM,
|
ttm_flag_masked(&old_mem->placement, TTM_PL_FLAG_SYSTEM,
|
||||||
|
@ -962,6 +962,7 @@ void ttm_mem_io_free(struct ttm_bo_device *bdev,
|
|||||||
*
|
*
|
||||||
* @bo: A pointer to a struct ttm_buffer_object.
|
* @bo: A pointer to a struct ttm_buffer_object.
|
||||||
* @evict: 1: This is an eviction. Don't try to pipeline.
|
* @evict: 1: This is an eviction. Don't try to pipeline.
|
||||||
|
* @interruptible: Sleep interruptible if waiting.
|
||||||
* @no_wait_gpu: Return immediately if the GPU is busy.
|
* @no_wait_gpu: Return immediately if the GPU is busy.
|
||||||
* @new_mem: struct ttm_mem_reg indicating where to move.
|
* @new_mem: struct ttm_mem_reg indicating where to move.
|
||||||
*
|
*
|
||||||
@ -976,7 +977,7 @@ void ttm_mem_io_free(struct ttm_bo_device *bdev,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
extern int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
|
extern int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
|
||||||
bool evict, bool no_wait_gpu,
|
bool evict, bool interruptible, bool no_wait_gpu,
|
||||||
struct ttm_mem_reg *new_mem);
|
struct ttm_mem_reg *new_mem);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user