[PATCH 16/45] drm/radeon/ttm: do move notify actions inside move.
Dave Airlie
airlied at gmail.com
Thu Sep 24 05:18:16 UTC 2020
From: Dave Airlie <airlied at redhat.com>
move notify can be gotten done inside moves instead of a separate
callback for radeon. move notify is now only called from one other
place where new_mem == NULL, so handle that properly.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
drivers/gpu/drm/radeon/radeon_object.c | 28 +++++++++++++++++---------
drivers/gpu/drm/radeon/radeon_object.h | 4 ++++
drivers/gpu/drm/radeon/radeon_ttm.c | 8 +++++++-
3 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 689426dd8480..36a16d7a24b2 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -754,6 +754,21 @@ int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved,
return radeon_bo_get_surface_reg(bo);
}
+
+void radeon_bo_invalidate(struct radeon_bo *rbo)
+{
+ radeon_bo_check_tiling(rbo, 0, 1);
+ radeon_vm_bo_invalidate(rbo->rdev, rbo);
+}
+
+void radeon_bo_memory_usage(struct radeon_bo *rbo,
+ uint32_t old_mem_type,
+ uint32_t new_mem_type)
+{
+ radeon_update_memory_usage(rbo, old_mem_type, -1);
+ radeon_update_memory_usage(rbo, new_mem_type, 1);
+}
+
void radeon_bo_move_notify(struct ttm_buffer_object *bo,
bool evict,
struct ttm_resource *new_mem)
@@ -763,16 +778,11 @@ void radeon_bo_move_notify(struct ttm_buffer_object *bo,
if (!radeon_ttm_bo_is_radeon_bo(bo))
return;
- rbo = container_of(bo, struct radeon_bo, tbo);
- radeon_bo_check_tiling(rbo, 0, 1);
- radeon_vm_bo_invalidate(rbo->rdev, rbo);
-
- /* update statistics */
- if (!new_mem)
+ /* the new_mem path is handled via the move callback now */
+ if (new_mem)
return;
-
- radeon_update_memory_usage(rbo, bo->mem.mem_type, -1);
- radeon_update_memory_usage(rbo, new_mem->mem_type, 1);
+ rbo = container_of(bo, struct radeon_bo, tbo);
+ radeon_bo_invalidate(rbo);
}
int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 27cfb64057fe..6f886e2ffaf3 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -160,6 +160,10 @@ extern void radeon_bo_get_tiling_flags(struct radeon_bo *bo,
u32 *tiling_flags, u32 *pitch);
extern int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved,
bool force_drop);
+void radeon_bo_memory_usage(struct radeon_bo *rbo,
+ uint32_t old_mem_type,
+ uint32_t new_mem_type);
+void radeon_bo_invalidate(struct radeon_bo *rbo);
extern void radeon_bo_move_notify(struct ttm_buffer_object *bo,
bool evict,
struct ttm_resource *new_mem);
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 10d25d3b83f2..e814b11187b3 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -316,12 +316,16 @@ static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
struct ttm_resource *old_mem = &bo->mem;
int r;
+ rbo = container_of(bo, struct radeon_bo, tbo);
+
+ radeon_bo_invalidate(rbo);
+ radeon_bo_memory_usage(rbo, bo->mem.mem_type, new_mem->mem_type);
+
r = ttm_bo_wait_ctx(bo, ctx);
if (r)
return r;
/* Can't move a pinned BO */
- rbo = container_of(bo, struct radeon_bo, tbo);
if (WARN_ON_ONCE(rbo->tbo.pin_count > 0))
return -EINVAL;
@@ -361,6 +365,8 @@ static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict,
memcpy:
r = ttm_bo_move_memcpy(bo, ctx, new_mem);
if (r) {
+ radeon_bo_invalidate(rbo);
+ radeon_bo_memory_usage(rbo, new_mem->mem_type, old_mem->mem_type);
return r;
}
}
--
2.27.0
More information about the dri-devel
mailing list