dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/5] Add reservation_object to drm_gem_object
@ 2019-02-02 15:41 Rob Herring
       [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  0 siblings, 1 reply; 14+ messages in thread
From: Rob Herring @ 2019-02-02 15:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Sean Paul, Rob Clark, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	etnaviv-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

This series implements the todo to add reservation_object to 
drm_gem_object. I converted the easy drivers, but not Intel or AMD. The 
series is build tested only.

Rob

v2:
 - Fix missing kerneldoc
 - Reword todo with what is left todo.
 - Fix timeout error handling (added to drm_gem_reservation_object_wait)

Rob Herring (5):
  drm: Add reservation_object to drm_gem_object
  drm: etnaviv: Switch to use drm_gem_object reservation_object
  drm: msm: Switch to use drm_gem_object reservation_object
  drm: v3d: Switch to use drm_gem_object reservation_object
  drm: vc4: Switch to use drm_gem_object reservation_object

 Documentation/gpu/todo.rst                   |  8 ++--
 drivers/gpu/drm/drm_gem.c                    | 43 ++++++++++++++++++++
 drivers/gpu/drm/drm_prime.c                  |  1 +
 drivers/gpu/drm/etnaviv/etnaviv_drv.c        |  1 -
 drivers/gpu/drm/etnaviv/etnaviv_drv.h        |  1 -
 drivers/gpu/drm/etnaviv/etnaviv_gem.c        | 16 +++-----
 drivers/gpu/drm/etnaviv/etnaviv_gem.h        |  4 --
 drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c  |  7 ----
 drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 22 +++++-----
 drivers/gpu/drm/msm/msm_drv.c                |  1 -
 drivers/gpu/drm/msm/msm_drv.h                |  1 -
 drivers/gpu/drm/msm/msm_gem.c                | 27 ++++--------
 drivers/gpu/drm/msm/msm_gem_prime.c          |  7 ----
 drivers/gpu/drm/msm/msm_gem_submit.c         |  8 ++--
 drivers/gpu/drm/v3d/v3d_bo.c                 | 14 +------
 drivers/gpu/drm/v3d/v3d_drv.c                |  1 -
 drivers/gpu/drm/v3d/v3d_drv.h                |  6 ---
 drivers/gpu/drm/v3d/v3d_gem.c                | 35 ++++------------
 drivers/gpu/drm/vc4/vc4_bo.c                 | 15 +------
 drivers/gpu/drm/vc4/vc4_drv.c                |  1 -
 drivers/gpu/drm/vc4/vc4_drv.h                |  6 ---
 drivers/gpu/drm/vc4/vc4_gem.c                | 18 ++++----
 drivers/gpu/drm/vc4/vc4_plane.c              |  2 +-
 include/drm/drm_gem.h                        | 21 ++++++++++
 24 files changed, 119 insertions(+), 147 deletions(-)

-- 
2.19.1

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 1/5] drm: Add reservation_object to drm_gem_object
       [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2019-02-02 15:41   ` Rob Herring
  2019-02-04  9:31     ` Daniel Vetter
                       ` (2 more replies)
  2019-02-02 15:41   ` [PATCH v2 2/5] drm: etnaviv: Switch to use drm_gem_object reservation_object Rob Herring
                     ` (4 subsequent siblings)
  5 siblings, 3 replies; 14+ messages in thread
From: Rob Herring @ 2019-02-02 15:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Sean Paul, Rob Clark, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	etnaviv-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

Many users of drm_gem_object embed a struct reservation_object into
their subclassed struct, so let's add one to struct drm_gem_object.
This will allow removing the reservation object from the subclasses
and removing the ->gem_prime_res_obj callback.

With the addition, add a drm_gem_reservation_object_wait() helper
function for drivers to use in wait ioctls.

Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <maxime.ripard@bootlin.com>
Cc: Sean Paul <sean@poorly.run>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
 - Fix missing kerneldoc
 - Reword todo with what is left todo.
 - Fix timeout error handling (added to drm_gem_reservation_object_wait)

 Documentation/gpu/todo.rst  |  8 +++----
 drivers/gpu/drm/drm_gem.c   | 43 +++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/drm_prime.c |  1 +
 include/drm/drm_gem.h       | 21 ++++++++++++++++++
 4 files changed, 69 insertions(+), 4 deletions(-)

diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
index 14191b64446d..c9ed55605641 100644
--- a/Documentation/gpu/todo.rst
+++ b/Documentation/gpu/todo.rst
@@ -209,12 +209,12 @@ Would be great to refactor this all into a set of small common helpers.
 
 Contact: Daniel Vetter
 
-Put a reservation_object into drm_gem_object
+Remove the ->gem_prime_res_obj callback
 --------------------------------------------
 
-This would remove the need for the ->gem_prime_res_obj callback. It would also
-allow us to implement generic helpers for waiting for a bo, allowing for quite a
-bit of refactoring in the various wait ioctl implementations.
+The ->gem_prime_res_obj callback can be removed from drivers by using the
+reservation_object in the drm_gem_object. It may also be possible to use the
+generic drm_gem_reservation_object_wait helper for waiting for a bo.
 
 Contact: Daniel Vetter
 
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 8b55ece97967..b09acbc5a655 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -170,6 +170,10 @@ void drm_gem_private_object_init(struct drm_device *dev,
 	kref_init(&obj->refcount);
 	obj->handle_count = 0;
 	obj->size = size;
+	reservation_object_init(&obj->_resv);
+	if (!obj->resv)
+		obj->resv = &obj->_resv;
+
 	drm_vma_node_reset(&obj->vma_node);
 }
 EXPORT_SYMBOL(drm_gem_private_object_init);
@@ -657,6 +661,44 @@ drm_gem_object_lookup(struct drm_file *filp, u32 handle)
 }
 EXPORT_SYMBOL(drm_gem_object_lookup);
 
+/**
+ * drm_gem_reservation_object_wait - Wait on GEM object's reservation's objects
+ * shared and/or exclusive fences.
+ * @filep: DRM file private date
+ * @handle: userspace handle
+ * @wait_all: if true, wait on all fences, else wait on just exclusive fence
+ * @timeout: timeout value in jiffies or zero to return immediately
+ *
+ * Returns:
+ *
+ * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or
+ * greater than 0 on success.
+ */
+long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
+				    bool wait_all, unsigned long timeout)
+{
+	long ret;
+	struct drm_gem_object *obj;
+
+	obj = drm_gem_object_lookup(filep, handle);
+	if (!obj) {
+		DRM_DEBUG("Failed to look up GEM BO %d\n", handle);
+		return -EINVAL;
+	}
+
+	ret = reservation_object_wait_timeout_rcu(obj->resv, wait_all,
+						  true, timeout);
+	if (ret == 0)
+		ret = -ETIME;
+	else if (ret > 0)
+		ret = 0;
+
+	drm_gem_object_put_unlocked(obj);
+
+	return ret;
+}
+EXPORT_SYMBOL(drm_gem_reservation_object_wait);
+
 /**
  * drm_gem_close_ioctl - implementation of the GEM_CLOSE ioctl
  * @dev: drm_device
@@ -821,6 +863,7 @@ drm_gem_object_release(struct drm_gem_object *obj)
 	if (obj->filp)
 		fput(obj->filp);
 
+	reservation_object_fini(&obj->_resv);
 	drm_gem_free_mmap_offset(obj);
 }
 EXPORT_SYMBOL(drm_gem_object_release);
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 231e3f6d5f41..dc079efb3b0f 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -504,6 +504,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
 		.size = obj->size,
 		.flags = flags,
 		.priv = obj,
+		.resv = obj->resv,
 	};
 
 	if (dev->driver->gem_prime_res_obj)
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index c95727425284..25f1ff2df464 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -35,6 +35,7 @@
  */
 
 #include <linux/kref.h>
+#include <linux/reservation.h>
 
 #include <drm/drm_vma_manager.h>
 
@@ -262,6 +263,24 @@ struct drm_gem_object {
 	 */
 	struct dma_buf_attachment *import_attach;
 
+	/**
+	 * @resv:
+	 *
+	 * Pointer to reservation object associated with the this GEM object.
+	 *
+	 * Normally (@resv == &@_resv) except for imported GEM objects.
+	 */
+	struct reservation_object *resv;
+
+	/**
+	 * @_resv:
+	 *
+	 * A reservation object for this GEM object.
+	 *
+	 * This is unused for imported GEM objects.
+	 */
+	struct reservation_object _resv;
+
 	/**
 	 * @funcs:
 	 *
@@ -363,6 +382,8 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
 		bool dirty, bool accessed);
 
 struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
+long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
+				    bool wait_all, unsigned long timeout);
 int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
 			    u32 handle, u64 *offset);
 int drm_gem_dumb_destroy(struct drm_file *file,
-- 
2.19.1

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 2/5] drm: etnaviv: Switch to use drm_gem_object reservation_object
       [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2019-02-02 15:41   ` [PATCH v2 1/5] drm: " Rob Herring
@ 2019-02-02 15:41   ` Rob Herring
  2019-02-12 18:33     ` Christian Gmeiner via dri-devel
  2019-02-02 15:41   ` [PATCH v2 3/5] drm: msm: " Rob Herring
                     ` (3 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Rob Herring @ 2019-02-02 15:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Sean Paul, Rob Clark, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	etnaviv-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

Now that the base struct drm_gem_object has a reservation_object, use it
and remove the private BO one.

Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Russell King <linux+etnaviv@armlinux.org.uk>
Cc: Christian Gmeiner <christian.gmeiner@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: etnaviv@lists.freedesktop.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/gpu/drm/etnaviv/etnaviv_drv.c        |  1 -
 drivers/gpu/drm/etnaviv/etnaviv_drv.h        |  1 -
 drivers/gpu/drm/etnaviv/etnaviv_gem.c        | 16 +++++---------
 drivers/gpu/drm/etnaviv/etnaviv_gem.h        |  4 ----
 drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c  |  7 -------
 drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 22 ++++++++++----------
 6 files changed, 16 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 18c27f795cf6..9f42f7538236 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -473,7 +473,6 @@ static struct drm_driver etnaviv_drm_driver = {
 	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
 	.gem_prime_export   = drm_gem_prime_export,
 	.gem_prime_import   = drm_gem_prime_import,
-	.gem_prime_res_obj  = etnaviv_gem_prime_res_obj,
 	.gem_prime_pin      = etnaviv_gem_prime_pin,
 	.gem_prime_unpin    = etnaviv_gem_prime_unpin,
 	.gem_prime_get_sg_table = etnaviv_gem_prime_get_sg_table,
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
index 4bf698de5996..351db0c5822d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
@@ -61,7 +61,6 @@ void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj);
 void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
 int etnaviv_gem_prime_mmap(struct drm_gem_object *obj,
 			   struct vm_area_struct *vma);
-struct reservation_object *etnaviv_gem_prime_res_obj(struct drm_gem_object *obj);
 struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
 	struct dma_buf_attachment *attach, struct sg_table *sg);
 int etnaviv_gem_prime_pin(struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index 1fa74226db91..3e954adcb2cc 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -397,13 +397,13 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
 	}
 
 	if (op & ETNA_PREP_NOSYNC) {
-		if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
+		if (!reservation_object_test_signaled_rcu(obj->resv,
 							  write))
 			return -EBUSY;
 	} else {
 		unsigned long remain = etnaviv_timeout_to_jiffies(timeout);
 
-		ret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv,
+		ret = reservation_object_wait_timeout_rcu(obj->resv,
 							  write, true, remain);
 		if (ret <= 0)
 			return ret == 0 ? -ETIMEDOUT : ret;
@@ -459,7 +459,7 @@ static void etnaviv_gem_describe_fence(struct dma_fence *fence,
 static void etnaviv_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
 {
 	struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
-	struct reservation_object *robj = etnaviv_obj->resv;
+	struct reservation_object *robj = obj->resv;
 	struct reservation_object_list *fobj;
 	struct dma_fence *fence;
 	unsigned long off = drm_vma_node_start(&obj->vma_node);
@@ -549,8 +549,6 @@ void etnaviv_gem_free_object(struct drm_gem_object *obj)
 
 	drm_gem_free_mmap_offset(obj);
 	etnaviv_obj->ops->release(etnaviv_obj);
-	if (etnaviv_obj->resv == &etnaviv_obj->_resv)
-		reservation_object_fini(&etnaviv_obj->_resv);
 	drm_gem_object_release(obj);
 
 	kfree(etnaviv_obj);
@@ -596,12 +594,8 @@ static int etnaviv_gem_new_impl(struct drm_device *dev, u32 size, u32 flags,
 
 	etnaviv_obj->flags = flags;
 	etnaviv_obj->ops = ops;
-	if (robj) {
-		etnaviv_obj->resv = robj;
-	} else {
-		etnaviv_obj->resv = &etnaviv_obj->_resv;
-		reservation_object_init(&etnaviv_obj->_resv);
-	}
+	if (robj)
+		etnaviv_obj->base.resv = robj;
 
 	mutex_init(&etnaviv_obj->lock);
 	INIT_LIST_HEAD(&etnaviv_obj->vram_list);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
index 76079c2291f8..7015837ccc1c 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
@@ -47,10 +47,6 @@ struct etnaviv_gem_object {
 	struct sg_table *sgt;
 	void *vaddr;
 
-	/* normally (resv == &_resv) except for imported bo's */
-	struct reservation_object *resv;
-	struct reservation_object _resv;
-
 	struct list_head vram_list;
 
 	/* cache maintenance */
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
index 0566171f8df2..01e7ad96339c 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
@@ -139,10 +139,3 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
 
 	return ERR_PTR(ret);
 }
-
-struct reservation_object *etnaviv_gem_prime_res_obj(struct drm_gem_object *obj)
-{
-	struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
-
-	return etnaviv_obj->resv;
-}
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 30875f8f2933..a10281e915e5 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -108,9 +108,9 @@ static int submit_lookup_objects(struct etnaviv_gem_submit *submit,
 static void submit_unlock_object(struct etnaviv_gem_submit *submit, int i)
 {
 	if (submit->bos[i].flags & BO_LOCKED) {
-		struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
+		struct drm_gem_object *obj = &submit->bos[i].obj->base;
 
-		ww_mutex_unlock(&etnaviv_obj->resv->lock);
+		ww_mutex_unlock(&obj->resv->lock);
 		submit->bos[i].flags &= ~BO_LOCKED;
 	}
 }
@@ -122,7 +122,7 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit,
 
 retry:
 	for (i = 0; i < submit->nr_bos; i++) {
-		struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
+		struct drm_gem_object *obj = &submit->bos[i].obj->base;
 
 		if (slow_locked == i)
 			slow_locked = -1;
@@ -130,7 +130,7 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit,
 		contended = i;
 
 		if (!(submit->bos[i].flags & BO_LOCKED)) {
-			ret = ww_mutex_lock_interruptible(&etnaviv_obj->resv->lock,
+			ret = ww_mutex_lock_interruptible(&obj->resv->lock,
 							  ticket);
 			if (ret == -EALREADY)
 				DRM_ERROR("BO at index %u already on submit list\n",
@@ -153,12 +153,12 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit,
 		submit_unlock_object(submit, slow_locked);
 
 	if (ret == -EDEADLK) {
-		struct etnaviv_gem_object *etnaviv_obj;
+		struct drm_gem_object *obj;
 
-		etnaviv_obj = submit->bos[contended].obj;
+		obj = &submit->bos[contended].obj->base;
 
 		/* we lost out in a seqno race, lock and retry.. */
-		ret = ww_mutex_lock_slow_interruptible(&etnaviv_obj->resv->lock,
+		ret = ww_mutex_lock_slow_interruptible(&obj->resv->lock,
 						       ticket);
 		if (!ret) {
 			submit->bos[contended].flags |= BO_LOCKED;
@@ -176,7 +176,7 @@ static int submit_fence_sync(struct etnaviv_gem_submit *submit)
 
 	for (i = 0; i < submit->nr_bos; i++) {
 		struct etnaviv_gem_submit_bo *bo = &submit->bos[i];
-		struct reservation_object *robj = bo->obj->resv;
+		struct reservation_object *robj = bo->obj->base.resv;
 
 		if (!(bo->flags & ETNA_SUBMIT_BO_WRITE)) {
 			ret = reservation_object_reserve_shared(robj, 1);
@@ -207,13 +207,13 @@ static void submit_attach_object_fences(struct etnaviv_gem_submit *submit)
 	int i;
 
 	for (i = 0; i < submit->nr_bos; i++) {
-		struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
+		struct drm_gem_object *obj = &submit->bos[i].obj->base;
 
 		if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE)
-			reservation_object_add_excl_fence(etnaviv_obj->resv,
+			reservation_object_add_excl_fence(obj->resv,
 							  submit->out_fence);
 		else
-			reservation_object_add_shared_fence(etnaviv_obj->resv,
+			reservation_object_add_shared_fence(obj->resv,
 							    submit->out_fence);
 
 		submit_unlock_object(submit, i);
-- 
2.19.1

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 3/5] drm: msm: Switch to use drm_gem_object reservation_object
       [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2019-02-02 15:41   ` [PATCH v2 1/5] drm: " Rob Herring
  2019-02-02 15:41   ` [PATCH v2 2/5] drm: etnaviv: Switch to use drm_gem_object reservation_object Rob Herring
@ 2019-02-02 15:41   ` Rob Herring
       [not found]     ` <20190202154158.10443-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
  2019-02-02 15:41   ` [PATCH v2 4/5] drm: v3d: " Rob Herring
                     ` (2 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Rob Herring @ 2019-02-02 15:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Sean Paul, Rob Clark, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	etnaviv-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

Now that the base struct drm_gem_object has a reservation_object, use it
and remove the private BO one.

We can't use the drm_gem_reservation_object_wait() helper for MSM
because (in theory) msm_gem_cpu_prep() will also do some cache
maintenance on the GEM object.

Cc: Rob Clark <robdclark@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: linux-arm-msm@vger.kernel.org
Cc: dri-devel@lists.freedesktop.org
Cc: freedreno@lists.freedesktop.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/gpu/drm/msm/msm_drv.c        |  1 -
 drivers/gpu/drm/msm/msm_drv.h        |  1 -
 drivers/gpu/drm/msm/msm_gem.c        | 27 +++++++++------------------
 drivers/gpu/drm/msm/msm_gem_prime.c  |  7 -------
 drivers/gpu/drm/msm/msm_gem_submit.c |  8 ++++----
 5 files changed, 13 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index d2cdc7b553fe..522ddbd72250 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1086,7 +1086,6 @@ static struct drm_driver msm_driver = {
 	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
 	.gem_prime_export   = drm_gem_prime_export,
 	.gem_prime_import   = drm_gem_prime_import,
-	.gem_prime_res_obj  = msm_gem_prime_res_obj,
 	.gem_prime_pin      = msm_gem_prime_pin,
 	.gem_prime_unpin    = msm_gem_prime_unpin,
 	.gem_prime_get_sg_table = msm_gem_prime_get_sg_table,
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 927e5d86f7c1..068f9172ad70 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -300,7 +300,6 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj);
 void *msm_gem_prime_vmap(struct drm_gem_object *obj);
 void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
 int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
-struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj);
 struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
 		struct dma_buf_attachment *attach, struct sg_table *sg);
 int msm_gem_prime_pin(struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index c8886d3071fa..d3973cc26522 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -672,14 +672,13 @@ void msm_gem_vunmap(struct drm_gem_object *obj, enum msm_gem_lock subclass)
 int msm_gem_sync_object(struct drm_gem_object *obj,
 		struct msm_fence_context *fctx, bool exclusive)
 {
-	struct msm_gem_object *msm_obj = to_msm_bo(obj);
 	struct reservation_object_list *fobj;
 	struct dma_fence *fence;
 	int i, ret;
 
-	fobj = reservation_object_get_list(msm_obj->resv);
+	fobj = reservation_object_get_list(obj->resv);
 	if (!fobj || (fobj->shared_count == 0)) {
-		fence = reservation_object_get_excl(msm_obj->resv);
+		fence = reservation_object_get_excl(obj->resv);
 		/* don't need to wait on our own fences, since ring is fifo */
 		if (fence && (fence->context != fctx->context)) {
 			ret = dma_fence_wait(fence, true);
@@ -693,7 +692,7 @@ int msm_gem_sync_object(struct drm_gem_object *obj,
 
 	for (i = 0; i < fobj->shared_count; i++) {
 		fence = rcu_dereference_protected(fobj->shared[i],
-						reservation_object_held(msm_obj->resv));
+						reservation_object_held(obj->resv));
 		if (fence->context != fctx->context) {
 			ret = dma_fence_wait(fence, true);
 			if (ret)
@@ -711,9 +710,9 @@ void msm_gem_move_to_active(struct drm_gem_object *obj,
 	WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
 	msm_obj->gpu = gpu;
 	if (exclusive)
-		reservation_object_add_excl_fence(msm_obj->resv, fence);
+		reservation_object_add_excl_fence(obj->resv, fence);
 	else
-		reservation_object_add_shared_fence(msm_obj->resv, fence);
+		reservation_object_add_shared_fence(obj->resv, fence);
 	list_del_init(&msm_obj->mm_list);
 	list_add_tail(&msm_obj->mm_list, &gpu->active_list);
 }
@@ -733,13 +732,12 @@ void msm_gem_move_to_inactive(struct drm_gem_object *obj)
 
 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
 {
-	struct msm_gem_object *msm_obj = to_msm_bo(obj);
 	bool write = !!(op & MSM_PREP_WRITE);
 	unsigned long remain =
 		op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout);
 	long ret;
 
-	ret = reservation_object_wait_timeout_rcu(msm_obj->resv, write,
+	ret = reservation_object_wait_timeout_rcu(obj->resv, write,
 						  true,  remain);
 	if (ret == 0)
 		return remain == 0 ? -EBUSY : -ETIMEDOUT;
@@ -771,7 +769,7 @@ static void describe_fence(struct dma_fence *fence, const char *type,
 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
 {
 	struct msm_gem_object *msm_obj = to_msm_bo(obj);
-	struct reservation_object *robj = msm_obj->resv;
+	struct reservation_object *robj = obj->resv;
 	struct reservation_object_list *fobj;
 	struct dma_fence *fence;
 	struct msm_gem_vma *vma;
@@ -883,9 +881,6 @@ void msm_gem_free_object(struct drm_gem_object *obj)
 		put_pages(obj);
 	}
 
-	if (msm_obj->resv == &msm_obj->_resv)
-		reservation_object_fini(msm_obj->resv);
-
 	drm_gem_object_release(obj);
 
 	mutex_unlock(&msm_obj->lock);
@@ -945,12 +940,8 @@ static int msm_gem_new_impl(struct drm_device *dev,
 	msm_obj->flags = flags;
 	msm_obj->madv = MSM_MADV_WILLNEED;
 
-	if (resv) {
-		msm_obj->resv = resv;
-	} else {
-		msm_obj->resv = &msm_obj->_resv;
-		reservation_object_init(msm_obj->resv);
-	}
+	if (resv)
+		msm_obj->base.resv = resv;
 
 	INIT_LIST_HEAD(&msm_obj->submit_entry);
 	INIT_LIST_HEAD(&msm_obj->vmas);
diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c
index 13403c6da6c7..60bb290700ce 100644
--- a/drivers/gpu/drm/msm/msm_gem_prime.c
+++ b/drivers/gpu/drm/msm/msm_gem_prime.c
@@ -70,10 +70,3 @@ void msm_gem_prime_unpin(struct drm_gem_object *obj)
 	if (!obj->import_attach)
 		msm_gem_put_pages(obj);
 }
-
-struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj)
-{
-	struct msm_gem_object *msm_obj = to_msm_bo(obj);
-
-	return msm_obj->resv;
-}
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
index 12b983fc0b56..df302521ec74 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -173,7 +173,7 @@ static void submit_unlock_unpin_bo(struct msm_gem_submit *submit,
 		msm_gem_unpin_iova(&msm_obj->base, submit->gpu->aspace);
 
 	if (submit->bos[i].flags & BO_LOCKED)
-		ww_mutex_unlock(&msm_obj->resv->lock);
+		ww_mutex_unlock(&msm_obj->base.resv->lock);
 
 	if (backoff && !(submit->bos[i].flags & BO_VALID))
 		submit->bos[i].iova = 0;
@@ -196,7 +196,7 @@ static int submit_lock_objects(struct msm_gem_submit *submit)
 		contended = i;
 
 		if (!(submit->bos[i].flags & BO_LOCKED)) {
-			ret = ww_mutex_lock_interruptible(&msm_obj->resv->lock,
+			ret = ww_mutex_lock_interruptible(&msm_obj->base.resv->lock,
 					&submit->ticket);
 			if (ret)
 				goto fail;
@@ -218,7 +218,7 @@ static int submit_lock_objects(struct msm_gem_submit *submit)
 	if (ret == -EDEADLK) {
 		struct msm_gem_object *msm_obj = submit->bos[contended].obj;
 		/* we lost out in a seqno race, lock and retry.. */
-		ret = ww_mutex_lock_slow_interruptible(&msm_obj->resv->lock,
+		ret = ww_mutex_lock_slow_interruptible(&msm_obj->base.resv->lock,
 				&submit->ticket);
 		if (!ret) {
 			submit->bos[contended].flags |= BO_LOCKED;
@@ -244,7 +244,7 @@ static int submit_fence_sync(struct msm_gem_submit *submit, bool no_implicit)
 			 * strange place to call it.  OTOH this is a
 			 * convenient can-fail point to hook it in.
 			 */
-			ret = reservation_object_reserve_shared(msm_obj->resv,
+			ret = reservation_object_reserve_shared(msm_obj->base.resv,
 								1);
 			if (ret)
 				return ret;
-- 
2.19.1

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 4/5] drm: v3d: Switch to use drm_gem_object reservation_object
       [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
                     ` (2 preceding siblings ...)
  2019-02-02 15:41   ` [PATCH v2 3/5] drm: msm: " Rob Herring
@ 2019-02-02 15:41   ` Rob Herring
  2019-02-02 15:41   ` [PATCH v2 5/5] drm: vc4: " Rob Herring
  2019-02-12 14:22   ` [PATCH v2 0/5] Add reservation_object to drm_gem_object Daniel Vetter
  5 siblings, 0 replies; 14+ messages in thread
From: Rob Herring @ 2019-02-02 15:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Sean Paul, Rob Clark, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	etnaviv-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

Now that the base struct drm_gem_object has a reservation_object, use it
and remove the private BO one.

Cc: Eric Anholt <eric@anholt.net>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2:
 - No change. Added the timeout handling to 
   drm_gem_reservation_object_wait

 drivers/gpu/drm/v3d/v3d_bo.c  | 14 +-------------
 drivers/gpu/drm/v3d/v3d_drv.c |  1 -
 drivers/gpu/drm/v3d/v3d_drv.h |  6 ------
 drivers/gpu/drm/v3d/v3d_gem.c | 35 +++++++++--------------------------
 4 files changed, 10 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_bo.c b/drivers/gpu/drm/v3d/v3d_bo.c
index a08766d39eab..814213d18a15 100644
--- a/drivers/gpu/drm/v3d/v3d_bo.c
+++ b/drivers/gpu/drm/v3d/v3d_bo.c
@@ -155,9 +155,6 @@ struct v3d_bo *v3d_bo_create(struct drm_device *dev, struct drm_file *file_priv,
 		return bo;
 	obj = &bo->base;
 
-	bo->resv = &bo->_resv;
-	reservation_object_init(bo->resv);
-
 	ret = v3d_bo_get_pages(bo);
 	if (ret)
 		goto free_mm;
@@ -194,8 +191,6 @@ void v3d_free_object(struct drm_gem_object *obj)
 	v3d->bo_stats.pages_allocated -= obj->size >> PAGE_SHIFT;
 	mutex_unlock(&v3d->bo_lock);
 
-	reservation_object_fini(&bo->_resv);
-
 	v3d_bo_put_pages(bo);
 
 	if (obj->import_attach)
@@ -212,13 +207,6 @@ void v3d_free_object(struct drm_gem_object *obj)
 	kfree(bo);
 }
 
-struct reservation_object *v3d_prime_res_obj(struct drm_gem_object *obj)
-{
-	struct v3d_bo *bo = to_v3d_bo(obj);
-
-	return bo->resv;
-}
-
 static void
 v3d_set_mmap_vma_flags(struct vm_area_struct *vma)
 {
@@ -290,7 +278,7 @@ v3d_prime_import_sg_table(struct drm_device *dev,
 		return ERR_CAST(bo);
 	obj = &bo->base;
 
-	bo->resv = attach->dmabuf->resv;
+	obj->resv = attach->dmabuf->resv;
 
 	bo->sgt = sgt;
 	obj->import_attach = attach;
diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index f0afcec72c34..bafe8e54e75b 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -214,7 +214,6 @@ static struct drm_driver v3d_drm_driver = {
 	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
 	.gem_prime_import = drm_gem_prime_import,
 	.gem_prime_export = drm_gem_prime_export,
-	.gem_prime_res_obj = v3d_prime_res_obj,
 	.gem_prime_get_sg_table	= v3d_prime_get_sg_table,
 	.gem_prime_import_sg_table = v3d_prime_import_sg_table,
 	.gem_prime_mmap = v3d_prime_mmap,
diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h
index dcb772a19191..fc35412eba33 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
@@ -1,7 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+
 /* Copyright (C) 2015-2018 Broadcom */
 
-#include <linux/reservation.h>
 #include <linux/mm_types.h>
 #include <drm/drmP.h>
 #include <drm/drm_encoder.h>
@@ -133,10 +132,6 @@ struct v3d_bo {
 	 * v3d_exec_info->unref_list
 	 */
 	struct list_head unref_head;
-
-	/* normally (resv == &_resv) except for imported bo's */
-	struct reservation_object *resv;
-	struct reservation_object _resv;
 };
 
 static inline struct v3d_bo *
@@ -281,7 +276,6 @@ int v3d_get_bo_offset_ioctl(struct drm_device *dev, void *data,
 			    struct drm_file *file_priv);
 vm_fault_t v3d_gem_fault(struct vm_fault *vmf);
 int v3d_mmap(struct file *filp, struct vm_area_struct *vma);
-struct reservation_object *v3d_prime_res_obj(struct drm_gem_object *obj);
 int v3d_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 struct sg_table *v3d_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *v3d_prime_import_sg_table(struct drm_device *dev,
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 05ca6319065e..bee4fc3f47a8 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -214,7 +214,7 @@ v3d_attach_object_fences(struct v3d_bo **bos, int bo_count,
 
 	for (i = 0; i < bo_count; i++) {
 		/* XXX: Use shared fences for read-only objects. */
-		reservation_object_add_excl_fence(bos[i]->resv, fence);
+		reservation_object_add_excl_fence(bos[i]->base.resv, fence);
 	}
 }
 
@@ -226,7 +226,7 @@ v3d_unlock_bo_reservations(struct v3d_bo **bos,
 	int i;
 
 	for (i = 0; i < bo_count; i++)
-		ww_mutex_unlock(&bos[i]->resv->lock);
+		ww_mutex_unlock(&bos[i]->base.resv->lock);
 
 	ww_acquire_fini(acquire_ctx);
 }
@@ -252,7 +252,7 @@ v3d_lock_bo_reservations(struct v3d_bo **bos,
 	if (contended_lock != -1) {
 		struct v3d_bo *bo = bos[contended_lock];
 
-		ret = ww_mutex_lock_slow_interruptible(&bo->resv->lock,
+		ret = ww_mutex_lock_slow_interruptible(&bo->base.resv->lock,
 						       acquire_ctx);
 		if (ret) {
 			ww_acquire_done(acquire_ctx);
@@ -264,18 +264,18 @@ v3d_lock_bo_reservations(struct v3d_bo **bos,
 		if (i == contended_lock)
 			continue;
 
-		ret = ww_mutex_lock_interruptible(&bos[i]->resv->lock,
+		ret = ww_mutex_lock_interruptible(&bos[i]->base.resv->lock,
 						  acquire_ctx);
 		if (ret) {
 			int j;
 
 			for (j = 0; j < i; j++)
-				ww_mutex_unlock(&bos[j]->resv->lock);
+				ww_mutex_unlock(&bos[j]->base.resv->lock);
 
 			if (contended_lock != -1 && contended_lock >= i) {
 				struct v3d_bo *bo = bos[contended_lock];
 
-				ww_mutex_unlock(&bo->resv->lock);
+				ww_mutex_unlock(&bo->base.resv->lock);
 			}
 
 			if (ret == -EDEADLK) {
@@ -294,7 +294,7 @@ v3d_lock_bo_reservations(struct v3d_bo **bos,
 	 * before we commit the CL to the hardware.
 	 */
 	for (i = 0; i < bo_count; i++) {
-		ret = reservation_object_reserve_shared(bos[i]->resv, 1);
+		ret = reservation_object_reserve_shared(bos[i]->base.resv, 1);
 		if (ret) {
 			v3d_unlock_bo_reservations(bos, bo_count,
 						   acquire_ctx);
@@ -453,8 +453,6 @@ v3d_wait_bo_ioctl(struct drm_device *dev, void *data,
 {
 	int ret;
 	struct drm_v3d_wait_bo *args = data;
-	struct drm_gem_object *gem_obj;
-	struct v3d_bo *bo;
 	ktime_t start = ktime_get();
 	u64 delta_ns;
 	unsigned long timeout_jiffies =
@@ -463,21 +461,8 @@ v3d_wait_bo_ioctl(struct drm_device *dev, void *data,
 	if (args->pad != 0)
 		return -EINVAL;
 
-	gem_obj = drm_gem_object_lookup(file_priv, args->handle);
-	if (!gem_obj) {
-		DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle);
-		return -EINVAL;
-	}
-	bo = to_v3d_bo(gem_obj);
-
-	ret = reservation_object_wait_timeout_rcu(bo->resv,
-						  true, true,
-						  timeout_jiffies);
-
-	if (ret == 0)
-		ret = -ETIME;
-	else if (ret > 0)
-		ret = 0;
+	ret = drm_gem_reservation_object_wait(file_priv, args->handle,
+					      true, timeout_jiffies);
 
 	/* Decrement the user's timeout, in case we got interrupted
 	 * such that the ioctl will be restarted.
@@ -492,8 +477,6 @@ v3d_wait_bo_ioctl(struct drm_device *dev, void *data,
 	if (ret == -ETIME && args->timeout_ns)
 		ret = -EAGAIN;
 
-	drm_gem_object_put_unlocked(gem_obj);
-
 	return ret;
 }
 
-- 
2.19.1

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 5/5] drm: vc4: Switch to use drm_gem_object reservation_object
       [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
                     ` (3 preceding siblings ...)
  2019-02-02 15:41   ` [PATCH v2 4/5] drm: v3d: " Rob Herring
@ 2019-02-02 15:41   ` Rob Herring
  2019-02-12 14:22   ` [PATCH v2 0/5] Add reservation_object to drm_gem_object Daniel Vetter
  5 siblings, 0 replies; 14+ messages in thread
From: Rob Herring @ 2019-02-02 15:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Sean Paul, Rob Clark, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	etnaviv-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

Now that the base struct drm_gem_object has a reservation_object, use it
and remove the private BO one.

Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/gpu/drm/vc4/vc4_bo.c    | 15 +--------------
 drivers/gpu/drm/vc4/vc4_drv.c   |  1 -
 drivers/gpu/drm/vc4/vc4_drv.h   |  6 ------
 drivers/gpu/drm/vc4/vc4_gem.c   | 18 +++++++++---------
 drivers/gpu/drm/vc4/vc4_plane.c |  2 +-
 5 files changed, 11 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
index 8dcce7182bb7..92e3f98d8478 100644
--- a/drivers/gpu/drm/vc4/vc4_bo.c
+++ b/drivers/gpu/drm/vc4/vc4_bo.c
@@ -201,8 +201,6 @@ static void vc4_bo_destroy(struct vc4_bo *bo)
 		bo->validated_shader = NULL;
 	}
 
-	reservation_object_fini(&bo->_resv);
-
 	drm_gem_cma_free_object(obj);
 }
 
@@ -427,8 +425,6 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
 	vc4->bo_labels[VC4_BO_TYPE_KERNEL].num_allocated++;
 	vc4->bo_labels[VC4_BO_TYPE_KERNEL].size_allocated += size;
 	mutex_unlock(&vc4->bo_lock);
-	bo->resv = &bo->_resv;
-	reservation_object_init(bo->resv);
 
 	return &bo->base.base;
 }
@@ -684,13 +680,6 @@ static void vc4_bo_cache_time_timer(struct timer_list *t)
 	schedule_work(&vc4->bo_cache.time_work);
 }
 
-struct reservation_object *vc4_prime_res_obj(struct drm_gem_object *obj)
-{
-	struct vc4_bo *bo = to_vc4_bo(obj);
-
-	return bo->resv;
-}
-
 struct dma_buf *
 vc4_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags)
 {
@@ -822,14 +811,12 @@ vc4_prime_import_sg_table(struct drm_device *dev,
 			  struct sg_table *sgt)
 {
 	struct drm_gem_object *obj;
-	struct vc4_bo *bo;
 
 	obj = drm_gem_cma_prime_import_sg_table(dev, attach, sgt);
 	if (IS_ERR(obj))
 		return obj;
 
-	bo = to_vc4_bo(obj);
-	bo->resv = attach->dmabuf->resv;
+	obj->resv = attach->dmabuf->resv;
 
 	return obj;
 }
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index f6f5cd80c04d..d17df8c0291b 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -201,7 +201,6 @@ static struct drm_driver vc4_drm_driver = {
 	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
 	.gem_prime_import = drm_gem_prime_import,
 	.gem_prime_export = vc4_prime_export,
-	.gem_prime_res_obj = vc4_prime_res_obj,
 	.gem_prime_get_sg_table	= drm_gem_cma_prime_get_sg_table,
 	.gem_prime_import_sg_table = vc4_prime_import_sg_table,
 	.gem_prime_vmap = vc4_prime_vmap,
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 4f87b03f837d..03e9615b7229 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -7,7 +7,6 @@
  */
 
 #include <linux/mm_types.h>
-#include <linux/reservation.h>
 #include <drm/drmP.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -239,10 +238,6 @@ struct vc4_bo {
 	 */
 	struct vc4_validated_shader_info *validated_shader;
 
-	/* normally (resv == &_resv) except for imported bo's */
-	struct reservation_object *resv;
-	struct reservation_object _resv;
-
 	/* One of enum vc4_kernel_bo_type, or VC4_BO_TYPE_COUNT + i
 	 * for user-allocated labels.
 	 */
@@ -684,7 +679,6 @@ int vc4_label_bo_ioctl(struct drm_device *dev, void *data,
 		       struct drm_file *file_priv);
 vm_fault_t vc4_fault(struct vm_fault *vmf);
 int vc4_mmap(struct file *filp, struct vm_area_struct *vma);
-struct reservation_object *vc4_prime_res_obj(struct drm_gem_object *obj);
 int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
 struct drm_gem_object *vc4_prime_import_sg_table(struct drm_device *dev,
 						 struct dma_buf_attachment *attach,
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
index aea2b8dfec17..5ee5bf7fedf7 100644
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
@@ -536,7 +536,7 @@ vc4_update_bo_seqnos(struct vc4_exec_info *exec, uint64_t seqno)
 		bo = to_vc4_bo(&exec->bo[i]->base);
 		bo->seqno = seqno;
 
-		reservation_object_add_shared_fence(bo->resv, exec->fence);
+		reservation_object_add_shared_fence(bo->base.base.resv, exec->fence);
 	}
 
 	list_for_each_entry(bo, &exec->unref_list, unref_head) {
@@ -547,7 +547,7 @@ vc4_update_bo_seqnos(struct vc4_exec_info *exec, uint64_t seqno)
 		bo = to_vc4_bo(&exec->rcl_write_bo[i]->base);
 		bo->write_seqno = seqno;
 
-		reservation_object_add_excl_fence(bo->resv, exec->fence);
+		reservation_object_add_excl_fence(bo->base.base.resv, exec->fence);
 	}
 }
 
@@ -559,7 +559,7 @@ vc4_unlock_bo_reservations(struct drm_device *dev,
 	int i;
 
 	for (i = 0; i < exec->bo_count; i++) {
-		struct vc4_bo *bo = to_vc4_bo(&exec->bo[i]->base);
+		struct drm_gem_object *bo = &exec->bo[i]->base;
 
 		ww_mutex_unlock(&bo->resv->lock);
 	}
@@ -581,13 +581,13 @@ vc4_lock_bo_reservations(struct drm_device *dev,
 {
 	int contended_lock = -1;
 	int i, ret;
-	struct vc4_bo *bo;
+	struct drm_gem_object *bo;
 
 	ww_acquire_init(acquire_ctx, &reservation_ww_class);
 
 retry:
 	if (contended_lock != -1) {
-		bo = to_vc4_bo(&exec->bo[contended_lock]->base);
+		bo = &exec->bo[contended_lock]->base;
 		ret = ww_mutex_lock_slow_interruptible(&bo->resv->lock,
 						       acquire_ctx);
 		if (ret) {
@@ -600,19 +600,19 @@ vc4_lock_bo_reservations(struct drm_device *dev,
 		if (i == contended_lock)
 			continue;
 
-		bo = to_vc4_bo(&exec->bo[i]->base);
+		bo = &exec->bo[i]->base;
 
 		ret = ww_mutex_lock_interruptible(&bo->resv->lock, acquire_ctx);
 		if (ret) {
 			int j;
 
 			for (j = 0; j < i; j++) {
-				bo = to_vc4_bo(&exec->bo[j]->base);
+				bo = &exec->bo[j]->base;
 				ww_mutex_unlock(&bo->resv->lock);
 			}
 
 			if (contended_lock != -1 && contended_lock >= i) {
-				bo = to_vc4_bo(&exec->bo[contended_lock]->base);
+				bo = &exec->bo[contended_lock]->base;
 
 				ww_mutex_unlock(&bo->resv->lock);
 			}
@@ -633,7 +633,7 @@ vc4_lock_bo_reservations(struct drm_device *dev,
 	 * before we commit the CL to the hardware.
 	 */
 	for (i = 0; i < exec->bo_count; i++) {
-		bo = to_vc4_bo(&exec->bo[i]->base);
+		bo = &exec->bo[i]->base;
 
 		ret = reservation_object_reserve_shared(bo->resv, 1);
 		if (ret) {
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index 75db62cbe468..b8baceebb73b 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -994,7 +994,7 @@ static int vc4_prepare_fb(struct drm_plane *plane,
 
 	bo = to_vc4_bo(&drm_fb_cma_get_gem_obj(state->fb, 0)->base);
 
-	fence = reservation_object_get_excl_rcu(bo->resv);
+	fence = reservation_object_get_excl_rcu(bo->base.base.resv);
 	drm_atomic_set_fence_for_plane(state, fence);
 
 	if (plane->state->fb == state->fb)
-- 
2.19.1

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/5] drm: Add reservation_object to drm_gem_object
  2019-02-02 15:41   ` [PATCH v2 1/5] drm: " Rob Herring
@ 2019-02-04  9:31     ` Daniel Vetter
  2019-02-06 22:59     ` Eric Anholt
  2019-02-08  7:23     ` Christian Gmeiner
  2 siblings, 0 replies; 14+ messages in thread
From: Daniel Vetter @ 2019-02-04  9:31 UTC (permalink / raw)
  To: Rob Herring
  Cc: Sean Paul, Maxime Ripard, David Airlie, linux-arm-msm, etnaviv,
	dri-devel, Russell King, freedreno

On Sat, Feb 02, 2019 at 09:41:54AM -0600, Rob Herring wrote:
> Many users of drm_gem_object embed a struct reservation_object into
> their subclassed struct, so let's add one to struct drm_gem_object.
> This will allow removing the reservation object from the subclasses
> and removing the ->gem_prime_res_obj callback.
> 
> With the addition, add a drm_gem_reservation_object_wait() helper
> function for drivers to use in wait ioctls.
> 
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <maxime.ripard@bootlin.com>
> Cc: Sean Paul <sean@poorly.run>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> v2:
>  - Fix missing kerneldoc
>  - Reword todo with what is left todo.
>  - Fix timeout error handling (added to drm_gem_reservation_object_wait)

Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> 
>  Documentation/gpu/todo.rst  |  8 +++----
>  drivers/gpu/drm/drm_gem.c   | 43 +++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/drm_prime.c |  1 +
>  include/drm/drm_gem.h       | 21 ++++++++++++++++++
>  4 files changed, 69 insertions(+), 4 deletions(-)
> 
> diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
> index 14191b64446d..c9ed55605641 100644
> --- a/Documentation/gpu/todo.rst
> +++ b/Documentation/gpu/todo.rst
> @@ -209,12 +209,12 @@ Would be great to refactor this all into a set of small common helpers.
>  
>  Contact: Daniel Vetter
>  
> -Put a reservation_object into drm_gem_object
> +Remove the ->gem_prime_res_obj callback
>  --------------------------------------------
>  
> -This would remove the need for the ->gem_prime_res_obj callback. It would also
> -allow us to implement generic helpers for waiting for a bo, allowing for quite a
> -bit of refactoring in the various wait ioctl implementations.
> +The ->gem_prime_res_obj callback can be removed from drivers by using the
> +reservation_object in the drm_gem_object. It may also be possible to use the
> +generic drm_gem_reservation_object_wait helper for waiting for a bo.
>  
>  Contact: Daniel Vetter
>  
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index 8b55ece97967..b09acbc5a655 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -170,6 +170,10 @@ void drm_gem_private_object_init(struct drm_device *dev,
>  	kref_init(&obj->refcount);
>  	obj->handle_count = 0;
>  	obj->size = size;
> +	reservation_object_init(&obj->_resv);
> +	if (!obj->resv)
> +		obj->resv = &obj->_resv;
> +
>  	drm_vma_node_reset(&obj->vma_node);
>  }
>  EXPORT_SYMBOL(drm_gem_private_object_init);
> @@ -657,6 +661,44 @@ drm_gem_object_lookup(struct drm_file *filp, u32 handle)
>  }
>  EXPORT_SYMBOL(drm_gem_object_lookup);
>  
> +/**
> + * drm_gem_reservation_object_wait - Wait on GEM object's reservation's objects
> + * shared and/or exclusive fences.
> + * @filep: DRM file private date
> + * @handle: userspace handle
> + * @wait_all: if true, wait on all fences, else wait on just exclusive fence
> + * @timeout: timeout value in jiffies or zero to return immediately
> + *
> + * Returns:
> + *
> + * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or
> + * greater than 0 on success.
> + */
> +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> +				    bool wait_all, unsigned long timeout)
> +{
> +	long ret;
> +	struct drm_gem_object *obj;
> +
> +	obj = drm_gem_object_lookup(filep, handle);
> +	if (!obj) {
> +		DRM_DEBUG("Failed to look up GEM BO %d\n", handle);
> +		return -EINVAL;
> +	}
> +
> +	ret = reservation_object_wait_timeout_rcu(obj->resv, wait_all,
> +						  true, timeout);
> +	if (ret == 0)
> +		ret = -ETIME;
> +	else if (ret > 0)
> +		ret = 0;
> +
> +	drm_gem_object_put_unlocked(obj);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL(drm_gem_reservation_object_wait);
> +
>  /**
>   * drm_gem_close_ioctl - implementation of the GEM_CLOSE ioctl
>   * @dev: drm_device
> @@ -821,6 +863,7 @@ drm_gem_object_release(struct drm_gem_object *obj)
>  	if (obj->filp)
>  		fput(obj->filp);
>  
> +	reservation_object_fini(&obj->_resv);
>  	drm_gem_free_mmap_offset(obj);
>  }
>  EXPORT_SYMBOL(drm_gem_object_release);
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 231e3f6d5f41..dc079efb3b0f 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -504,6 +504,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
>  		.size = obj->size,
>  		.flags = flags,
>  		.priv = obj,
> +		.resv = obj->resv,
>  	};
>  
>  	if (dev->driver->gem_prime_res_obj)
> diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
> index c95727425284..25f1ff2df464 100644
> --- a/include/drm/drm_gem.h
> +++ b/include/drm/drm_gem.h
> @@ -35,6 +35,7 @@
>   */
>  
>  #include <linux/kref.h>
> +#include <linux/reservation.h>
>  
>  #include <drm/drm_vma_manager.h>
>  
> @@ -262,6 +263,24 @@ struct drm_gem_object {
>  	 */
>  	struct dma_buf_attachment *import_attach;
>  
> +	/**
> +	 * @resv:
> +	 *
> +	 * Pointer to reservation object associated with the this GEM object.
> +	 *
> +	 * Normally (@resv == &@_resv) except for imported GEM objects.
> +	 */
> +	struct reservation_object *resv;
> +
> +	/**
> +	 * @_resv:
> +	 *
> +	 * A reservation object for this GEM object.
> +	 *
> +	 * This is unused for imported GEM objects.
> +	 */
> +	struct reservation_object _resv;
> +
>  	/**
>  	 * @funcs:
>  	 *
> @@ -363,6 +382,8 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
>  		bool dirty, bool accessed);
>  
>  struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
> +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> +				    bool wait_all, unsigned long timeout);
>  int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
>  			    u32 handle, u64 *offset);
>  int drm_gem_dumb_destroy(struct drm_file *file,
> -- 
> 2.19.1
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/5] drm: Add reservation_object to drm_gem_object
  2019-02-02 15:41   ` [PATCH v2 1/5] drm: " Rob Herring
  2019-02-04  9:31     ` Daniel Vetter
@ 2019-02-06 22:59     ` Eric Anholt
  2019-02-08  7:23     ` Christian Gmeiner
  2 siblings, 0 replies; 14+ messages in thread
From: Eric Anholt @ 2019-02-06 22:59 UTC (permalink / raw)
  To: Rob Herring, dri-devel
  Cc: Sean Paul, David Airlie, linux-arm-msm, etnaviv, Maxime Ripard,
	Russell King, freedreno


[-- Attachment #1.1: Type: text/plain, Size: 472 bytes --]

Rob Herring <robh@kernel.org> writes:

> Many users of drm_gem_object embed a struct reservation_object into
> their subclassed struct, so let's add one to struct drm_gem_object.
> This will allow removing the reservation object from the subclasses
> and removing the ->gem_prime_res_obj callback.
>
> With the addition, add a drm_gem_reservation_object_wait() helper
> function for drivers to use in wait ioctls.

1, 4, 5 are:

Reviewed-by: Eric Anholt <eric@anholt.net>

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/5] drm: Add reservation_object to drm_gem_object
  2019-02-02 15:41   ` [PATCH v2 1/5] drm: " Rob Herring
  2019-02-04  9:31     ` Daniel Vetter
  2019-02-06 22:59     ` Eric Anholt
@ 2019-02-08  7:23     ` Christian Gmeiner
       [not found]       ` <CAH9NwWfX0w_-mqirpW42HLQ=SqytyGFfg=FBpqcV_m8q4-ucRA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  2 siblings, 1 reply; 14+ messages in thread
From: Christian Gmeiner @ 2019-02-08  7:23 UTC (permalink / raw)
  To: Rob Herring
  Cc: Sean Paul, Maxime Ripard, David Airlie, linux-arm-msm,
	The etnaviv authors, DRI mailing list, Russell King, freedreno

Am Sa., 2. Feb. 2019 um 16:42 Uhr schrieb Rob Herring <robh@kernel.org>:
>
> Many users of drm_gem_object embed a struct reservation_object into
> their subclassed struct, so let's add one to struct drm_gem_object.
> This will allow removing the reservation object from the subclasses
> and removing the ->gem_prime_res_obj callback.
>
> With the addition, add a drm_gem_reservation_object_wait() helper
> function for drivers to use in wait ioctls.
>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <maxime.ripard@bootlin.com>
> Cc: Sean Paul <sean@poorly.run>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Rob Herring <robh@kernel.org>

Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>

> ---
> v2:
>  - Fix missing kerneldoc
>  - Reword todo with what is left todo.
>  - Fix timeout error handling (added to drm_gem_reservation_object_wait)
>
>  Documentation/gpu/todo.rst  |  8 +++----
>  drivers/gpu/drm/drm_gem.c   | 43 +++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/drm_prime.c |  1 +
>  include/drm/drm_gem.h       | 21 ++++++++++++++++++
>  4 files changed, 69 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
> index 14191b64446d..c9ed55605641 100644
> --- a/Documentation/gpu/todo.rst
> +++ b/Documentation/gpu/todo.rst
> @@ -209,12 +209,12 @@ Would be great to refactor this all into a set of small common helpers.
>
>  Contact: Daniel Vetter
>
> -Put a reservation_object into drm_gem_object
> +Remove the ->gem_prime_res_obj callback
>  --------------------------------------------
>
> -This would remove the need for the ->gem_prime_res_obj callback. It would also
> -allow us to implement generic helpers for waiting for a bo, allowing for quite a
> -bit of refactoring in the various wait ioctl implementations.
> +The ->gem_prime_res_obj callback can be removed from drivers by using the
> +reservation_object in the drm_gem_object. It may also be possible to use the
> +generic drm_gem_reservation_object_wait helper for waiting for a bo.
>
>  Contact: Daniel Vetter
>
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index 8b55ece97967..b09acbc5a655 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -170,6 +170,10 @@ void drm_gem_private_object_init(struct drm_device *dev,
>         kref_init(&obj->refcount);
>         obj->handle_count = 0;
>         obj->size = size;
> +       reservation_object_init(&obj->_resv);
> +       if (!obj->resv)
> +               obj->resv = &obj->_resv;
> +
>         drm_vma_node_reset(&obj->vma_node);
>  }
>  EXPORT_SYMBOL(drm_gem_private_object_init);
> @@ -657,6 +661,44 @@ drm_gem_object_lookup(struct drm_file *filp, u32 handle)
>  }
>  EXPORT_SYMBOL(drm_gem_object_lookup);
>
> +/**
> + * drm_gem_reservation_object_wait - Wait on GEM object's reservation's objects
> + * shared and/or exclusive fences.
> + * @filep: DRM file private date
> + * @handle: userspace handle
> + * @wait_all: if true, wait on all fences, else wait on just exclusive fence
> + * @timeout: timeout value in jiffies or zero to return immediately
> + *
> + * Returns:
> + *
> + * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or
> + * greater than 0 on success.
> + */
> +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> +                                   bool wait_all, unsigned long timeout)
> +{
> +       long ret;
> +       struct drm_gem_object *obj;
> +
> +       obj = drm_gem_object_lookup(filep, handle);
> +       if (!obj) {
> +               DRM_DEBUG("Failed to look up GEM BO %d\n", handle);
> +               return -EINVAL;
> +       }
> +
> +       ret = reservation_object_wait_timeout_rcu(obj->resv, wait_all,
> +                                                 true, timeout);
> +       if (ret == 0)
> +               ret = -ETIME;
> +       else if (ret > 0)
> +               ret = 0;
> +
> +       drm_gem_object_put_unlocked(obj);
> +
> +       return ret;
> +}
> +EXPORT_SYMBOL(drm_gem_reservation_object_wait);
> +
>  /**
>   * drm_gem_close_ioctl - implementation of the GEM_CLOSE ioctl
>   * @dev: drm_device
> @@ -821,6 +863,7 @@ drm_gem_object_release(struct drm_gem_object *obj)
>         if (obj->filp)
>                 fput(obj->filp);
>
> +       reservation_object_fini(&obj->_resv);
>         drm_gem_free_mmap_offset(obj);
>  }
>  EXPORT_SYMBOL(drm_gem_object_release);
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 231e3f6d5f41..dc079efb3b0f 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -504,6 +504,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
>                 .size = obj->size,
>                 .flags = flags,
>                 .priv = obj,
> +               .resv = obj->resv,
>         };
>
>         if (dev->driver->gem_prime_res_obj)
> diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
> index c95727425284..25f1ff2df464 100644
> --- a/include/drm/drm_gem.h
> +++ b/include/drm/drm_gem.h
> @@ -35,6 +35,7 @@
>   */
>
>  #include <linux/kref.h>
> +#include <linux/reservation.h>
>
>  #include <drm/drm_vma_manager.h>
>
> @@ -262,6 +263,24 @@ struct drm_gem_object {
>          */
>         struct dma_buf_attachment *import_attach;
>
> +       /**
> +        * @resv:
> +        *
> +        * Pointer to reservation object associated with the this GEM object.
> +        *
> +        * Normally (@resv == &@_resv) except for imported GEM objects.
> +        */
> +       struct reservation_object *resv;
> +
> +       /**
> +        * @_resv:
> +        *
> +        * A reservation object for this GEM object.
> +        *
> +        * This is unused for imported GEM objects.
> +        */
> +       struct reservation_object _resv;
> +
>         /**
>          * @funcs:
>          *
> @@ -363,6 +382,8 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
>                 bool dirty, bool accessed);
>
>  struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
> +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> +                                   bool wait_all, unsigned long timeout);
>  int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
>                             u32 handle, u64 *offset);
>  int drm_gem_dumb_destroy(struct drm_file *file,
> --
> 2.19.1
>


-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/5] drm: Add reservation_object to drm_gem_object
       [not found]       ` <CAH9NwWfX0w_-mqirpW42HLQ=SqytyGFfg=FBpqcV_m8q4-ucRA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2019-02-12 14:16         ` Daniel Vetter
       [not found]           ` <20190212141637.GC23159-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
  0 siblings, 1 reply; 14+ messages in thread
From: Daniel Vetter @ 2019-02-12 14:16 UTC (permalink / raw)
  To: Christian Gmeiner
  Cc: Sean Paul, Rob Herring, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	The etnaviv authors, DRI mailing list, Eric Anholt, Rob Clark,
	Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

On Fri, Feb 08, 2019 at 08:23:44AM +0100, Christian Gmeiner wrote:
> Am Sa., 2. Feb. 2019 um 16:42 Uhr schrieb Rob Herring <robh@kernel.org>:
> >
> > Many users of drm_gem_object embed a struct reservation_object into
> > their subclassed struct, so let's add one to struct drm_gem_object.
> > This will allow removing the reservation object from the subclasses
> > and removing the ->gem_prime_res_obj callback.
> >
> > With the addition, add a drm_gem_reservation_object_wait() helper
> > function for drivers to use in wait ioctls.
> >
> > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > Cc: Maxime Ripard <maxime.ripard@bootlin.com>
> > Cc: Sean Paul <sean@poorly.run>
> > Cc: David Airlie <airlied@linux.ie>
> > Cc: Daniel Vetter <daniel@ffwll.ch>
> > Signed-off-by: Rob Herring <robh@kernel.org>
> 
> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>

Does this extend to 2/5 to update etnaviv?
-Daniel

> 
> > ---
> > v2:
> >  - Fix missing kerneldoc
> >  - Reword todo with what is left todo.
> >  - Fix timeout error handling (added to drm_gem_reservation_object_wait)
> >
> >  Documentation/gpu/todo.rst  |  8 +++----
> >  drivers/gpu/drm/drm_gem.c   | 43 +++++++++++++++++++++++++++++++++++++
> >  drivers/gpu/drm/drm_prime.c |  1 +
> >  include/drm/drm_gem.h       | 21 ++++++++++++++++++
> >  4 files changed, 69 insertions(+), 4 deletions(-)
> >
> > diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
> > index 14191b64446d..c9ed55605641 100644
> > --- a/Documentation/gpu/todo.rst
> > +++ b/Documentation/gpu/todo.rst
> > @@ -209,12 +209,12 @@ Would be great to refactor this all into a set of small common helpers.
> >
> >  Contact: Daniel Vetter
> >
> > -Put a reservation_object into drm_gem_object
> > +Remove the ->gem_prime_res_obj callback
> >  --------------------------------------------
> >
> > -This would remove the need for the ->gem_prime_res_obj callback. It would also
> > -allow us to implement generic helpers for waiting for a bo, allowing for quite a
> > -bit of refactoring in the various wait ioctl implementations.
> > +The ->gem_prime_res_obj callback can be removed from drivers by using the
> > +reservation_object in the drm_gem_object. It may also be possible to use the
> > +generic drm_gem_reservation_object_wait helper for waiting for a bo.
> >
> >  Contact: Daniel Vetter
> >
> > diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> > index 8b55ece97967..b09acbc5a655 100644
> > --- a/drivers/gpu/drm/drm_gem.c
> > +++ b/drivers/gpu/drm/drm_gem.c
> > @@ -170,6 +170,10 @@ void drm_gem_private_object_init(struct drm_device *dev,
> >         kref_init(&obj->refcount);
> >         obj->handle_count = 0;
> >         obj->size = size;
> > +       reservation_object_init(&obj->_resv);
> > +       if (!obj->resv)
> > +               obj->resv = &obj->_resv;
> > +
> >         drm_vma_node_reset(&obj->vma_node);
> >  }
> >  EXPORT_SYMBOL(drm_gem_private_object_init);
> > @@ -657,6 +661,44 @@ drm_gem_object_lookup(struct drm_file *filp, u32 handle)
> >  }
> >  EXPORT_SYMBOL(drm_gem_object_lookup);
> >
> > +/**
> > + * drm_gem_reservation_object_wait - Wait on GEM object's reservation's objects
> > + * shared and/or exclusive fences.
> > + * @filep: DRM file private date
> > + * @handle: userspace handle
> > + * @wait_all: if true, wait on all fences, else wait on just exclusive fence
> > + * @timeout: timeout value in jiffies or zero to return immediately
> > + *
> > + * Returns:
> > + *
> > + * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or
> > + * greater than 0 on success.
> > + */
> > +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> > +                                   bool wait_all, unsigned long timeout)
> > +{
> > +       long ret;
> > +       struct drm_gem_object *obj;
> > +
> > +       obj = drm_gem_object_lookup(filep, handle);
> > +       if (!obj) {
> > +               DRM_DEBUG("Failed to look up GEM BO %d\n", handle);
> > +               return -EINVAL;
> > +       }
> > +
> > +       ret = reservation_object_wait_timeout_rcu(obj->resv, wait_all,
> > +                                                 true, timeout);
> > +       if (ret == 0)
> > +               ret = -ETIME;
> > +       else if (ret > 0)
> > +               ret = 0;
> > +
> > +       drm_gem_object_put_unlocked(obj);
> > +
> > +       return ret;
> > +}
> > +EXPORT_SYMBOL(drm_gem_reservation_object_wait);
> > +
> >  /**
> >   * drm_gem_close_ioctl - implementation of the GEM_CLOSE ioctl
> >   * @dev: drm_device
> > @@ -821,6 +863,7 @@ drm_gem_object_release(struct drm_gem_object *obj)
> >         if (obj->filp)
> >                 fput(obj->filp);
> >
> > +       reservation_object_fini(&obj->_resv);
> >         drm_gem_free_mmap_offset(obj);
> >  }
> >  EXPORT_SYMBOL(drm_gem_object_release);
> > diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> > index 231e3f6d5f41..dc079efb3b0f 100644
> > --- a/drivers/gpu/drm/drm_prime.c
> > +++ b/drivers/gpu/drm/drm_prime.c
> > @@ -504,6 +504,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
> >                 .size = obj->size,
> >                 .flags = flags,
> >                 .priv = obj,
> > +               .resv = obj->resv,
> >         };
> >
> >         if (dev->driver->gem_prime_res_obj)
> > diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
> > index c95727425284..25f1ff2df464 100644
> > --- a/include/drm/drm_gem.h
> > +++ b/include/drm/drm_gem.h
> > @@ -35,6 +35,7 @@
> >   */
> >
> >  #include <linux/kref.h>
> > +#include <linux/reservation.h>
> >
> >  #include <drm/drm_vma_manager.h>
> >
> > @@ -262,6 +263,24 @@ struct drm_gem_object {
> >          */
> >         struct dma_buf_attachment *import_attach;
> >
> > +       /**
> > +        * @resv:
> > +        *
> > +        * Pointer to reservation object associated with the this GEM object.
> > +        *
> > +        * Normally (@resv == &@_resv) except for imported GEM objects.
> > +        */
> > +       struct reservation_object *resv;
> > +
> > +       /**
> > +        * @_resv:
> > +        *
> > +        * A reservation object for this GEM object.
> > +        *
> > +        * This is unused for imported GEM objects.
> > +        */
> > +       struct reservation_object _resv;
> > +
> >         /**
> >          * @funcs:
> >          *
> > @@ -363,6 +382,8 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
> >                 bool dirty, bool accessed);
> >
> >  struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
> > +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> > +                                   bool wait_all, unsigned long timeout);
> >  int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
> >                             u32 handle, u64 *offset);
> >  int drm_gem_dumb_destroy(struct drm_file *file,
> > --
> > 2.19.1
> >
> 
> 
> -- 
> greets
> --
> Christian Gmeiner, MSc
> 
> https://christian-gmeiner.info

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 0/5] Add reservation_object to drm_gem_object
       [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
                     ` (4 preceding siblings ...)
  2019-02-02 15:41   ` [PATCH v2 5/5] drm: vc4: " Rob Herring
@ 2019-02-12 14:22   ` Daniel Vetter
  5 siblings, 0 replies; 14+ messages in thread
From: Daniel Vetter @ 2019-02-12 14:22 UTC (permalink / raw)
  To: Rob Herring
  Cc: Sean Paul, Rob Clark, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	etnaviv-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Lucas Stach

On Sat, Feb 02, 2019 at 09:41:53AM -0600, Rob Herring wrote:
> This series implements the todo to add reservation_object to 
> drm_gem_object. I converted the easy drivers, but not Intel or AMD. The 
> series is build tested only.
> 
> Rob
> 
> v2:
>  - Fix missing kerneldoc
>  - Reword todo with what is left todo.
>  - Fix timeout error handling (added to drm_gem_reservation_object_wait)

I like. On the series:

Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>

for msm just ping Sean Paul on irc, he's usually quick with taking a lock.
And I'd merge the entire series through drm-misc, least amount of trouble.
-Daniel

> 
> Rob Herring (5):
>   drm: Add reservation_object to drm_gem_object
>   drm: etnaviv: Switch to use drm_gem_object reservation_object
>   drm: msm: Switch to use drm_gem_object reservation_object
>   drm: v3d: Switch to use drm_gem_object reservation_object
>   drm: vc4: Switch to use drm_gem_object reservation_object
> 
>  Documentation/gpu/todo.rst                   |  8 ++--
>  drivers/gpu/drm/drm_gem.c                    | 43 ++++++++++++++++++++
>  drivers/gpu/drm/drm_prime.c                  |  1 +
>  drivers/gpu/drm/etnaviv/etnaviv_drv.c        |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_drv.h        |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_gem.c        | 16 +++-----
>  drivers/gpu/drm/etnaviv/etnaviv_gem.h        |  4 --
>  drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c  |  7 ----
>  drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 22 +++++-----
>  drivers/gpu/drm/msm/msm_drv.c                |  1 -
>  drivers/gpu/drm/msm/msm_drv.h                |  1 -
>  drivers/gpu/drm/msm/msm_gem.c                | 27 ++++--------
>  drivers/gpu/drm/msm/msm_gem_prime.c          |  7 ----
>  drivers/gpu/drm/msm/msm_gem_submit.c         |  8 ++--
>  drivers/gpu/drm/v3d/v3d_bo.c                 | 14 +------
>  drivers/gpu/drm/v3d/v3d_drv.c                |  1 -
>  drivers/gpu/drm/v3d/v3d_drv.h                |  6 ---
>  drivers/gpu/drm/v3d/v3d_gem.c                | 35 ++++------------
>  drivers/gpu/drm/vc4/vc4_bo.c                 | 15 +------
>  drivers/gpu/drm/vc4/vc4_drv.c                |  1 -
>  drivers/gpu/drm/vc4/vc4_drv.h                |  6 ---
>  drivers/gpu/drm/vc4/vc4_gem.c                | 18 ++++----
>  drivers/gpu/drm/vc4/vc4_plane.c              |  2 +-
>  include/drm/drm_gem.h                        | 21 ++++++++++
>  24 files changed, 119 insertions(+), 147 deletions(-)
> 
> -- 
> 2.19.1
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 2/5] drm: etnaviv: Switch to use drm_gem_object reservation_object
  2019-02-02 15:41   ` [PATCH v2 2/5] drm: etnaviv: Switch to use drm_gem_object reservation_object Rob Herring
@ 2019-02-12 18:33     ` Christian Gmeiner via dri-devel
  0 siblings, 0 replies; 14+ messages in thread
From: Christian Gmeiner via dri-devel @ 2019-02-12 18:33 UTC (permalink / raw)
  To: Rob Herring
  Cc: Sean Paul, Maxime Ripard, David Airlie, linux-arm-msm,
	The etnaviv authors, DRI mailing list, Russell King, freedreno

Am Sa., 2. Feb. 2019 um 16:42 Uhr schrieb Rob Herring <robh@kernel.org>:
>
> Now that the base struct drm_gem_object has a reservation_object, use it
> and remove the private BO one.
>
> Cc: Lucas Stach <l.stach@pengutronix.de>
> Cc: Russell King <linux+etnaviv@armlinux.org.uk>
> Cc: Christian Gmeiner <christian.gmeiner@gmail.com>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: etnaviv@lists.freedesktop.org
> Signed-off-by: Rob Herring <robh@kernel.org>

Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_drv.c        |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_drv.h        |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_gem.c        | 16 +++++---------
>  drivers/gpu/drm/etnaviv/etnaviv_gem.h        |  4 ----
>  drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c  |  7 -------
>  drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 22 ++++++++++----------
>  6 files changed, 16 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
> index 18c27f795cf6..9f42f7538236 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
> @@ -473,7 +473,6 @@ static struct drm_driver etnaviv_drm_driver = {
>         .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
>         .gem_prime_export   = drm_gem_prime_export,
>         .gem_prime_import   = drm_gem_prime_import,
> -       .gem_prime_res_obj  = etnaviv_gem_prime_res_obj,
>         .gem_prime_pin      = etnaviv_gem_prime_pin,
>         .gem_prime_unpin    = etnaviv_gem_prime_unpin,
>         .gem_prime_get_sg_table = etnaviv_gem_prime_get_sg_table,
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> index 4bf698de5996..351db0c5822d 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> @@ -61,7 +61,6 @@ void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj);
>  void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
>  int etnaviv_gem_prime_mmap(struct drm_gem_object *obj,
>                            struct vm_area_struct *vma);
> -struct reservation_object *etnaviv_gem_prime_res_obj(struct drm_gem_object *obj);
>  struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
>         struct dma_buf_attachment *attach, struct sg_table *sg);
>  int etnaviv_gem_prime_pin(struct drm_gem_object *obj);
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> index 1fa74226db91..3e954adcb2cc 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
> @@ -397,13 +397,13 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
>         }
>
>         if (op & ETNA_PREP_NOSYNC) {
> -               if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
> +               if (!reservation_object_test_signaled_rcu(obj->resv,
>                                                           write))
>                         return -EBUSY;
>         } else {
>                 unsigned long remain = etnaviv_timeout_to_jiffies(timeout);
>
> -               ret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv,
> +               ret = reservation_object_wait_timeout_rcu(obj->resv,
>                                                           write, true, remain);
>                 if (ret <= 0)
>                         return ret == 0 ? -ETIMEDOUT : ret;
> @@ -459,7 +459,7 @@ static void etnaviv_gem_describe_fence(struct dma_fence *fence,
>  static void etnaviv_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
>  {
>         struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
> -       struct reservation_object *robj = etnaviv_obj->resv;
> +       struct reservation_object *robj = obj->resv;
>         struct reservation_object_list *fobj;
>         struct dma_fence *fence;
>         unsigned long off = drm_vma_node_start(&obj->vma_node);
> @@ -549,8 +549,6 @@ void etnaviv_gem_free_object(struct drm_gem_object *obj)
>
>         drm_gem_free_mmap_offset(obj);
>         etnaviv_obj->ops->release(etnaviv_obj);
> -       if (etnaviv_obj->resv == &etnaviv_obj->_resv)
> -               reservation_object_fini(&etnaviv_obj->_resv);
>         drm_gem_object_release(obj);
>
>         kfree(etnaviv_obj);
> @@ -596,12 +594,8 @@ static int etnaviv_gem_new_impl(struct drm_device *dev, u32 size, u32 flags,
>
>         etnaviv_obj->flags = flags;
>         etnaviv_obj->ops = ops;
> -       if (robj) {
> -               etnaviv_obj->resv = robj;
> -       } else {
> -               etnaviv_obj->resv = &etnaviv_obj->_resv;
> -               reservation_object_init(&etnaviv_obj->_resv);
> -       }
> +       if (robj)
> +               etnaviv_obj->base.resv = robj;
>
>         mutex_init(&etnaviv_obj->lock);
>         INIT_LIST_HEAD(&etnaviv_obj->vram_list);
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> index 76079c2291f8..7015837ccc1c 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> @@ -47,10 +47,6 @@ struct etnaviv_gem_object {
>         struct sg_table *sgt;
>         void *vaddr;
>
> -       /* normally (resv == &_resv) except for imported bo's */
> -       struct reservation_object *resv;
> -       struct reservation_object _resv;
> -
>         struct list_head vram_list;
>
>         /* cache maintenance */
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> index 0566171f8df2..01e7ad96339c 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> @@ -139,10 +139,3 @@ struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
>
>         return ERR_PTR(ret);
>  }
> -
> -struct reservation_object *etnaviv_gem_prime_res_obj(struct drm_gem_object *obj)
> -{
> -       struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
> -
> -       return etnaviv_obj->resv;
> -}
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> index 30875f8f2933..a10281e915e5 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> @@ -108,9 +108,9 @@ static int submit_lookup_objects(struct etnaviv_gem_submit *submit,
>  static void submit_unlock_object(struct etnaviv_gem_submit *submit, int i)
>  {
>         if (submit->bos[i].flags & BO_LOCKED) {
> -               struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
> +               struct drm_gem_object *obj = &submit->bos[i].obj->base;
>
> -               ww_mutex_unlock(&etnaviv_obj->resv->lock);
> +               ww_mutex_unlock(&obj->resv->lock);
>                 submit->bos[i].flags &= ~BO_LOCKED;
>         }
>  }
> @@ -122,7 +122,7 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit,
>
>  retry:
>         for (i = 0; i < submit->nr_bos; i++) {
> -               struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
> +               struct drm_gem_object *obj = &submit->bos[i].obj->base;
>
>                 if (slow_locked == i)
>                         slow_locked = -1;
> @@ -130,7 +130,7 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit,
>                 contended = i;
>
>                 if (!(submit->bos[i].flags & BO_LOCKED)) {
> -                       ret = ww_mutex_lock_interruptible(&etnaviv_obj->resv->lock,
> +                       ret = ww_mutex_lock_interruptible(&obj->resv->lock,
>                                                           ticket);
>                         if (ret == -EALREADY)
>                                 DRM_ERROR("BO at index %u already on submit list\n",
> @@ -153,12 +153,12 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit,
>                 submit_unlock_object(submit, slow_locked);
>
>         if (ret == -EDEADLK) {
> -               struct etnaviv_gem_object *etnaviv_obj;
> +               struct drm_gem_object *obj;
>
> -               etnaviv_obj = submit->bos[contended].obj;
> +               obj = &submit->bos[contended].obj->base;
>
>                 /* we lost out in a seqno race, lock and retry.. */
> -               ret = ww_mutex_lock_slow_interruptible(&etnaviv_obj->resv->lock,
> +               ret = ww_mutex_lock_slow_interruptible(&obj->resv->lock,
>                                                        ticket);
>                 if (!ret) {
>                         submit->bos[contended].flags |= BO_LOCKED;
> @@ -176,7 +176,7 @@ static int submit_fence_sync(struct etnaviv_gem_submit *submit)
>
>         for (i = 0; i < submit->nr_bos; i++) {
>                 struct etnaviv_gem_submit_bo *bo = &submit->bos[i];
> -               struct reservation_object *robj = bo->obj->resv;
> +               struct reservation_object *robj = bo->obj->base.resv;
>
>                 if (!(bo->flags & ETNA_SUBMIT_BO_WRITE)) {
>                         ret = reservation_object_reserve_shared(robj, 1);
> @@ -207,13 +207,13 @@ static void submit_attach_object_fences(struct etnaviv_gem_submit *submit)
>         int i;
>
>         for (i = 0; i < submit->nr_bos; i++) {
> -               struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj;
> +               struct drm_gem_object *obj = &submit->bos[i].obj->base;
>
>                 if (submit->bos[i].flags & ETNA_SUBMIT_BO_WRITE)
> -                       reservation_object_add_excl_fence(etnaviv_obj->resv,
> +                       reservation_object_add_excl_fence(obj->resv,
>                                                           submit->out_fence);
>                 else
> -                       reservation_object_add_shared_fence(etnaviv_obj->resv,
> +                       reservation_object_add_shared_fence(obj->resv,
>                                                             submit->out_fence);
>
>                 submit_unlock_object(submit, i);
> --
> 2.19.1
>


-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/5] drm: Add reservation_object to drm_gem_object
       [not found]           ` <20190212141637.GC23159-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
@ 2019-02-12 18:35             ` Christian Gmeiner
  0 siblings, 0 replies; 14+ messages in thread
From: Christian Gmeiner @ 2019-02-12 18:35 UTC (permalink / raw)
  To: Daniel Vetter
  Cc: Sean Paul, Rob Herring, Maxime Ripard, David Airlie,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, Maarten Lankhorst,
	The etnaviv authors, DRI mailing list, Eric Anholt, Rob Clark,
	Russell King, freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	Lucas Stach

Am Di., 12. Feb. 2019 um 15:16 Uhr schrieb Daniel Vetter <daniel@ffwll.ch>:
>
> On Fri, Feb 08, 2019 at 08:23:44AM +0100, Christian Gmeiner wrote:
> > Am Sa., 2. Feb. 2019 um 16:42 Uhr schrieb Rob Herring <robh@kernel.org>:
> > >
> > > Many users of drm_gem_object embed a struct reservation_object into
> > > their subclassed struct, so let's add one to struct drm_gem_object.
> > > This will allow removing the reservation object from the subclasses
> > > and removing the ->gem_prime_res_obj callback.
> > >
> > > With the addition, add a drm_gem_reservation_object_wait() helper
> > > function for drivers to use in wait ioctls.
> > >
> > > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > > Cc: Maxime Ripard <maxime.ripard@bootlin.com>
> > > Cc: Sean Paul <sean@poorly.run>
> > > Cc: David Airlie <airlied@linux.ie>
> > > Cc: Daniel Vetter <daniel@ffwll.ch>
> > > Signed-off-by: Rob Herring <robh@kernel.org>
> >
> > Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
>
> Does this extend to 2/5 to update etnaviv?

oopps... yes it does - see my reply to 2/5.

> -Daniel
>
> >
> > > ---
> > > v2:
> > >  - Fix missing kerneldoc
> > >  - Reword todo with what is left todo.
> > >  - Fix timeout error handling (added to drm_gem_reservation_object_wait)
> > >
> > >  Documentation/gpu/todo.rst  |  8 +++----
> > >  drivers/gpu/drm/drm_gem.c   | 43 +++++++++++++++++++++++++++++++++++++
> > >  drivers/gpu/drm/drm_prime.c |  1 +
> > >  include/drm/drm_gem.h       | 21 ++++++++++++++++++
> > >  4 files changed, 69 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
> > > index 14191b64446d..c9ed55605641 100644
> > > --- a/Documentation/gpu/todo.rst
> > > +++ b/Documentation/gpu/todo.rst
> > > @@ -209,12 +209,12 @@ Would be great to refactor this all into a set of small common helpers.
> > >
> > >  Contact: Daniel Vetter
> > >
> > > -Put a reservation_object into drm_gem_object
> > > +Remove the ->gem_prime_res_obj callback
> > >  --------------------------------------------
> > >
> > > -This would remove the need for the ->gem_prime_res_obj callback. It would also
> > > -allow us to implement generic helpers for waiting for a bo, allowing for quite a
> > > -bit of refactoring in the various wait ioctl implementations.
> > > +The ->gem_prime_res_obj callback can be removed from drivers by using the
> > > +reservation_object in the drm_gem_object. It may also be possible to use the
> > > +generic drm_gem_reservation_object_wait helper for waiting for a bo.
> > >
> > >  Contact: Daniel Vetter
> > >
> > > diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> > > index 8b55ece97967..b09acbc5a655 100644
> > > --- a/drivers/gpu/drm/drm_gem.c
> > > +++ b/drivers/gpu/drm/drm_gem.c
> > > @@ -170,6 +170,10 @@ void drm_gem_private_object_init(struct drm_device *dev,
> > >         kref_init(&obj->refcount);
> > >         obj->handle_count = 0;
> > >         obj->size = size;
> > > +       reservation_object_init(&obj->_resv);
> > > +       if (!obj->resv)
> > > +               obj->resv = &obj->_resv;
> > > +
> > >         drm_vma_node_reset(&obj->vma_node);
> > >  }
> > >  EXPORT_SYMBOL(drm_gem_private_object_init);
> > > @@ -657,6 +661,44 @@ drm_gem_object_lookup(struct drm_file *filp, u32 handle)
> > >  }
> > >  EXPORT_SYMBOL(drm_gem_object_lookup);
> > >
> > > +/**
> > > + * drm_gem_reservation_object_wait - Wait on GEM object's reservation's objects
> > > + * shared and/or exclusive fences.
> > > + * @filep: DRM file private date
> > > + * @handle: userspace handle
> > > + * @wait_all: if true, wait on all fences, else wait on just exclusive fence
> > > + * @timeout: timeout value in jiffies or zero to return immediately
> > > + *
> > > + * Returns:
> > > + *
> > > + * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or
> > > + * greater than 0 on success.
> > > + */
> > > +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> > > +                                   bool wait_all, unsigned long timeout)
> > > +{
> > > +       long ret;
> > > +       struct drm_gem_object *obj;
> > > +
> > > +       obj = drm_gem_object_lookup(filep, handle);
> > > +       if (!obj) {
> > > +               DRM_DEBUG("Failed to look up GEM BO %d\n", handle);
> > > +               return -EINVAL;
> > > +       }
> > > +
> > > +       ret = reservation_object_wait_timeout_rcu(obj->resv, wait_all,
> > > +                                                 true, timeout);
> > > +       if (ret == 0)
> > > +               ret = -ETIME;
> > > +       else if (ret > 0)
> > > +               ret = 0;
> > > +
> > > +       drm_gem_object_put_unlocked(obj);
> > > +
> > > +       return ret;
> > > +}
> > > +EXPORT_SYMBOL(drm_gem_reservation_object_wait);
> > > +
> > >  /**
> > >   * drm_gem_close_ioctl - implementation of the GEM_CLOSE ioctl
> > >   * @dev: drm_device
> > > @@ -821,6 +863,7 @@ drm_gem_object_release(struct drm_gem_object *obj)
> > >         if (obj->filp)
> > >                 fput(obj->filp);
> > >
> > > +       reservation_object_fini(&obj->_resv);
> > >         drm_gem_free_mmap_offset(obj);
> > >  }
> > >  EXPORT_SYMBOL(drm_gem_object_release);
> > > diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> > > index 231e3f6d5f41..dc079efb3b0f 100644
> > > --- a/drivers/gpu/drm/drm_prime.c
> > > +++ b/drivers/gpu/drm/drm_prime.c
> > > @@ -504,6 +504,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
> > >                 .size = obj->size,
> > >                 .flags = flags,
> > >                 .priv = obj,
> > > +               .resv = obj->resv,
> > >         };
> > >
> > >         if (dev->driver->gem_prime_res_obj)
> > > diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
> > > index c95727425284..25f1ff2df464 100644
> > > --- a/include/drm/drm_gem.h
> > > +++ b/include/drm/drm_gem.h
> > > @@ -35,6 +35,7 @@
> > >   */
> > >
> > >  #include <linux/kref.h>
> > > +#include <linux/reservation.h>
> > >
> > >  #include <drm/drm_vma_manager.h>
> > >
> > > @@ -262,6 +263,24 @@ struct drm_gem_object {
> > >          */
> > >         struct dma_buf_attachment *import_attach;
> > >
> > > +       /**
> > > +        * @resv:
> > > +        *
> > > +        * Pointer to reservation object associated with the this GEM object.
> > > +        *
> > > +        * Normally (@resv == &@_resv) except for imported GEM objects.
> > > +        */
> > > +       struct reservation_object *resv;
> > > +
> > > +       /**
> > > +        * @_resv:
> > > +        *
> > > +        * A reservation object for this GEM object.
> > > +        *
> > > +        * This is unused for imported GEM objects.
> > > +        */
> > > +       struct reservation_object _resv;
> > > +
> > >         /**
> > >          * @funcs:
> > >          *
> > > @@ -363,6 +382,8 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
> > >                 bool dirty, bool accessed);
> > >
> > >  struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
> > > +long drm_gem_reservation_object_wait(struct drm_file *filep, u32 handle,
> > > +                                   bool wait_all, unsigned long timeout);
> > >  int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
> > >                             u32 handle, u64 *offset);
> > >  int drm_gem_dumb_destroy(struct drm_file *file,
> > > --
> > > 2.19.1
> > >
> >
> >
> > --
> > greets
> > --
> > Christian Gmeiner, MSc
> >
> > https://christian-gmeiner.info
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch



-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 3/5] drm: msm: Switch to use drm_gem_object reservation_object
       [not found]     ` <20190202154158.10443-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2019-02-13 14:31       ` Rob Clark
  0 siblings, 0 replies; 14+ messages in thread
From: Rob Clark @ 2019-02-13 14:31 UTC (permalink / raw)
  To: Rob Herring
  Cc: Sean Paul, Maxime Ripard, David Airlie, linux-arm-msm,
	Maarten Lankhorst, The etnaviv authors, dri-devel, Eric Anholt,
	Christian Gmeiner, Daniel Vetter, Russell King, freedreno,
	Lucas Stach

On Sat, Feb 2, 2019 at 10:42 AM Rob Herring <robh@kernel.org> wrote:
>
> Now that the base struct drm_gem_object has a reservation_object, use it
> and remove the private BO one.
>
> We can't use the drm_gem_reservation_object_wait() helper for MSM
> because (in theory) msm_gem_cpu_prep() will also do some cache
> maintenance on the GEM object.
>
> Cc: Rob Clark <robdclark@gmail.com>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: linux-arm-msm@vger.kernel.org
> Cc: dri-devel@lists.freedesktop.org
> Cc: freedreno@lists.freedesktop.org
> Signed-off-by: Rob Herring <robh@kernel.org>

Acked-by: Rob Clark <robdclark@gmail.com>

> ---
>  drivers/gpu/drm/msm/msm_drv.c        |  1 -
>  drivers/gpu/drm/msm/msm_drv.h        |  1 -
>  drivers/gpu/drm/msm/msm_gem.c        | 27 +++++++++------------------
>  drivers/gpu/drm/msm/msm_gem_prime.c  |  7 -------
>  drivers/gpu/drm/msm/msm_gem_submit.c |  8 ++++----
>  5 files changed, 13 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
> index d2cdc7b553fe..522ddbd72250 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -1086,7 +1086,6 @@ static struct drm_driver msm_driver = {
>         .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
>         .gem_prime_export   = drm_gem_prime_export,
>         .gem_prime_import   = drm_gem_prime_import,
> -       .gem_prime_res_obj  = msm_gem_prime_res_obj,
>         .gem_prime_pin      = msm_gem_prime_pin,
>         .gem_prime_unpin    = msm_gem_prime_unpin,
>         .gem_prime_get_sg_table = msm_gem_prime_get_sg_table,
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 927e5d86f7c1..068f9172ad70 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -300,7 +300,6 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj);
>  void *msm_gem_prime_vmap(struct drm_gem_object *obj);
>  void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
>  int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
> -struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj);
>  struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
>                 struct dma_buf_attachment *attach, struct sg_table *sg);
>  int msm_gem_prime_pin(struct drm_gem_object *obj);
> diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
> index c8886d3071fa..d3973cc26522 100644
> --- a/drivers/gpu/drm/msm/msm_gem.c
> +++ b/drivers/gpu/drm/msm/msm_gem.c
> @@ -672,14 +672,13 @@ void msm_gem_vunmap(struct drm_gem_object *obj, enum msm_gem_lock subclass)
>  int msm_gem_sync_object(struct drm_gem_object *obj,
>                 struct msm_fence_context *fctx, bool exclusive)
>  {
> -       struct msm_gem_object *msm_obj = to_msm_bo(obj);
>         struct reservation_object_list *fobj;
>         struct dma_fence *fence;
>         int i, ret;
>
> -       fobj = reservation_object_get_list(msm_obj->resv);
> +       fobj = reservation_object_get_list(obj->resv);
>         if (!fobj || (fobj->shared_count == 0)) {
> -               fence = reservation_object_get_excl(msm_obj->resv);
> +               fence = reservation_object_get_excl(obj->resv);
>                 /* don't need to wait on our own fences, since ring is fifo */
>                 if (fence && (fence->context != fctx->context)) {
>                         ret = dma_fence_wait(fence, true);
> @@ -693,7 +692,7 @@ int msm_gem_sync_object(struct drm_gem_object *obj,
>
>         for (i = 0; i < fobj->shared_count; i++) {
>                 fence = rcu_dereference_protected(fobj->shared[i],
> -                                               reservation_object_held(msm_obj->resv));
> +                                               reservation_object_held(obj->resv));
>                 if (fence->context != fctx->context) {
>                         ret = dma_fence_wait(fence, true);
>                         if (ret)
> @@ -711,9 +710,9 @@ void msm_gem_move_to_active(struct drm_gem_object *obj,
>         WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
>         msm_obj->gpu = gpu;
>         if (exclusive)
> -               reservation_object_add_excl_fence(msm_obj->resv, fence);
> +               reservation_object_add_excl_fence(obj->resv, fence);
>         else
> -               reservation_object_add_shared_fence(msm_obj->resv, fence);
> +               reservation_object_add_shared_fence(obj->resv, fence);
>         list_del_init(&msm_obj->mm_list);
>         list_add_tail(&msm_obj->mm_list, &gpu->active_list);
>  }
> @@ -733,13 +732,12 @@ void msm_gem_move_to_inactive(struct drm_gem_object *obj)
>
>  int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
>  {
> -       struct msm_gem_object *msm_obj = to_msm_bo(obj);
>         bool write = !!(op & MSM_PREP_WRITE);
>         unsigned long remain =
>                 op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout);
>         long ret;
>
> -       ret = reservation_object_wait_timeout_rcu(msm_obj->resv, write,
> +       ret = reservation_object_wait_timeout_rcu(obj->resv, write,
>                                                   true,  remain);
>         if (ret == 0)
>                 return remain == 0 ? -EBUSY : -ETIMEDOUT;
> @@ -771,7 +769,7 @@ static void describe_fence(struct dma_fence *fence, const char *type,
>  void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
>  {
>         struct msm_gem_object *msm_obj = to_msm_bo(obj);
> -       struct reservation_object *robj = msm_obj->resv;
> +       struct reservation_object *robj = obj->resv;
>         struct reservation_object_list *fobj;
>         struct dma_fence *fence;
>         struct msm_gem_vma *vma;
> @@ -883,9 +881,6 @@ void msm_gem_free_object(struct drm_gem_object *obj)
>                 put_pages(obj);
>         }
>
> -       if (msm_obj->resv == &msm_obj->_resv)
> -               reservation_object_fini(msm_obj->resv);
> -
>         drm_gem_object_release(obj);
>
>         mutex_unlock(&msm_obj->lock);
> @@ -945,12 +940,8 @@ static int msm_gem_new_impl(struct drm_device *dev,
>         msm_obj->flags = flags;
>         msm_obj->madv = MSM_MADV_WILLNEED;
>
> -       if (resv) {
> -               msm_obj->resv = resv;
> -       } else {
> -               msm_obj->resv = &msm_obj->_resv;
> -               reservation_object_init(msm_obj->resv);
> -       }
> +       if (resv)
> +               msm_obj->base.resv = resv;
>
>         INIT_LIST_HEAD(&msm_obj->submit_entry);
>         INIT_LIST_HEAD(&msm_obj->vmas);
> diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c
> index 13403c6da6c7..60bb290700ce 100644
> --- a/drivers/gpu/drm/msm/msm_gem_prime.c
> +++ b/drivers/gpu/drm/msm/msm_gem_prime.c
> @@ -70,10 +70,3 @@ void msm_gem_prime_unpin(struct drm_gem_object *obj)
>         if (!obj->import_attach)
>                 msm_gem_put_pages(obj);
>  }
> -
> -struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj)
> -{
> -       struct msm_gem_object *msm_obj = to_msm_bo(obj);
> -
> -       return msm_obj->resv;
> -}
> diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
> index 12b983fc0b56..df302521ec74 100644
> --- a/drivers/gpu/drm/msm/msm_gem_submit.c
> +++ b/drivers/gpu/drm/msm/msm_gem_submit.c
> @@ -173,7 +173,7 @@ static void submit_unlock_unpin_bo(struct msm_gem_submit *submit,
>                 msm_gem_unpin_iova(&msm_obj->base, submit->gpu->aspace);
>
>         if (submit->bos[i].flags & BO_LOCKED)
> -               ww_mutex_unlock(&msm_obj->resv->lock);
> +               ww_mutex_unlock(&msm_obj->base.resv->lock);
>
>         if (backoff && !(submit->bos[i].flags & BO_VALID))
>                 submit->bos[i].iova = 0;
> @@ -196,7 +196,7 @@ static int submit_lock_objects(struct msm_gem_submit *submit)
>                 contended = i;
>
>                 if (!(submit->bos[i].flags & BO_LOCKED)) {
> -                       ret = ww_mutex_lock_interruptible(&msm_obj->resv->lock,
> +                       ret = ww_mutex_lock_interruptible(&msm_obj->base.resv->lock,
>                                         &submit->ticket);
>                         if (ret)
>                                 goto fail;
> @@ -218,7 +218,7 @@ static int submit_lock_objects(struct msm_gem_submit *submit)
>         if (ret == -EDEADLK) {
>                 struct msm_gem_object *msm_obj = submit->bos[contended].obj;
>                 /* we lost out in a seqno race, lock and retry.. */
> -               ret = ww_mutex_lock_slow_interruptible(&msm_obj->resv->lock,
> +               ret = ww_mutex_lock_slow_interruptible(&msm_obj->base.resv->lock,
>                                 &submit->ticket);
>                 if (!ret) {
>                         submit->bos[contended].flags |= BO_LOCKED;
> @@ -244,7 +244,7 @@ static int submit_fence_sync(struct msm_gem_submit *submit, bool no_implicit)
>                          * strange place to call it.  OTOH this is a
>                          * convenient can-fail point to hook it in.
>                          */
> -                       ret = reservation_object_reserve_shared(msm_obj->resv,
> +                       ret = reservation_object_reserve_shared(msm_obj->base.resv,
>                                                                 1);
>                         if (ret)
>                                 return ret;
> --
> 2.19.1
>
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-02-13 14:31 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-02 15:41 [PATCH v2 0/5] Add reservation_object to drm_gem_object Rob Herring
     [not found] ` <20190202154158.10443-1-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2019-02-02 15:41   ` [PATCH v2 1/5] drm: " Rob Herring
2019-02-04  9:31     ` Daniel Vetter
2019-02-06 22:59     ` Eric Anholt
2019-02-08  7:23     ` Christian Gmeiner
     [not found]       ` <CAH9NwWfX0w_-mqirpW42HLQ=SqytyGFfg=FBpqcV_m8q4-ucRA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-02-12 14:16         ` Daniel Vetter
     [not found]           ` <20190212141637.GC23159-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2019-02-12 18:35             ` Christian Gmeiner
2019-02-02 15:41   ` [PATCH v2 2/5] drm: etnaviv: Switch to use drm_gem_object reservation_object Rob Herring
2019-02-12 18:33     ` Christian Gmeiner via dri-devel
2019-02-02 15:41   ` [PATCH v2 3/5] drm: msm: " Rob Herring
     [not found]     ` <20190202154158.10443-4-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2019-02-13 14:31       ` Rob Clark
2019-02-02 15:41   ` [PATCH v2 4/5] drm: v3d: " Rob Herring
2019-02-02 15:41   ` [PATCH v2 5/5] drm: vc4: " Rob Herring
2019-02-12 14:22   ` [PATCH v2 0/5] Add reservation_object to drm_gem_object Daniel Vetter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).