[PATCH 2/2] drm/ttm: use RCU to pipeline evictions
Christian König
deathsimple at vodafone.de
Tue Jul 5 12:30:03 UTC 2016
From: Christian König <christian.koenig at amd.com>
Could be faster on the read path.
Signed-off-by: Christian König <christian.koenig at amd.com>
---
drivers/gpu/drm/ttm/ttm_bo.c | 16 ++++++++++------
drivers/gpu/drm/ttm/ttm_bo_util.c | 8 +++++---
2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 66c50ad..7e30f3b 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -797,9 +797,11 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo,
struct fence *fence;
int ret;
- spin_lock(&man->move_lock);
- fence = fence_get(man->move);
- spin_unlock(&man->move_lock);
+ rcu_read_lock();
+ do
+ fence = rcu_dereference(man->move);
+ while (unlikely(fence && !fence_get_rcu(fence)));
+ rcu_read_unlock();
if (fence) {
reservation_object_add_shared_fence(bo->resv, fence);
@@ -1304,9 +1306,11 @@ static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev,
}
spin_unlock(&glob->lru_lock);
- spin_lock(&man->move_lock);
- fence = fence_get(man->move);
- spin_unlock(&man->move_lock);
+ rcu_read_lock();
+ do
+ fence = rcu_dereference(man->move);
+ while (unlikely(fence && !fence_get_rcu(fence)));
+ rcu_read_unlock();
if (fence) {
ret = fence_wait(fence, false);
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 4da0e78..fcd2431 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -746,6 +746,7 @@ int ttm_bo_pipeline_move(struct ttm_buffer_object *bo,
ttm_bo_unref(&ghost_obj);
} else if (from->flags & TTM_MEMTYPE_FLAG_FIXED) {
+ struct fence *old;
/**
* BO doesn't have a TTM we need to bind/unbind. Just remember
@@ -753,9 +754,10 @@ int ttm_bo_pipeline_move(struct ttm_buffer_object *bo,
*/
spin_lock(&from->move_lock);
- if (!from->move || fence_is_later(fence, from->move)) {
- fence_put(from->move);
- from->move = fence_get(fence);
+ old = rcu_dereference_protected(from->move, 1);
+ if (!old || fence_is_later(fence, old)) {
+ rcu_assign_pointer(from->move, fence_get(fence));
+ fence_put(old);
}
spin_unlock(&from->move_lock);
--
2.5.0
More information about the dri-devel
mailing list