diff mbox

drm/ttm: cleanup ttm_execbuf_util.c slightly more

Message ID 20120820143612.21905.68138.stgit@patser.local (mailing list archive)
State New, archived
Headers show

Commit Message

Maarten Lankhorst Aug. 20, 2012, 2:36 p.m. UTC
The removed member is unneeded, an extra pass is done after all
buffers have been reserved. The behavior stays the same even without
the removed member, but this makes the code slightly more readable.

Depends on previous 2 execbuf-util patches.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/ttm/ttm_execbuf_util.c |   69 +++++++++++---------------------
 1 file changed, 24 insertions(+), 45 deletions(-)

Comments

Jerome Glisse Aug. 20, 2012, 3:19 p.m. UTC | #1
On Mon, Aug 20, 2012 at 10:36 AM, Maarten Lankhorst
<maarten.lankhorst@canonical.com> wrote:
> The removed member is unneeded, an extra pass is done after all
> buffers have been reserved. The behavior stays the same even without
> the removed member, but this makes the code slightly more readable.
>
> Depends on previous 2 execbuf-util patches.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>

NAK this one modify lru list handling in wrong way, we need to track
lru per object no way around it.

Cheers,
Jerome

> ---
>  drivers/gpu/drm/ttm/ttm_execbuf_util.c |   69 +++++++++++---------------------
>  1 file changed, 24 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> index 4e7b596..a545bc9 100644
> --- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> @@ -32,7 +32,7 @@
>  #include <linux/sched.h>
>  #include <linux/module.h>
>
> -static void ttm_eu_backoff_reservation_locked(struct list_head *list)
> +static void ttm_eu_backoff_reservation_locked(struct list_head *list, bool removed)
>  {
>         struct ttm_validate_buffer *entry;
>
> @@ -41,43 +41,13 @@ static void ttm_eu_backoff_reservation_locked(struct list_head *list)
>                 if (!entry->reserved)
>                         continue;
>
> -               if (entry->removed) {
> -                       ttm_bo_add_to_lru(bo);
> -                       entry->removed = false;
> -
> -               }
>                 entry->reserved = false;
> -               atomic_set(&bo->reserved, 0);
> -               wake_up_all(&bo->event_queue);
> -       }
> -}
> -
> -static void ttm_eu_del_from_lru_locked(struct list_head *list)
> -{
> -       struct ttm_validate_buffer *entry;
> -
> -       list_for_each_entry(entry, list, head) {
> -               struct ttm_buffer_object *bo = entry->bo;
> -               if (!entry->reserved)
> -                       continue;
>
> -               if (!entry->removed) {
> -                       entry->put_count = ttm_bo_del_from_lru(bo);
> -                       entry->removed = true;
> -               }
> -       }
> -}
> -
> -static void ttm_eu_list_ref_sub(struct list_head *list)
> -{
> -       struct ttm_validate_buffer *entry;
> -
> -       list_for_each_entry(entry, list, head) {
> -               struct ttm_buffer_object *bo = entry->bo;
> -
> -               if (entry->put_count) {
> -                       ttm_bo_list_ref_sub(bo, entry->put_count, true);
> -                       entry->put_count = 0;
> +               if (removed) {
> +                       ttm_bo_unreserve_locked(bo);
> +               } else {
> +                       atomic_set(&bo->reserved, 0);
> +                       wake_up_all(&bo->event_queue);
>                 }
>         }
>  }
> @@ -93,7 +63,7 @@ void ttm_eu_backoff_reservation(struct list_head *list)
>         entry = list_first_entry(list, struct ttm_validate_buffer, head);
>         glob = entry->bo->glob;
>         spin_lock(&glob->lru_lock);
> -       ttm_eu_backoff_reservation_locked(list);
> +       ttm_eu_backoff_reservation_locked(list, true);
>         spin_unlock(&glob->lru_lock);
>  }
>  EXPORT_SYMBOL(ttm_eu_backoff_reservation);
> @@ -122,8 +92,6 @@ int ttm_eu_reserve_buffers(struct list_head *list)
>
>         list_for_each_entry(entry, list, head) {
>                 entry->reserved = false;
> -               entry->put_count = 0;
> -               entry->removed = false;
>         }
>
>         entry = list_first_entry(list, struct ttm_validate_buffer, head);
> @@ -141,26 +109,37 @@ retry:
>                 case 0:
>                         break;
>                 case -EAGAIN:
> -                       ttm_eu_backoff_reservation_locked(list);
> +                       ttm_eu_backoff_reservation_locked(list, false);
>                         spin_unlock(&glob->lru_lock);
> -                       ttm_eu_list_ref_sub(list);
>                         ret = ttm_bo_wait_unreserved(bo, true);
>                         if (unlikely(ret != 0))
>                                 return ret;
>                         goto retry;
>                 default:
> -                       ttm_eu_backoff_reservation_locked(list);
> +                       ttm_eu_backoff_reservation_locked(list, false);
>                         spin_unlock(&glob->lru_lock);
> -                       ttm_eu_list_ref_sub(list);
>                         return ret;
>                 }
>
>                 entry->reserved = true;
>         }
>
> -       ttm_eu_del_from_lru_locked(list);
> +       list_for_each_entry(entry, list, head) {
> +               struct ttm_buffer_object *bo = entry->bo;
> +
> +               entry->put_count = ttm_bo_del_from_lru(bo);
> +       }
> +
>         spin_unlock(&glob->lru_lock);
> -       ttm_eu_list_ref_sub(list);
> +
> +       list_for_each_entry(entry, list, head) {
> +               struct ttm_buffer_object *bo = entry->bo;
> +
> +               if (entry->put_count) {
> +                       ttm_bo_list_ref_sub(bo, entry->put_count, true);
> +                       entry->put_count = 0;
> +               }
> +       }
>
>         return 0;
>  }
> diff --git a/include/drm/ttm/ttm_execbuf_util.h b/include/drm/ttm/ttm_execbuf_util.h
> index 26cc7f9..0ef7c95 100644
> --- a/include/drm/ttm/ttm_execbuf_util.h
> +++ b/include/drm/ttm/ttm_execbuf_util.h
> @@ -42,7 +42,6 @@
>   * @new_sync_obj_arg: New sync_obj_arg for @bo, to be used once
>   * adding a new sync object.
>   * @reserved:       Indicates whether @bo has been reserved for validation.
> - * @removed:        Indicates whether @bo has been removed from lru lists.
>   * @put_count:      Number of outstanding references on bo::list_kref.
>   * @old_sync_obj:   Pointer to a sync object about to be unreferenced
>   */
> @@ -52,7 +51,6 @@ struct ttm_validate_buffer {
>         struct ttm_buffer_object *bo;
>         void *new_sync_obj_arg;
>         bool reserved;
> -       bool removed;
>         int put_count;
>         void *old_sync_obj;
>  };
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index 4e7b596..a545bc9 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -32,7 +32,7 @@ 
 #include <linux/sched.h>
 #include <linux/module.h>
 
-static void ttm_eu_backoff_reservation_locked(struct list_head *list)
+static void ttm_eu_backoff_reservation_locked(struct list_head *list, bool removed)
 {
 	struct ttm_validate_buffer *entry;
 
@@ -41,43 +41,13 @@  static void ttm_eu_backoff_reservation_locked(struct list_head *list)
 		if (!entry->reserved)
 			continue;
 
-		if (entry->removed) {
-			ttm_bo_add_to_lru(bo);
-			entry->removed = false;
-
-		}
 		entry->reserved = false;
-		atomic_set(&bo->reserved, 0);
-		wake_up_all(&bo->event_queue);
-	}
-}
-
-static void ttm_eu_del_from_lru_locked(struct list_head *list)
-{
-	struct ttm_validate_buffer *entry;
-
-	list_for_each_entry(entry, list, head) {
-		struct ttm_buffer_object *bo = entry->bo;
-		if (!entry->reserved)
-			continue;
 
-		if (!entry->removed) {
-			entry->put_count = ttm_bo_del_from_lru(bo);
-			entry->removed = true;
-		}
-	}
-}
-
-static void ttm_eu_list_ref_sub(struct list_head *list)
-{
-	struct ttm_validate_buffer *entry;
-
-	list_for_each_entry(entry, list, head) {
-		struct ttm_buffer_object *bo = entry->bo;
-
-		if (entry->put_count) {
-			ttm_bo_list_ref_sub(bo, entry->put_count, true);
-			entry->put_count = 0;
+		if (removed) {
+			ttm_bo_unreserve_locked(bo);
+		} else {
+			atomic_set(&bo->reserved, 0);
+			wake_up_all(&bo->event_queue);
 		}
 	}
 }
@@ -93,7 +63,7 @@  void ttm_eu_backoff_reservation(struct list_head *list)
 	entry = list_first_entry(list, struct ttm_validate_buffer, head);
 	glob = entry->bo->glob;
 	spin_lock(&glob->lru_lock);
-	ttm_eu_backoff_reservation_locked(list);
+	ttm_eu_backoff_reservation_locked(list, true);
 	spin_unlock(&glob->lru_lock);
 }
 EXPORT_SYMBOL(ttm_eu_backoff_reservation);
@@ -122,8 +92,6 @@  int ttm_eu_reserve_buffers(struct list_head *list)
 
 	list_for_each_entry(entry, list, head) {
 		entry->reserved = false;
-		entry->put_count = 0;
-		entry->removed = false;
 	}
 
 	entry = list_first_entry(list, struct ttm_validate_buffer, head);
@@ -141,26 +109,37 @@  retry:
 		case 0:
 			break;
 		case -EAGAIN:
-			ttm_eu_backoff_reservation_locked(list);
+			ttm_eu_backoff_reservation_locked(list, false);
 			spin_unlock(&glob->lru_lock);
-			ttm_eu_list_ref_sub(list);
 			ret = ttm_bo_wait_unreserved(bo, true);
 			if (unlikely(ret != 0))
 				return ret;
 			goto retry;
 		default:
-			ttm_eu_backoff_reservation_locked(list);
+			ttm_eu_backoff_reservation_locked(list, false);
 			spin_unlock(&glob->lru_lock);
-			ttm_eu_list_ref_sub(list);
 			return ret;
 		}
 
 		entry->reserved = true;
 	}
 
-	ttm_eu_del_from_lru_locked(list);
+	list_for_each_entry(entry, list, head) {
+		struct ttm_buffer_object *bo = entry->bo;
+
+		entry->put_count = ttm_bo_del_from_lru(bo);
+	}
+
 	spin_unlock(&glob->lru_lock);
-	ttm_eu_list_ref_sub(list);
+
+	list_for_each_entry(entry, list, head) {
+		struct ttm_buffer_object *bo = entry->bo;
+
+		if (entry->put_count) {
+			ttm_bo_list_ref_sub(bo, entry->put_count, true);
+			entry->put_count = 0;
+		}
+	}
 
 	return 0;
 }
diff --git a/include/drm/ttm/ttm_execbuf_util.h b/include/drm/ttm/ttm_execbuf_util.h
index 26cc7f9..0ef7c95 100644
--- a/include/drm/ttm/ttm_execbuf_util.h
+++ b/include/drm/ttm/ttm_execbuf_util.h
@@ -42,7 +42,6 @@ 
  * @new_sync_obj_arg: New sync_obj_arg for @bo, to be used once
  * adding a new sync object.
  * @reserved:       Indicates whether @bo has been reserved for validation.
- * @removed:        Indicates whether @bo has been removed from lru lists.
  * @put_count:      Number of outstanding references on bo::list_kref.
  * @old_sync_obj:   Pointer to a sync object about to be unreferenced
  */
@@ -52,7 +51,6 @@  struct ttm_validate_buffer {
 	struct ttm_buffer_object *bo;
 	void *new_sync_obj_arg;
 	bool reserved;
-	bool removed;
 	int put_count;
 	void *old_sync_obj;
 };