diff mbox

[2/2] drm/ttm: use RCU to pipeline evictions

Message ID 1467721803-2138-2-git-send-email-deathsimple@vodafone.de (mailing list archive)
State New, archived
Headers show

Commit Message

Christian König July 5, 2016, 12:30 p.m. UTC
From: Christian König <christian.koenig@amd.com>

Could be faster on the read path.

Signed-off-by: Christian König <christian.koenig@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(-)

Comments

Alex Deucher July 5, 2016, 9:14 p.m. UTC | #1
On Tue, Jul 5, 2016 at 8:30 AM, Christian König <deathsimple@vodafone.de> wrote:
> From: Christian König <christian.koenig@amd.com>
>
> Could be faster on the read path.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>

Just one style nit pick below.  Beyond that, the series is:
Reviewed-by: Alex Deucher <alexander.deucher@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)));

I generally like to see parens with do/while loops.

> +       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)));

Same here.

> +       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
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

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);