All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/10] drm fence fixes and cross-dev sync.
@ 2014-09-17 12:34 Maarten Lankhorst
  2014-09-17 12:34 ` [PATCH 1/8] drm/nouveau: bump driver patchlevel to 1.2.1 Maarten Lankhorst
                   ` (7 more replies)
  0 siblings, 8 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:34 UTC (permalink / raw)
  To: dri-devel

This has a nouveau fix for suspend (no interruptible wait during suspend) and
bumps patchlevel to abi 1.2.1 for telling shared fences are in use.

Maarten Lankhorst (8):
  drm/nouveau: bump driver patchlevel to 1.2.1
  drm/nouveau: specify if interruptible wait is desired in
    nouveau_fence_sync
  drm: Pass dma-buf as argument to gem_prime_import_sg_table
  drm/ttm: add reservation_object as argument to ttm_bo_init
  drm/radeon: cope with foreign fences inside display
  drm/radeon: cope with foreign fences inside the reservation object
  drm/radeon: export reservation_object from dmabuf to ttm
  drm/nouveau: export reservation_object from dmabuf to ttm

 drivers/gpu/drm/ast/ast_ttm.c             |  2 +-
 drivers/gpu/drm/bochs/bochs_mm.c          |  2 +-
 drivers/gpu/drm/cirrus/cirrus_ttm.c       |  2 +-
 drivers/gpu/drm/drm_gem_cma_helper.c      |  5 +++--
 drivers/gpu/drm/drm_prime.c               |  2 +-
 drivers/gpu/drm/mgag200/mgag200_ttm.c     |  2 +-
 drivers/gpu/drm/msm/msm_drv.h             |  2 +-
 drivers/gpu/drm/msm/msm_gem_prime.c       |  4 ++--
 drivers/gpu/drm/nouveau/dispnv04/crtc.c   |  2 +-
 drivers/gpu/drm/nouveau/nouveau_bo.c      |  6 +++---
 drivers/gpu/drm/nouveau/nouveau_bo.h      |  1 +
 drivers/gpu/drm/nouveau/nouveau_chan.c    |  2 +-
 drivers/gpu/drm/nouveau/nouveau_display.c |  4 ++--
 drivers/gpu/drm/nouveau/nouveau_drm.h     |  4 +++-
 drivers/gpu/drm/nouveau/nouveau_fence.c   | 20 +++++++++++---------
 drivers/gpu/drm/nouveau/nouveau_fence.h   |  2 +-
 drivers/gpu/drm/nouveau/nouveau_gem.c     |  4 ++--
 drivers/gpu/drm/nouveau/nouveau_gem.h     |  2 +-
 drivers/gpu/drm/nouveau/nouveau_prime.c   | 10 +++++++---
 drivers/gpu/drm/nouveau/nv17_fence.c      |  2 +-
 drivers/gpu/drm/nouveau/nv50_display.c    |  6 +++---
 drivers/gpu/drm/nouveau/nv50_fence.c      |  2 +-
 drivers/gpu/drm/nouveau/nv84_fence.c      |  4 ++--
 drivers/gpu/drm/qxl/qxl_drv.h             |  2 +-
 drivers/gpu/drm/qxl/qxl_object.c          |  2 +-
 drivers/gpu/drm/qxl/qxl_prime.c           |  2 +-
 drivers/gpu/drm/radeon/cik.c              |  6 +++---
 drivers/gpu/drm/radeon/cik_sdma.c         |  2 +-
 drivers/gpu/drm/radeon/evergreen.c        |  6 +++---
 drivers/gpu/drm/radeon/evergreen_dma.c    |  2 +-
 drivers/gpu/drm/radeon/r600.c             |  6 +++---
 drivers/gpu/drm/radeon/r600_dma.c         |  2 +-
 drivers/gpu/drm/radeon/radeon.h           |  9 +++++----
 drivers/gpu/drm/radeon/radeon_benchmark.c |  4 ++--
 drivers/gpu/drm/radeon/radeon_cs.c        | 27 ++++++++++++++++++++-------
 drivers/gpu/drm/radeon/radeon_device.c    |  2 +-
 drivers/gpu/drm/radeon/radeon_display.c   | 30 +++++++++++++++++++-----------
 drivers/gpu/drm/radeon/radeon_drv.c       |  2 +-
 drivers/gpu/drm/radeon/radeon_fence.c     |  3 +++
 drivers/gpu/drm/radeon/radeon_gart.c      |  2 +-
 drivers/gpu/drm/radeon/radeon_gem.c       |  2 +-
 drivers/gpu/drm/radeon/radeon_object.c    |  8 +++++---
 drivers/gpu/drm/radeon/radeon_object.h    |  1 +
 drivers/gpu/drm/radeon/radeon_prime.c     | 10 +++++++---
 drivers/gpu/drm/radeon/radeon_ring.c      |  2 +-
 drivers/gpu/drm/radeon/radeon_sa.c        |  2 +-
 drivers/gpu/drm/radeon/radeon_semaphore.c | 24 ++++++++++++++++++------
 drivers/gpu/drm/radeon/radeon_test.c      |  5 +++--
 drivers/gpu/drm/radeon/radeon_ttm.c       |  2 +-
 drivers/gpu/drm/radeon/radeon_uvd.c       |  3 ++-
 drivers/gpu/drm/radeon/radeon_vce.c       |  3 ++-
 drivers/gpu/drm/radeon/radeon_vm.c        |  9 +++++----
 drivers/gpu/drm/radeon/rv770_dma.c        |  2 +-
 drivers/gpu/drm/radeon/si_dma.c           |  2 +-
 drivers/gpu/drm/ttm/ttm_bo.c              | 24 ++++++++++++++++++------
 drivers/gpu/drm/vmwgfx/vmwgfx_resource.c  |  2 +-
 include/drm/drmP.h                        |  3 ++-
 include/drm/drm_gem_cma_helper.h          |  3 ++-
 include/drm/ttm/ttm_bo_api.h              |  2 ++
 59 files changed, 192 insertions(+), 118 deletions(-)

-- 
2.0.4

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

* [PATCH 1/8] drm/nouveau: bump driver patchlevel to 1.2.1
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
@ 2014-09-17 12:34 ` Maarten Lankhorst
  2014-09-17 12:34 ` [PATCH 2/8] drm/nouveau: specify if interruptible wait is desired in nouveau_fence_sync Maarten Lankhorst
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:34 UTC (permalink / raw)
  To: dri-devel

Allows userspace to detect shared fences are supported.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/nouveau/nouveau_drm.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.h b/drivers/gpu/drm/nouveau/nouveau_drm.h
index b02b02452c85..8ae36f265fb8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.h
@@ -10,7 +10,7 @@
 
 #define DRIVER_MAJOR		1
 #define DRIVER_MINOR		2
-#define DRIVER_PATCHLEVEL	0
+#define DRIVER_PATCHLEVEL	1
 
 /*
  * 1.1.1:
@@ -26,6 +26,8 @@
  * 1.2.0:
  * 	- object api exposed to userspace
  * 	- fermi,kepler,maxwell zbc
+ * 1.2.1:
+ *      - allow concurrent access to bo's mapped read/write.
  */
 
 #include <nvif/client.h>
-- 
2.0.4

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

* [PATCH 2/8] drm/nouveau: specify if interruptible wait is desired in nouveau_fence_sync
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
  2014-09-17 12:34 ` [PATCH 1/8] drm/nouveau: bump driver patchlevel to 1.2.1 Maarten Lankhorst
@ 2014-09-17 12:34 ` Maarten Lankhorst
  2014-09-17 12:35 ` [PATCH 3/8] drm: Pass dma-buf as argument to gem_prime_import_sg_table Maarten Lankhorst
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:34 UTC (permalink / raw)
  To: dri-devel

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/nouveau/nouveau_bo.c      |  2 +-
 drivers/gpu/drm/nouveau/nouveau_display.c |  4 ++--
 drivers/gpu/drm/nouveau/nouveau_fence.c   | 14 ++++++--------
 drivers/gpu/drm/nouveau/nouveau_fence.h   |  2 +-
 drivers/gpu/drm/nouveau/nouveau_gem.c     |  2 +-
 5 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index eea74b127b03..049f5de90928 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -970,7 +970,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
 	}
 
 	mutex_lock_nested(&cli->mutex, SINGLE_DEPTH_NESTING);
-	ret = nouveau_fence_sync(nouveau_bo(bo), chan, true);
+	ret = nouveau_fence_sync(nouveau_bo(bo), chan, true, intr);
 	if (ret == 0) {
 		ret = drm->ttm.move(chan, bo, &bo->mem, new_mem);
 		if (ret == 0) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index 6d0a3cdc752b..334db3c6e40c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -658,7 +658,7 @@ nouveau_page_flip_emit(struct nouveau_channel *chan,
 	spin_unlock_irqrestore(&dev->event_lock, flags);
 
 	/* Synchronize with the old framebuffer */
-	ret = nouveau_fence_sync(old_bo, chan, false);
+	ret = nouveau_fence_sync(old_bo, chan, false, false);
 	if (ret)
 		goto fail;
 
@@ -722,7 +722,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
 		goto fail_unpin;
 
 	/* synchronise rendering channel with the kernel's channel */
-	ret = nouveau_fence_sync(new_bo, chan, false);
+	ret = nouveau_fence_sync(new_bo, chan, false, true);
 	if (ret) {
 		ttm_bo_unreserve(&new_bo->bo);
 		goto fail_unpin;
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index decfe6c4ac07..dfd0b9ed4195 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -226,12 +226,10 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)
 
 	if (priv->uevent)
 		fence_init(&fence->base, &nouveau_fence_ops_uevent,
-			   &fctx->lock,
-			   priv->context_base + chan->chid, ++fctx->sequence);
+			   &fctx->lock, fctx->context, ++fctx->sequence);
 	else
 		fence_init(&fence->base, &nouveau_fence_ops_legacy,
-			   &fctx->lock,
-			   priv->context_base + chan->chid, ++fctx->sequence);
+			   &fctx->lock, fctx->context, ++fctx->sequence);
 
 	trace_fence_emit(&fence->base);
 	ret = fctx->emit(fence);
@@ -342,7 +340,7 @@ nouveau_fence_wait(struct nouveau_fence *fence, bool lazy, bool intr)
 }
 
 int
-nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool exclusive)
+nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool exclusive, bool intr)
 {
 	struct nouveau_fence_chan *fctx = chan->fence;
 	struct fence *fence;
@@ -369,7 +367,7 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
 			prev = f->channel;
 
 		if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan))))
-			ret = fence_wait(fence, true);
+			ret = fence_wait(fence, intr);
 
 		return ret;
 	}
@@ -387,8 +385,8 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
 		if (f)
 			prev = f->channel;
 
-		if (!prev || (ret = fctx->sync(f, prev, chan)))
-			ret = fence_wait(fence, true);
+		if (!prev || (prev != chan && (ret = fctx->sync(f, prev, chan))))
+			ret = fence_wait(fence, intr);
 
 		if (ret)
 			break;
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.h b/drivers/gpu/drm/nouveau/nouveau_fence.h
index 986c8135e564..a7dc5375c320 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.h
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.h
@@ -26,7 +26,7 @@ int  nouveau_fence_emit(struct nouveau_fence *, struct nouveau_channel *);
 bool nouveau_fence_done(struct nouveau_fence *);
 void nouveau_fence_work(struct fence *, void (*)(void *), void *);
 int  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
-int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive);
+int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr);
 
 struct nouveau_fence_chan {
 	spinlock_t lock;
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index b7dbd16904e0..3f693c1f5b36 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -459,7 +459,7 @@ validate_list(struct nouveau_channel *chan, struct nouveau_cli *cli,
 			return ret;
 		}
 
-		ret = nouveau_fence_sync(nvbo, chan, !!b->write_domains);
+		ret = nouveau_fence_sync(nvbo, chan, !!b->write_domains, true);
 		if (unlikely(ret)) {
 			if (ret != -ERESTARTSYS)
 				NV_PRINTK(error, cli, "fail post-validate sync\n");
-- 
2.0.4

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

* [PATCH 3/8] drm: Pass dma-buf as argument to gem_prime_import_sg_table
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
  2014-09-17 12:34 ` [PATCH 1/8] drm/nouveau: bump driver patchlevel to 1.2.1 Maarten Lankhorst
  2014-09-17 12:34 ` [PATCH 2/8] drm/nouveau: specify if interruptible wait is desired in nouveau_fence_sync Maarten Lankhorst
@ 2014-09-17 12:35 ` Maarten Lankhorst
  2014-09-17 12:35 ` [PATCH 4/8] drm/ttm: add reservation_object as argument to ttm_bo_init Maarten Lankhorst
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:35 UTC (permalink / raw)
  To: dri-devel

Allows importing dma_reservation_objects from a dma-buf.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/drm_gem_cma_helper.c    | 5 +++--
 drivers/gpu/drm/drm_prime.c             | 2 +-
 drivers/gpu/drm/msm/msm_drv.h           | 2 +-
 drivers/gpu/drm/msm/msm_gem_prime.c     | 4 ++--
 drivers/gpu/drm/nouveau/nouveau_gem.h   | 2 +-
 drivers/gpu/drm/nouveau/nouveau_prime.c | 5 +++--
 drivers/gpu/drm/qxl/qxl_drv.h           | 2 +-
 drivers/gpu/drm/qxl/qxl_prime.c         | 2 +-
 drivers/gpu/drm/radeon/radeon_drv.c     | 2 +-
 drivers/gpu/drm/radeon/radeon_prime.c   | 5 +++--
 include/drm/drmP.h                      | 3 ++-
 include/drm/drm_gem_cma_helper.h        | 3 ++-
 12 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c
index e467e67af6e7..08646af2ddc2 100644
--- a/drivers/gpu/drm/drm_gem_cma_helper.c
+++ b/drivers/gpu/drm/drm_gem_cma_helper.c
@@ -316,7 +316,8 @@ out:
 EXPORT_SYMBOL_GPL(drm_gem_cma_prime_get_sg_table);
 
 struct drm_gem_object *
-drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,
+drm_gem_cma_prime_import_sg_table(struct drm_device *dev,
+				  struct dma_buf_attachment *attach,
 				  struct sg_table *sgt)
 {
 	struct drm_gem_cma_object *cma_obj;
@@ -325,7 +326,7 @@ drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,
 		return ERR_PTR(-EINVAL);
 
 	/* Create a CMA GEM buffer. */
-	cma_obj = __drm_gem_cma_create(dev, size);
+	cma_obj = __drm_gem_cma_create(dev, attach->dmabuf->size);
 	if (IS_ERR(cma_obj))
 		return ERR_CAST(cma_obj);
 
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 2807a771f505..8952dc779959 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -523,7 +523,7 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
 		goto fail_detach;
 	}
 
-	obj = dev->driver->gem_prime_import_sg_table(dev, dma_buf->size, sgt);
+	obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt);
 	if (IS_ERR(obj)) {
 		ret = PTR_ERR(obj);
 		goto fail_unmap;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 8a2c5fd0893e..a0dc2592ffc1 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -170,7 +170,7 @@ 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);
 struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
-		size_t size, struct sg_table *sg);
+		struct dma_buf_attachment *attach, struct sg_table *sg);
 int msm_gem_prime_pin(struct drm_gem_object *obj);
 void msm_gem_prime_unpin(struct drm_gem_object *obj);
 void *msm_gem_vaddr_locked(struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c
index d48f9fc5129b..b75f9940ee9e 100644
--- a/drivers/gpu/drm/msm/msm_gem_prime.c
+++ b/drivers/gpu/drm/msm/msm_gem_prime.c
@@ -37,9 +37,9 @@ void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 }
 
 struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
-		size_t size, struct sg_table *sg)
+		struct dma_buf_attachment *attach, struct sg_table *sg)
 {
-	return msm_gem_import(dev, size, sg);
+	return msm_gem_import(dev, attach->dmabuf->size, sg);
 }
 
 int msm_gem_prime_pin(struct drm_gem_object *obj)
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.h b/drivers/gpu/drm/nouveau/nouveau_gem.h
index ddab762d81fe..e4049faca780 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.h
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.h
@@ -39,7 +39,7 @@ struct reservation_object *nouveau_gem_prime_res_obj(struct drm_gem_object *);
 extern void nouveau_gem_prime_unpin(struct drm_gem_object *);
 extern struct sg_table *nouveau_gem_prime_get_sg_table(struct drm_gem_object *);
 extern struct drm_gem_object *nouveau_gem_prime_import_sg_table(
-	struct drm_device *, size_t size, struct sg_table *);
+	struct drm_device *, struct dma_buf_attachment *, struct sg_table *);
 extern void *nouveau_gem_prime_vmap(struct drm_gem_object *);
 extern void nouveau_gem_prime_vunmap(struct drm_gem_object *, void *);
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c
index 1f51008e4d26..2215cdba587d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_prime.c
+++ b/drivers/gpu/drm/nouveau/nouveau_prime.c
@@ -23,6 +23,7 @@
  */
 
 #include <drm/drmP.h>
+#include <linux/dma-buf.h>
 
 #include "nouveau_drm.h"
 #include "nouveau_gem.h"
@@ -56,7 +57,7 @@ void nouveau_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 }
 
 struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,
-							 size_t size,
+							 struct dma_buf_attachment *attach,
 							 struct sg_table *sg)
 {
 	struct nouveau_bo *nvbo;
@@ -65,7 +66,7 @@ struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,
 
 	flags = TTM_PL_FLAG_TT;
 
-	ret = nouveau_bo_new(dev, size, 0, flags, 0, 0,
+	ret = nouveau_bo_new(dev, attach->dmabuf->size, 0, flags, 0, 0,
 			     sg, &nvbo);
 	if (ret)
 		return ERR_PTR(ret);
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index d75c0a9f674f..0eb97500dd5f 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -535,7 +535,7 @@ int qxl_gem_prime_pin(struct drm_gem_object *obj);
 void qxl_gem_prime_unpin(struct drm_gem_object *obj);
 struct sg_table *qxl_gem_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *qxl_gem_prime_import_sg_table(
-	struct drm_device *dev, size_t size,
+	struct drm_device *dev, struct dma_buf_attachment *attach,
 	struct sg_table *sgt);
 void *qxl_gem_prime_vmap(struct drm_gem_object *obj);
 void qxl_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
diff --git a/drivers/gpu/drm/qxl/qxl_prime.c b/drivers/gpu/drm/qxl/qxl_prime.c
index ba0689c728e8..3d031b50a8fd 100644
--- a/drivers/gpu/drm/qxl/qxl_prime.c
+++ b/drivers/gpu/drm/qxl/qxl_prime.c
@@ -46,7 +46,7 @@ struct sg_table *qxl_gem_prime_get_sg_table(struct drm_gem_object *obj)
 }
 
 struct drm_gem_object *qxl_gem_prime_import_sg_table(
-	struct drm_device *dev, size_t size,
+	struct drm_device *dev, struct dma_buf_attachment *attach,
 	struct sg_table *table)
 {
 	WARN_ONCE(1, "not implemented");
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index ec7e963d9bf7..064212543573 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -133,7 +133,7 @@ int radeon_mode_dumb_create(struct drm_file *file_priv,
 			    struct drm_mode_create_dumb *args);
 struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
-							size_t size,
+							struct dma_buf_attachment *,
 							struct sg_table *sg);
 int radeon_gem_prime_pin(struct drm_gem_object *obj);
 void radeon_gem_prime_unpin(struct drm_gem_object *obj);
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
index d5414d42e44b..171daf7fc483 100644
--- a/drivers/gpu/drm/radeon/radeon_prime.c
+++ b/drivers/gpu/drm/radeon/radeon_prime.c
@@ -27,6 +27,7 @@
 
 #include "radeon.h"
 #include <drm/radeon_drm.h>
+#include <linux/dma-buf.h>
 
 struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj)
 {
@@ -57,14 +58,14 @@ void radeon_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 }
 
 struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
-							size_t size,
+							struct dma_buf_attachment *attach,
 							struct sg_table *sg)
 {
 	struct radeon_device *rdev = dev->dev_private;
 	struct radeon_bo *bo;
 	int ret;
 
-	ret = radeon_bo_create(rdev, size, PAGE_SIZE, false,
+	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
 			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
 	if (ret)
 		return ERR_PTR(ret);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 5c60d384b37b..9971e63b5a74 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -656,7 +656,8 @@ struct drm_driver {
 				struct drm_gem_object *obj);
 	struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj);
 	struct drm_gem_object *(*gem_prime_import_sg_table)(
-				struct drm_device *dev, size_t size,
+				struct drm_device *dev,
+				struct dma_buf_attachment *attach,
 				struct sg_table *sgt);
 	void *(*gem_prime_vmap)(struct drm_gem_object *obj);
 	void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h
index 2a3cea91606d..5096807c1af0 100644
--- a/include/drm/drm_gem_cma_helper.h
+++ b/include/drm/drm_gem_cma_helper.h
@@ -44,7 +44,8 @@ void drm_gem_cma_describe(struct drm_gem_cma_object *obj, struct seq_file *m);
 
 struct sg_table *drm_gem_cma_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *
-drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,
+drm_gem_cma_prime_import_sg_table(struct drm_device *dev,
+				  struct dma_buf_attachment *attach,
 				  struct sg_table *sgt);
 int drm_gem_cma_prime_mmap(struct drm_gem_object *obj,
 			   struct vm_area_struct *vma);
-- 
2.0.4

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

* [PATCH 4/8] drm/ttm: add reservation_object as argument to ttm_bo_init
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
                   ` (2 preceding siblings ...)
  2014-09-17 12:35 ` [PATCH 3/8] drm: Pass dma-buf as argument to gem_prime_import_sg_table Maarten Lankhorst
@ 2014-09-17 12:35 ` Maarten Lankhorst
  2014-09-17 12:35 ` [PATCH 5/8] drm/radeon: cope with foreign fences inside display Maarten Lankhorst
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:35 UTC (permalink / raw)
  To: dri-devel

This allows importing reservation objects from dma-bufs.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/ast/ast_ttm.c            |  2 +-
 drivers/gpu/drm/bochs/bochs_mm.c         |  2 +-
 drivers/gpu/drm/cirrus/cirrus_ttm.c      |  2 +-
 drivers/gpu/drm/mgag200/mgag200_ttm.c    |  2 +-
 drivers/gpu/drm/nouveau/nouveau_bo.c     |  2 +-
 drivers/gpu/drm/qxl/qxl_object.c         |  2 +-
 drivers/gpu/drm/radeon/radeon_object.c   |  2 +-
 drivers/gpu/drm/ttm/ttm_bo.c             | 24 ++++++++++++++++++------
 drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |  2 +-
 include/drm/ttm/ttm_bo_api.h             |  2 ++
 10 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index 5098c7dd435c..a4c13040e32d 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -339,7 +339,7 @@ int ast_bo_create(struct drm_device *dev, int size, int align,
 	ret = ttm_bo_init(&ast->ttm.bdev, &astbo->bo, size,
 			  ttm_bo_type_device, &astbo->placement,
 			  align >> PAGE_SHIFT, false, NULL, acc_size,
-			  NULL, ast_bo_ttm_destroy);
+			  NULL, NULL, ast_bo_ttm_destroy);
 	if (ret)
 		return ret;
 
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index 2af30e7607d7..6c50a7a44864 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -377,7 +377,7 @@ static int bochs_bo_create(struct drm_device *dev, int size, int align,
 	ret = ttm_bo_init(&bochs->ttm.bdev, &bochsbo->bo, size,
 			  ttm_bo_type_device, &bochsbo->placement,
 			  align >> PAGE_SHIFT, false, NULL, acc_size,
-			  NULL, bochs_bo_ttm_destroy);
+			  NULL, NULL, bochs_bo_ttm_destroy);
 	if (ret)
 		return ret;
 
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 3e7d758330a9..b3b3d16d1279 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -343,7 +343,7 @@ int cirrus_bo_create(struct drm_device *dev, int size, int align,
 	ret = ttm_bo_init(&cirrus->ttm.bdev, &cirrusbo->bo, size,
 			  ttm_bo_type_device, &cirrusbo->placement,
 			  align >> PAGE_SHIFT, false, NULL, acc_size,
-			  NULL, cirrus_bo_ttm_destroy);
+			  NULL, NULL, cirrus_bo_ttm_destroy);
 	if (ret)
 		return ret;
 
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index be883ef5a1d3..398b6fb161a6 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -339,7 +339,7 @@ int mgag200_bo_create(struct drm_device *dev, int size, int align,
 	ret = ttm_bo_init(&mdev->ttm.bdev, &mgabo->bo, size,
 			  ttm_bo_type_device, &mgabo->placement,
 			  align >> PAGE_SHIFT, false, NULL, acc_size,
-			  NULL, mgag200_bo_ttm_destroy);
+			  NULL, NULL, mgag200_bo_ttm_destroy);
 	if (ret)
 		return ret;
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 049f5de90928..7034cacaa4a1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -230,7 +230,7 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
 	ret = ttm_bo_init(&drm->ttm.bdev, &nvbo->bo, size,
 			  type, &nvbo->placement,
 			  align >> PAGE_SHIFT, false, NULL, acc_size, sg,
-			  nouveau_bo_del_ttm);
+			  NULL, nouveau_bo_del_ttm);
 	if (ret) {
 		/* ttm will call nouveau_bo_del_ttm if it fails.. */
 		return ret;
diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
index 69c104c3240f..cdeaf08fdc74 100644
--- a/drivers/gpu/drm/qxl/qxl_object.c
+++ b/drivers/gpu/drm/qxl/qxl_object.c
@@ -110,7 +110,7 @@ int qxl_bo_create(struct qxl_device *qdev,
 
 	r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type,
 			&bo->placement, 0, !kernel, NULL, size,
-			NULL, &qxl_ttm_bo_destroy);
+			NULL, NULL, &qxl_ttm_bo_destroy);
 	if (unlikely(r != 0)) {
 		if (r != -ERESTARTSYS)
 			dev_err(qdev->dev,
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 8abee5fa93bd..0e82f0223fd4 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -216,7 +216,7 @@ int radeon_bo_create(struct radeon_device *rdev,
 	down_read(&rdev->pm.mclk_lock);
 	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
 			&bo->placement, page_align, !kernel, NULL,
-			acc_size, sg, &radeon_ttm_bo_destroy);
+			acc_size, sg, NULL, &radeon_ttm_bo_destroy);
 	up_read(&rdev->pm.mclk_lock);
 	if (unlikely(r != 0)) {
 		return r;
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index a11969acfea5..8f5cec67c47d 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1068,6 +1068,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
 		struct file *persistent_swap_storage,
 		size_t acc_size,
 		struct sg_table *sg,
+		struct reservation_object *resv,
 		void (*destroy) (struct ttm_buffer_object *))
 {
 	int ret = 0;
@@ -1121,8 +1122,13 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
 	bo->persistent_swap_storage = persistent_swap_storage;
 	bo->acc_size = acc_size;
 	bo->sg = sg;
-	bo->resv = &bo->ttm_resv;
-	reservation_object_init(bo->resv);
+	if (resv) {
+		bo->resv = resv;
+		lockdep_assert_held(&bo->resv->lock.base);
+	} else {
+		bo->resv = &bo->ttm_resv;
+		reservation_object_init(&bo->ttm_resv);
+	}
 	atomic_inc(&bo->glob->bo_count);
 	drm_vma_node_reset(&bo->vma_node);
 
@@ -1135,13 +1141,19 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
 		ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node,
 					 bo->mem.num_pages);
 
-	locked = ww_mutex_trylock(&bo->resv->lock);
-	WARN_ON(!locked);
+	/* passed reservation objects should already be locked,
+	 * since otherwise lockdep will be angered in radeon.
+	 */
+	if (!resv) {
+		locked = ww_mutex_trylock(&bo->resv->lock);
+		WARN_ON(!locked);
+	}
 
 	if (likely(!ret))
 		ret = ttm_bo_validate(bo, placement, interruptible, false);
 
-	ttm_bo_unreserve(bo);
+	if (!resv)
+		ttm_bo_unreserve(bo);
 
 	if (unlikely(ret))
 		ttm_bo_unref(&bo);
@@ -1199,7 +1211,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
 	acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct ttm_buffer_object));
 	ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
 			  interruptible, persistent_swap_storage, acc_size,
-			  NULL, NULL);
+			  NULL, NULL, NULL);
 	if (likely(ret == 0))
 		*p_bo = bo;
 
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index 26584316cb78..026de7cea0f6 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -430,7 +430,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,
 	ret = ttm_bo_init(bdev, &vmw_bo->base, size,
 			  ttm_bo_type_device, placement,
 			  0, interruptible,
-			  NULL, acc_size, NULL, bo_free);
+			  NULL, acc_size, NULL, NULL, bo_free);
 	return ret;
 }
 
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 70b44917c368..0ccf7f267ff9 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -460,6 +460,7 @@ size_t ttm_bo_dma_acc_size(struct ttm_bo_device *bdev,
  * point to the shmem object backing a GEM object if TTM is used to back a
  * GEM user interface.
  * @acc_size: Accounted size for this object.
+ * @resv: Pointer to a reservation_object, or NULL to let ttm allocate one.
  * @destroy: Destroy function. Use NULL for kfree().
  *
  * This function initializes a pre-allocated struct ttm_buffer_object.
@@ -487,6 +488,7 @@ extern int ttm_bo_init(struct ttm_bo_device *bdev,
 			struct file *persistent_swap_storage,
 			size_t acc_size,
 			struct sg_table *sg,
+			struct reservation_object *resv,
 			void (*destroy) (struct ttm_buffer_object *));
 
 /**
-- 
2.0.4

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

* [PATCH 5/8] drm/radeon: cope with foreign fences inside display
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
                   ` (3 preceding siblings ...)
  2014-09-17 12:35 ` [PATCH 4/8] drm/ttm: add reservation_object as argument to ttm_bo_init Maarten Lankhorst
@ 2014-09-17 12:35 ` Maarten Lankhorst
  2014-09-17 13:16   ` Christian König
  2014-09-17 12:35 ` [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object Maarten Lankhorst
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:35 UTC (permalink / raw)
  To: dri-devel

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/radeon/radeon.h         |  2 +-
 drivers/gpu/drm/radeon/radeon_display.c | 30 +++++++++++++++++++-----------
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 82b0e11ade89..9aa75c1af4f4 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -710,7 +710,7 @@ struct radeon_flip_work {
 	uint64_t			base;
 	struct drm_pending_vblank_event *event;
 	struct radeon_bo		*old_rbo;
-	struct radeon_fence		*fence;
+	struct fence			*fence;
 };
 
 struct r500_irq_stat_regs {
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 4eb37976f879..00ead8c2758a 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -402,14 +402,21 @@ static void radeon_flip_work_func(struct work_struct *__work)
 
         down_read(&rdev->exclusive_lock);
 	if (work->fence) {
-		r = radeon_fence_wait(work->fence, false);
-		if (r == -EDEADLK) {
-			up_read(&rdev->exclusive_lock);
-			do {
-				r = radeon_gpu_reset(rdev);
-			} while (r == -EAGAIN);
-			down_read(&rdev->exclusive_lock);
-		}
+		struct radeon_fence *fence;
+
+		fence = to_radeon_fence(work->fence);
+		if (fence && fence->rdev == rdev) {
+			r = radeon_fence_wait(fence, false);
+			if (r == -EDEADLK) {
+				up_read(&rdev->exclusive_lock);
+				do {
+					r = radeon_gpu_reset(rdev);
+				} while (r == -EAGAIN);
+				down_read(&rdev->exclusive_lock);
+			}
+		} else
+			r = fence_wait(work->fence, false);
+
 		if (r)
 			DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
 
@@ -418,7 +425,8 @@ static void radeon_flip_work_func(struct work_struct *__work)
 		 * confused about which BO the CRTC is scanning out
 		 */
 
-		radeon_fence_unref(&work->fence);
+		fence_put(work->fence);
+		work->fence = NULL;
 	}
 
 	/* We borrow the event spin lock for protecting flip_status */
@@ -494,7 +502,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
 		DRM_ERROR("failed to pin new rbo buffer before flip\n");
 		goto cleanup;
 	}
-	work->fence = (struct radeon_fence *)fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
+	work->fence = fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
 	radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL);
 	radeon_bo_unreserve(new_rbo);
 
@@ -576,7 +584,7 @@ pflip_cleanup:
 
 cleanup:
 	drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
-	radeon_fence_unref(&work->fence);
+	fence_put(work->fence);
 	kfree(work);
 	return r;
 }
-- 
2.0.4

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

* [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
                   ` (4 preceding siblings ...)
  2014-09-17 12:35 ` [PATCH 5/8] drm/radeon: cope with foreign fences inside display Maarten Lankhorst
@ 2014-09-17 12:35 ` Maarten Lankhorst
  2014-09-17 13:09   ` Christian König
  2014-09-18  3:26   ` [PATCH " Michel Dänzer
  2014-09-17 12:35 ` [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm Maarten Lankhorst
  2014-09-17 12:35 ` [PATCH 8/8] drm/nouveau: " Maarten Lankhorst
  7 siblings, 2 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:35 UTC (permalink / raw)
  To: dri-devel

Not the whole world is a radeon! :-)

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/radeon/cik.c              |  2 +-
 drivers/gpu/drm/radeon/cik_sdma.c         |  2 +-
 drivers/gpu/drm/radeon/evergreen_dma.c    |  2 +-
 drivers/gpu/drm/radeon/r600.c             |  2 +-
 drivers/gpu/drm/radeon/r600_dma.c         |  2 +-
 drivers/gpu/drm/radeon/radeon.h           |  7 ++++---
 drivers/gpu/drm/radeon/radeon_cs.c        | 27 ++++++++++++++++++++-------
 drivers/gpu/drm/radeon/radeon_fence.c     |  3 +++
 drivers/gpu/drm/radeon/radeon_semaphore.c | 24 ++++++++++++++++++------
 drivers/gpu/drm/radeon/radeon_vm.c        |  4 ++--
 drivers/gpu/drm/radeon/rv770_dma.c        |  2 +-
 drivers/gpu/drm/radeon/si_dma.c           |  2 +-
 12 files changed, 54 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 0d761f73a7fa..1440b6e9281e 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index c01a6100c318..315c595418ec 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
index 946f37d0b469..5a5686792068 100644
--- a/drivers/gpu/drm/radeon/evergreen_dma.c
+++ b/drivers/gpu/drm/radeon/evergreen_dma.c
@@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 25f367ac4637..35c22ee9bc4a 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
index fc54224ce87b..674af8db7a35 100644
--- a/drivers/gpu/drm/radeon/r600_dma.c
+++ b/drivers/gpu/drm/radeon/r600_dma.c
@@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 9aa75c1af4f4..6cdc5e62fe12 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -587,9 +587,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
 				struct radeon_semaphore *semaphore);
 void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
 				 struct radeon_fence *fence);
-void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore,
-				struct reservation_object *resv,
-				bool shared);
+int radeon_semaphore_sync_resv(struct radeon_device *rdev,
+			       struct radeon_semaphore *semaphore,
+			       struct reservation_object *resv,
+			       bool shared, bool intr);
 int radeon_semaphore_sync_rings(struct radeon_device *rdev,
 				struct radeon_semaphore *semaphore,
 				int waiting_ring);
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index f662de41ba49..a4a608c8b1ba 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -249,20 +249,21 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
 	return 0;
 }
 
-static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
+static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
 {
-	int i;
+	int i, r = 0;
 
-	for (i = 0; i < p->nrelocs; i++) {
+	for (i = 0; !r && i < p->nrelocs; i++) {
 		struct reservation_object *resv;
 
 		if (!p->relocs[i].robj)
 			continue;
 
 		resv = p->relocs[i].robj->tbo.resv;
-		radeon_semaphore_sync_resv(p->ib.semaphore, resv,
-					   p->relocs[i].tv.shared);
+		r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
+					       p->relocs[i].tv.shared, true);
 	}
+	return r;
 }
 
 /* XXX: note that this is called from the legacy UMS CS ioctl as well */
@@ -472,13 +473,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
 		return r;
 	}
 
+	r = radeon_cs_sync_rings(parser);
+	if (r) {
+		if (r != -ERESTARTSYS)
+			DRM_ERROR("Failed to sync rings: %i\n", r);
+		return r;
+	}
+
 	if (parser->ring == R600_RING_TYPE_UVD_INDEX)
 		radeon_uvd_note_usage(rdev);
 	else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||
 		 (parser->ring == TN_RING_TYPE_VCE2_INDEX))
 		radeon_vce_note_usage(rdev);
 
-	radeon_cs_sync_rings(parser);
 	r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
 	if (r) {
 		DRM_ERROR("Failed to schedule IB !\n");
@@ -565,7 +572,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
 	if (r) {
 		goto out;
 	}
-	radeon_cs_sync_rings(parser);
+
+	r = radeon_cs_sync_rings(parser);
+	if (r) {
+		if (r != -ERESTARTSYS)
+			DRM_ERROR("Failed to sync rings: %i\n", r);
+		goto out;
+	}
 	radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);
 
 	if ((rdev->family >= CHIP_TAHITI) &&
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index af9f2d6bd7d0..0262fe2580d2 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -541,6 +541,9 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
 	uint64_t seq[RADEON_NUM_RINGS] = {};
 	long r;
 
+	if (unlikely(!to_radeon_fence(&fence->base)))
+		return fence_wait(&fence->base, intr);
+
 	seq[fence->ring] = fence->seq;
 	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
 	if (r < 0) {
diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
index 4d4b0773638a..68311da39c09 100644
--- a/drivers/gpu/drm/radeon/radeon_semaphore.c
+++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
@@ -124,27 +124,39 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
  *
  * Sync to the fence using this semaphore object
  */
-void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
-				struct reservation_object *resv,
-				bool shared)
+int radeon_semaphore_sync_resv(struct radeon_device *rdev,
+			       struct radeon_semaphore *sema,
+			       struct reservation_object *resv,
+			       bool shared, bool intr)
 {
 	struct reservation_object_list *flist;
 	struct fence *f;
+	struct radeon_fence *fence;
 	unsigned i;
+	int r = 0;
 
 	/* always sync to the exclusive fence */
 	f = reservation_object_get_excl(resv);
-	radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
+	fence = f ? to_radeon_fence(f) : NULL;
+	if (fence && fence->rdev == rdev)
+		radeon_semaphore_sync_fence(sema, fence);
+	else if (f)
+		r = fence_wait(f, intr);
 
 	flist = reservation_object_get_list(resv);
 	if (shared || !flist)
-		return;
+		return r;
 
 	for (i = 0; i < flist->shared_count; ++i) {
 		f = rcu_dereference_protected(flist->shared[i],
 					      reservation_object_held(resv));
-		radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
+		fence = to_radeon_fence(f);
+		if (fence && fence->rdev == rdev)
+			radeon_semaphore_sync_fence(sema, fence);
+		else if (!r)
+			r = fence_wait(f, intr);
 	}
+	return r;
 }
 
 /**
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index ce870959dff8..f6e76c18d7eb 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -698,7 +698,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
 	if (ib.length_dw != 0) {
 		radeon_asic_vm_pad_ib(rdev, &ib);
 
-		radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false);
+		radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false, false);
 		radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use);
 		WARN_ON(ib.length_dw > ndw);
 		r = radeon_ib_schedule(rdev, &ib, NULL, false);
@@ -825,7 +825,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
 		unsigned nptes;
 		uint64_t pte;
 
-		radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false);
+		radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false, false);
 
 		if ((addr & ~mask) == (end & ~mask))
 			nptes = end - addr;
diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c
index c112764adfdf..6ac25027d506 100644
--- a/drivers/gpu/drm/radeon/rv770_dma.c
+++ b/drivers/gpu/drm/radeon/rv770_dma.c
@@ -67,7 +67,7 @@ struct radeon_fence *rv770_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
index 9b0dfbc913f3..381ce21dea2d 100644
--- a/drivers/gpu/drm/radeon/si_dma.c
+++ b/drivers/gpu/drm/radeon/si_dma.c
@@ -252,7 +252,7 @@ struct radeon_fence *si_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
-- 
2.0.4

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

* [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
                   ` (5 preceding siblings ...)
  2014-09-17 12:35 ` [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object Maarten Lankhorst
@ 2014-09-17 12:35 ` Maarten Lankhorst
  2014-09-17 13:14   ` Christian König
                     ` (2 more replies)
  2014-09-17 12:35 ` [PATCH 8/8] drm/nouveau: " Maarten Lankhorst
  7 siblings, 3 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:35 UTC (permalink / raw)
  To: dri-devel

Adds an extra argument to ttm_bo_create, which is only used in radeon_prime.c.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/radeon/cik.c              | 4 ++--
 drivers/gpu/drm/radeon/evergreen.c        | 6 +++---
 drivers/gpu/drm/radeon/r600.c             | 4 ++--
 drivers/gpu/drm/radeon/radeon_benchmark.c | 4 ++--
 drivers/gpu/drm/radeon/radeon_device.c    | 2 +-
 drivers/gpu/drm/radeon/radeon_gart.c      | 2 +-
 drivers/gpu/drm/radeon/radeon_gem.c       | 2 +-
 drivers/gpu/drm/radeon/radeon_object.c    | 8 +++++---
 drivers/gpu/drm/radeon/radeon_object.h    | 1 +
 drivers/gpu/drm/radeon/radeon_prime.c     | 5 ++++-
 drivers/gpu/drm/radeon/radeon_ring.c      | 2 +-
 drivers/gpu/drm/radeon/radeon_sa.c        | 2 +-
 drivers/gpu/drm/radeon/radeon_test.c      | 5 +++--
 drivers/gpu/drm/radeon/radeon_ttm.c       | 2 +-
 drivers/gpu/drm/radeon/radeon_uvd.c       | 3 ++-
 drivers/gpu/drm/radeon/radeon_vce.c       | 3 ++-
 drivers/gpu/drm/radeon/radeon_vm.c        | 5 +++--
 17 files changed, 35 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 1440b6e9281e..1f8484284b47 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -4690,7 +4690,7 @@ static int cik_mec_init(struct radeon_device *rdev)
 		r = radeon_bo_create(rdev,
 				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
 				     PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
 				     &rdev->mec.hpd_eop_obj);
 		if (r) {
 			dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
@@ -4861,7 +4861,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
 					     sizeof(struct bonaire_mqd),
 					     PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_GTT, 0, NULL,
-					     &rdev->ring[idx].mqd_obj);
+					     NULL, &rdev->ring[idx].mqd_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
 				return r;
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index dbca60c7d097..c6ccef6c3596 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -4023,7 +4023,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
 		if (rdev->rlc.save_restore_obj == NULL) {
 			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.save_restore_obj);
+					     NULL, &rdev->rlc.save_restore_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
 				return r;
@@ -4102,7 +4102,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
 		if (rdev->rlc.clear_state_obj == NULL) {
 			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.clear_state_obj);
+					     NULL, &rdev->rlc.clear_state_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
 				sumo_rlc_fini(rdev);
@@ -4179,7 +4179,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
 			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
 					     PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.cp_table_obj);
+					     NULL, &rdev->rlc.cp_table_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
 				sumo_rlc_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 35c22ee9bc4a..a82eaa81cd07 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1430,7 +1430,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev)
 	if (rdev->vram_scratch.robj == NULL) {
 		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
 				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-				     0, NULL, &rdev->vram_scratch.robj);
+				     0, NULL, NULL, &rdev->vram_scratch.robj);
 		if (r) {
 			return r;
 		}
@@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)
 		r = radeon_bo_create(rdev, rdev->ih.ring_size,
 				     PAGE_SIZE, true,
 				     RADEON_GEM_DOMAIN_GTT, 0,
-				     NULL, &rdev->ih.ring_obj);
+				     NULL, NULL, &rdev->ih.ring_obj);
 		if (r) {
 			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
 			return r;
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
index 1e8855060fc7..9e7f23dd14bd 100644
--- a/drivers/gpu/drm/radeon/radeon_benchmark.c
+++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
@@ -93,7 +93,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 	int time;
 
 	n = RADEON_BENCHMARK_ITERATIONS;
-	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
+	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);
 	if (r) {
 		goto out_cleanup;
 	}
@@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 	if (r) {
 		goto out_cleanup;
 	}
-	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
+	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);
 	if (r) {
 		goto out_cleanup;
 	}
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index e84a76e6656a..6fbab1582112 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -430,7 +430,7 @@ int radeon_wb_init(struct radeon_device *rdev)
 
 	if (rdev->wb.wb_obj == NULL) {
 		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
 				     &rdev->wb.wb_obj);
 		if (r) {
 			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index a053a0779aac..84146d5901aa 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
 	if (rdev->gart.robj == NULL) {
 		r = radeon_bo_create(rdev, rdev->gart.table_size,
 				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-				     0, NULL, &rdev->gart.robj);
+				     0, NULL, NULL, &rdev->gart.robj);
 		if (r) {
 			return r;
 		}
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 4b7c8ec36c2f..c194497aa586 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
 
 retry:
 	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
-			     flags, NULL, &robj);
+			     flags, NULL, NULL, &robj);
 	if (r) {
 		if (r != -ERESTARTSYS) {
 			if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 0e82f0223fd4..22b4179c2f1e 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -167,8 +167,10 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
 }
 
 int radeon_bo_create(struct radeon_device *rdev,
-		     unsigned long size, int byte_align, bool kernel, u32 domain,
-		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
+		     unsigned long size, int byte_align, bool kernel,
+		     u32 domain, u32 flags, struct sg_table *sg,
+		     struct reservation_object *robj,
+		     struct radeon_bo **bo_ptr)
 {
 	struct radeon_bo *bo;
 	enum ttm_bo_type type;
@@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev,
 	down_read(&rdev->pm.mclk_lock);
 	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
 			&bo->placement, page_align, !kernel, NULL,
-			acc_size, sg, NULL, &radeon_ttm_bo_destroy);
+			acc_size, sg, robj, &radeon_ttm_bo_destroy);
 	up_read(&rdev->pm.mclk_lock);
 	if (unlikely(r != 0)) {
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 98a47fdf3625..fb6ec9ba97fa 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -126,6 +126,7 @@ extern int radeon_bo_create(struct radeon_device *rdev,
 			    unsigned long size, int byte_align,
 			    bool kernel, u32 domain, u32 flags,
 			    struct sg_table *sg,
+			    struct reservation_object *robj,
 			    struct radeon_bo **bo_ptr);
 extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
 extern void radeon_bo_kunmap(struct radeon_bo *bo);
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
index 171daf7fc483..aff2a5e4ded3 100644
--- a/drivers/gpu/drm/radeon/radeon_prime.c
+++ b/drivers/gpu/drm/radeon/radeon_prime.c
@@ -61,12 +61,15 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
 							struct dma_buf_attachment *attach,
 							struct sg_table *sg)
 {
+	struct reservation_object *robj = attach->dmabuf->resv;
 	struct radeon_device *rdev = dev->dev_private;
 	struct radeon_bo *bo;
 	int ret;
 
+	ww_mutex_lock(&robj->lock, NULL);
 	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
-			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
+			       RADEON_GEM_DOMAIN_GTT, 0, sg, robj, &bo);
+	ww_mutex_unlock(&robj->lock);
 	if (ret)
 		return ERR_PTR(ret);
 
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 6f2a9bd6bb54..3d17af34afa7 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -383,7 +383,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
 	/* Allocate ring buffer */
 	if (ring->ring_obj == NULL) {
 		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
 				     NULL, &ring->ring_obj);
 		if (r) {
 			dev_err(rdev->dev, "(%d) ring create failed\n", r);
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
index b84f97c8718c..c507896aca45 100644
--- a/drivers/gpu/drm/radeon/radeon_sa.c
+++ b/drivers/gpu/drm/radeon/radeon_sa.c
@@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
 	}
 
 	r = radeon_bo_create(rdev, size, align, true,
-			     domain, flags, NULL, &sa_manager->bo);
+			     domain, flags, NULL, NULL, &sa_manager->bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index ce943e1a5e51..07b506b41008 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -67,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
 	}
 
 	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-			     0, NULL, &vram_obj);
+			     0, NULL, NULL, &vram_obj);
 	if (r) {
 		DRM_ERROR("Failed to create VRAM object\n");
 		goto out_cleanup;
@@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
 		struct radeon_fence *fence = NULL;
 
 		r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
+				     gtt_obj + i);
 		if (r) {
 			DRM_ERROR("Failed to create GTT object %d\n", i);
 			goto out_lclean;
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index eca2ce60d440..747307ec46da 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -858,7 +858,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
 	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
 
 	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0,
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
 			     NULL, &rdev->stollen_vga_memory);
 	if (r) {
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index ba4f38916026..11b662469253 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -141,7 +141,8 @@ int radeon_uvd_init(struct radeon_device *rdev)
 		  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
 		  RADEON_GPU_PAGE_SIZE;
 	r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
+			     NULL, &rdev->uvd.vcpu_bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
index c7190aadbd89..9e85757d5599 100644
--- a/drivers/gpu/drm/radeon/radeon_vce.c
+++ b/drivers/gpu/drm/radeon/radeon_vce.c
@@ -126,7 +126,8 @@ int radeon_vce_init(struct radeon_device *rdev)
 	size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
 	       RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
 	r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL,
+			     &rdev->vce.vcpu_bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index f6e76c18d7eb..683062576a8d 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -548,7 +548,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 
 		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
 				     RADEON_GPU_PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
+				     RADEON_GEM_DOMAIN_VRAM, 0,
+				     NULL, NULL, &pt);
 		if (r)
 			return r;
 
@@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
 
 	r = radeon_bo_create(rdev, pd_size, align, true,
 			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-			     &vm->page_directory);
+			     NULL, &vm->page_directory);
 	if (r)
 		return r;
 
-- 
2.0.4

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

* [PATCH 8/8] drm/nouveau: export reservation_object from dmabuf to ttm
  2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
                   ` (6 preceding siblings ...)
  2014-09-17 12:35 ` [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm Maarten Lankhorst
@ 2014-09-17 12:35 ` Maarten Lankhorst
  7 siblings, 0 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-17 12:35 UTC (permalink / raw)
  To: dri-devel

Adds an extra argument to nouveau_bo_new, which is only used in nouveau_prime.c.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
 drivers/gpu/drm/nouveau/dispnv04/crtc.c | 2 +-
 drivers/gpu/drm/nouveau/nouveau_bo.c    | 4 ++--
 drivers/gpu/drm/nouveau/nouveau_bo.h    | 1 +
 drivers/gpu/drm/nouveau/nouveau_chan.c  | 2 +-
 drivers/gpu/drm/nouveau/nouveau_fence.c | 6 +++++-
 drivers/gpu/drm/nouveau/nouveau_gem.c   | 2 +-
 drivers/gpu/drm/nouveau/nouveau_prime.c | 5 ++++-
 drivers/gpu/drm/nouveau/nv17_fence.c    | 2 +-
 drivers/gpu/drm/nouveau/nv50_display.c  | 6 +++---
 drivers/gpu/drm/nouveau/nv50_fence.c    | 2 +-
 drivers/gpu/drm/nouveau/nv84_fence.c    | 4 ++--
 11 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
index b90aa5c1f90a..fca6a1f9c20c 100644
--- a/drivers/gpu/drm/nouveau/dispnv04/crtc.c
+++ b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
@@ -1127,7 +1127,7 @@ nv04_crtc_create(struct drm_device *dev, int crtc_num)
 	drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
 
 	ret = nouveau_bo_new(dev, 64*64*4, 0x100, TTM_PL_FLAG_VRAM,
-			     0, 0x0000, NULL, &nv_crtc->cursor.nvbo);
+			     0, 0x0000, NULL, NULL, &nv_crtc->cursor.nvbo);
 	if (!ret) {
 		ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM);
 		if (!ret) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 7034cacaa4a1..3d474ac03f88 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -181,7 +181,7 @@ nouveau_bo_fixup_align(struct nouveau_bo *nvbo, u32 flags,
 int
 nouveau_bo_new(struct drm_device *dev, int size, int align,
 	       uint32_t flags, uint32_t tile_mode, uint32_t tile_flags,
-	       struct sg_table *sg,
+	       struct sg_table *sg, struct reservation_object *robj,
 	       struct nouveau_bo **pnvbo)
 {
 	struct nouveau_drm *drm = nouveau_drm(dev);
@@ -230,7 +230,7 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
 	ret = ttm_bo_init(&drm->ttm.bdev, &nvbo->bo, size,
 			  type, &nvbo->placement,
 			  align >> PAGE_SHIFT, false, NULL, acc_size, sg,
-			  NULL, nouveau_bo_del_ttm);
+			  robj, nouveau_bo_del_ttm);
 	if (ret) {
 		/* ttm will call nouveau_bo_del_ttm if it fails.. */
 		return ret;
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h b/drivers/gpu/drm/nouveau/nouveau_bo.h
index ae95b2d43b36..d20c0b5c4e31 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.h
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.h
@@ -68,6 +68,7 @@ extern struct ttm_bo_driver nouveau_bo_driver;
 void nouveau_bo_move_init(struct nouveau_drm *);
 int  nouveau_bo_new(struct drm_device *, int size, int align, u32 flags,
 		    u32 tile_mode, u32 tile_flags, struct sg_table *sg,
+		    struct reservation_object *robj,
 		    struct nouveau_bo **);
 int  nouveau_bo_pin(struct nouveau_bo *, u32 flags);
 int  nouveau_bo_unpin(struct nouveau_bo *);
diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c
index 9a362ddd8225..977fb8f15d97 100644
--- a/drivers/gpu/drm/nouveau/nouveau_chan.c
+++ b/drivers/gpu/drm/nouveau/nouveau_chan.c
@@ -106,7 +106,7 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nvif_device *device,
 	if (nouveau_vram_pushbuf)
 		target = TTM_PL_FLAG_VRAM;
 
-	ret = nouveau_bo_new(drm->dev, size, 0, target, 0, 0, NULL,
+	ret = nouveau_bo_new(drm->dev, size, 0, target, 0, 0, NULL, NULL,
 			    &chan->push.buffer);
 	if (ret == 0) {
 		ret = nouveau_bo_pin(chan->push.buffer, target);
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index dfd0b9ed4195..affe3944e643 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -195,8 +195,12 @@ nouveau_fence_work(struct fence *fence,
 
 	work = kmalloc(sizeof(*work), GFP_KERNEL);
 	if (!work) {
+		/*
+		 * this might not be a nouveau fence any more,
+		 * so force a lazy wait here
+		 */
 		WARN_ON(nouveau_fence_wait((struct nouveau_fence *)fence,
-					   false, false));
+					   true, false));
 		goto err;
 	}
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 3f693c1f5b36..36951ee4b157 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -165,7 +165,7 @@ nouveau_gem_new(struct drm_device *dev, int size, int align, uint32_t domain,
 		flags |= TTM_PL_FLAG_SYSTEM;
 
 	ret = nouveau_bo_new(dev, size, align, flags, tile_mode,
-			     tile_flags, NULL, pnvbo);
+			     tile_flags, NULL, NULL, pnvbo);
 	if (ret)
 		return ret;
 	nvbo = *pnvbo;
diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c
index 2215cdba587d..228226ab27fc 100644
--- a/drivers/gpu/drm/nouveau/nouveau_prime.c
+++ b/drivers/gpu/drm/nouveau/nouveau_prime.c
@@ -61,13 +61,16 @@ struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,
 							 struct sg_table *sg)
 {
 	struct nouveau_bo *nvbo;
+	struct reservation_object *robj = attach->dmabuf->resv;
 	u32 flags = 0;
 	int ret;
 
 	flags = TTM_PL_FLAG_TT;
 
+	ww_mutex_lock(&robj->lock, NULL);
 	ret = nouveau_bo_new(dev, attach->dmabuf->size, 0, flags, 0, 0,
-			     sg, &nvbo);
+			     sg, robj, &nvbo);
+	ww_mutex_unlock(&robj->lock);
 	if (ret)
 		return ERR_PTR(ret);
 
diff --git a/drivers/gpu/drm/nouveau/nv17_fence.c b/drivers/gpu/drm/nouveau/nv17_fence.c
index 6f9a1f8e2d0f..40b461c7d5c5 100644
--- a/drivers/gpu/drm/nouveau/nv17_fence.c
+++ b/drivers/gpu/drm/nouveau/nv17_fence.c
@@ -129,7 +129,7 @@ nv17_fence_create(struct nouveau_drm *drm)
 	spin_lock_init(&priv->lock);
 
 	ret = nouveau_bo_new(drm->dev, 4096, 0x1000, TTM_PL_FLAG_VRAM,
-			     0, 0x0000, NULL, &priv->bo);
+			     0, 0x0000, NULL, NULL, &priv->bo);
 	if (!ret) {
 		ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM);
 		if (!ret) {
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
index fdb3e1adea1e..ae873d1a8d46 100644
--- a/drivers/gpu/drm/nouveau/nv50_display.c
+++ b/drivers/gpu/drm/nouveau/nv50_display.c
@@ -1383,7 +1383,7 @@ nv50_crtc_create(struct drm_device *dev, int index)
 	drm_mode_crtc_set_gamma_size(crtc, 256);
 
 	ret = nouveau_bo_new(dev, 8192, 0x100, TTM_PL_FLAG_VRAM,
-			     0, 0x0000, NULL, &head->base.lut.nvbo);
+			     0, 0x0000, NULL, NULL, &head->base.lut.nvbo);
 	if (!ret) {
 		ret = nouveau_bo_pin(head->base.lut.nvbo, TTM_PL_FLAG_VRAM);
 		if (!ret) {
@@ -1406,7 +1406,7 @@ nv50_crtc_create(struct drm_device *dev, int index)
 		goto out;
 
 	ret = nouveau_bo_new(dev, 64 * 64 * 4, 0x100, TTM_PL_FLAG_VRAM,
-			     0, 0x0000, NULL, &head->base.cursor.nvbo);
+			     0, 0x0000, NULL, NULL, &head->base.cursor.nvbo);
 	if (!ret) {
 		ret = nouveau_bo_pin(head->base.cursor.nvbo, TTM_PL_FLAG_VRAM);
 		if (!ret) {
@@ -2468,7 +2468,7 @@ nv50_display_create(struct drm_device *dev)
 
 	/* small shared memory area we use for notifiers and semaphores */
 	ret = nouveau_bo_new(dev, 4096, 0x1000, TTM_PL_FLAG_VRAM,
-			     0, 0x0000, NULL, &disp->sync);
+			     0, 0x0000, NULL, NULL, &disp->sync);
 	if (!ret) {
 		ret = nouveau_bo_pin(disp->sync, TTM_PL_FLAG_VRAM);
 		if (!ret) {
diff --git a/drivers/gpu/drm/nouveau/nv50_fence.c b/drivers/gpu/drm/nouveau/nv50_fence.c
index 08fad3668a1c..22d242b37962 100644
--- a/drivers/gpu/drm/nouveau/nv50_fence.c
+++ b/drivers/gpu/drm/nouveau/nv50_fence.c
@@ -100,7 +100,7 @@ nv50_fence_create(struct nouveau_drm *drm)
 	spin_lock_init(&priv->lock);
 
 	ret = nouveau_bo_new(drm->dev, 4096, 0x1000, TTM_PL_FLAG_VRAM,
-			     0, 0x0000, NULL, &priv->bo);
+			     0, 0x0000, NULL, NULL, &priv->bo);
 	if (!ret) {
 		ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM);
 		if (!ret) {
diff --git a/drivers/gpu/drm/nouveau/nv84_fence.c b/drivers/gpu/drm/nouveau/nv84_fence.c
index a2f28082c272..7b372a68aa4e 100644
--- a/drivers/gpu/drm/nouveau/nv84_fence.c
+++ b/drivers/gpu/drm/nouveau/nv84_fence.c
@@ -233,7 +233,7 @@ nv84_fence_create(struct nouveau_drm *drm)
 	priv->base.uevent = true;
 
 	ret = nouveau_bo_new(drm->dev, 16 * priv->base.contexts, 0,
-			     TTM_PL_FLAG_VRAM, 0, 0, NULL, &priv->bo);
+			     TTM_PL_FLAG_VRAM, 0, 0, NULL, NULL, &priv->bo);
 	if (ret == 0) {
 		ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM);
 		if (ret == 0) {
@@ -247,7 +247,7 @@ nv84_fence_create(struct nouveau_drm *drm)
 
 	if (ret == 0)
 		ret = nouveau_bo_new(drm->dev, 16 * priv->base.contexts, 0,
-				     TTM_PL_FLAG_TT, 0, 0, NULL,
+				     TTM_PL_FLAG_TT, 0, 0, NULL, NULL,
 				     &priv->bo_gart);
 	if (ret == 0) {
 		ret = nouveau_bo_pin(priv->bo_gart, TTM_PL_FLAG_TT);
-- 
2.0.4

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

* Re: [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-17 12:35 ` [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object Maarten Lankhorst
@ 2014-09-17 13:09   ` Christian König
  2014-09-25  9:52     ` Maarten Lankhorst
  2014-09-25 10:39     ` [PATCH v2 " Maarten Lankhorst
  2014-09-18  3:26   ` [PATCH " Michel Dänzer
  1 sibling, 2 replies; 24+ messages in thread
From: Christian König @ 2014-09-17 13:09 UTC (permalink / raw)
  To: Maarten Lankhorst, dri-devel

Am 17.09.2014 um 14:35 schrieb Maarten Lankhorst:
> Not the whole world is a radeon! :-)
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
> ---
>   drivers/gpu/drm/radeon/cik.c              |  2 +-
>   drivers/gpu/drm/radeon/cik_sdma.c         |  2 +-
>   drivers/gpu/drm/radeon/evergreen_dma.c    |  2 +-
>   drivers/gpu/drm/radeon/r600.c             |  2 +-
>   drivers/gpu/drm/radeon/r600_dma.c         |  2 +-
>   drivers/gpu/drm/radeon/radeon.h           |  7 ++++---
>   drivers/gpu/drm/radeon/radeon_cs.c        | 27 ++++++++++++++++++++-------
>   drivers/gpu/drm/radeon/radeon_fence.c     |  3 +++
>   drivers/gpu/drm/radeon/radeon_semaphore.c | 24 ++++++++++++++++++------
>   drivers/gpu/drm/radeon/radeon_vm.c        |  4 ++--
>   drivers/gpu/drm/radeon/rv770_dma.c        |  2 +-
>   drivers/gpu/drm/radeon/si_dma.c           |  2 +-
>   12 files changed, 54 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
> index 0d761f73a7fa..1440b6e9281e 100644
> --- a/drivers/gpu/drm/radeon/cik.c
> +++ b/drivers/gpu/drm/radeon/cik.c
> @@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
>   		return ERR_PTR(r);
>   	}
>   
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>   
>   	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
> index c01a6100c318..315c595418ec 100644
> --- a/drivers/gpu/drm/radeon/cik_sdma.c
> +++ b/drivers/gpu/drm/radeon/cik_sdma.c
> @@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev,
>   		return ERR_PTR(r);
>   	}
>   
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>   
>   	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
> index 946f37d0b469..5a5686792068 100644
> --- a/drivers/gpu/drm/radeon/evergreen_dma.c
> +++ b/drivers/gpu/drm/radeon/evergreen_dma.c
> @@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev,
>   		return ERR_PTR(r);
>   	}
>   
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>   
>   	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 25f367ac4637..35c22ee9bc4a 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
>   		return ERR_PTR(r);
>   	}
>   
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>   
>   	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
> diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
> index fc54224ce87b..674af8db7a35 100644
> --- a/drivers/gpu/drm/radeon/r600_dma.c
> +++ b/drivers/gpu/drm/radeon/r600_dma.c
> @@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev,
>   		return ERR_PTR(r);
>   	}
>   
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>   
>   	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 9aa75c1af4f4..6cdc5e62fe12 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -587,9 +587,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
>   				struct radeon_semaphore *semaphore);
>   void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>   				 struct radeon_fence *fence);
> -void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore,
> -				struct reservation_object *resv,
> -				bool shared);
> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
> +			       struct radeon_semaphore *semaphore,
> +			       struct reservation_object *resv,
> +			       bool shared, bool intr);
>   int radeon_semaphore_sync_rings(struct radeon_device *rdev,
>   				struct radeon_semaphore *semaphore,
>   				int waiting_ring);
> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> index f662de41ba49..a4a608c8b1ba 100644
> --- a/drivers/gpu/drm/radeon/radeon_cs.c
> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> @@ -249,20 +249,21 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
>   	return 0;
>   }
>   
> -static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
> +static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
>   {
> -	int i;
> +	int i, r = 0;
>   
> -	for (i = 0; i < p->nrelocs; i++) {
> +	for (i = 0; !r && i < p->nrelocs; i++) {
>   		struct reservation_object *resv;
>   
>   		if (!p->relocs[i].robj)
>   			continue;
>   
>   		resv = p->relocs[i].robj->tbo.resv;
> -		radeon_semaphore_sync_resv(p->ib.semaphore, resv,
> -					   p->relocs[i].tv.shared);
> +		r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
> +					       p->relocs[i].tv.shared, true);

Break on the first error?

>   	}
> +	return r;
>   }
>   
>   /* XXX: note that this is called from the legacy UMS CS ioctl as well */
> @@ -472,13 +473,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
>   		return r;
>   	}
>   
> +	r = radeon_cs_sync_rings(parser);
> +	if (r) {
> +		if (r != -ERESTARTSYS)
> +			DRM_ERROR("Failed to sync rings: %i\n", r);
> +		return r;
> +	}
> +
>   	if (parser->ring == R600_RING_TYPE_UVD_INDEX)
>   		radeon_uvd_note_usage(rdev);
>   	else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||
>   		 (parser->ring == TN_RING_TYPE_VCE2_INDEX))
>   		radeon_vce_note_usage(rdev);
>   
> -	radeon_cs_sync_rings(parser);
>   	r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
>   	if (r) {
>   		DRM_ERROR("Failed to schedule IB !\n");
> @@ -565,7 +572,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
>   	if (r) {
>   		goto out;
>   	}
> -	radeon_cs_sync_rings(parser);
> +
> +	r = radeon_cs_sync_rings(parser);
> +	if (r) {
> +		if (r != -ERESTARTSYS)
> +			DRM_ERROR("Failed to sync rings: %i\n", r);
> +		goto out;
> +	}
>   	radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);
>   
>   	if ((rdev->family >= CHIP_TAHITI) &&
> diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
> index af9f2d6bd7d0..0262fe2580d2 100644
> --- a/drivers/gpu/drm/radeon/radeon_fence.c
> +++ b/drivers/gpu/drm/radeon/radeon_fence.c
> @@ -541,6 +541,9 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
>   	uint64_t seq[RADEON_NUM_RINGS] = {};
>   	long r;
>   
> +	if (unlikely(!to_radeon_fence(&fence->base)))
> +		return fence_wait(&fence->base, intr);
> +
>   	seq[fence->ring] = fence->seq;
>   	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
>   	if (r < 0) {
> diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
> index 4d4b0773638a..68311da39c09 100644
> --- a/drivers/gpu/drm/radeon/radeon_semaphore.c
> +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
> @@ -124,27 +124,39 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>    *
>    * Sync to the fence using this semaphore object
>    */
> -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
> -				struct reservation_object *resv,
> -				bool shared)
> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
> +			       struct radeon_semaphore *sema,
> +			       struct reservation_object *resv,
> +			       bool shared, bool intr)
>   {
>   	struct reservation_object_list *flist;
>   	struct fence *f;
> +	struct radeon_fence *fence;
>   	unsigned i;
> +	int r = 0;
>   
>   	/* always sync to the exclusive fence */
>   	f = reservation_object_get_excl(resv);
> -	radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
> +	fence = f ? to_radeon_fence(f) : NULL;
> +	if (fence && fence->rdev == rdev)
> +		radeon_semaphore_sync_fence(sema, fence);
> +	else if (f)
> +		r = fence_wait(f, intr);

Error handling? If anything goes wrong while waiting on the exclusive 
fence we would overwrite the error with the result of the shared fences.

>   
>   	flist = reservation_object_get_list(resv);
>   	if (shared || !flist)
> -		return;
> +		return r;
>   
>   	for (i = 0; i < flist->shared_count; ++i) {
>   		f = rcu_dereference_protected(flist->shared[i],
>   					      reservation_object_held(resv));
> -		radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
> +		fence = to_radeon_fence(f);
> +		if (fence && fence->rdev == rdev)
> +			radeon_semaphore_sync_fence(sema, fence);
> +		else if (!r)
> +			r = fence_wait(f, intr);

Again break on the first error.

>   	}

Maybe print the error that something went wrong here instead.

Apart from that approach look good to me,
Christian.

> +	return r;
>   }
>   
>   /**
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index ce870959dff8..f6e76c18d7eb 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -698,7 +698,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
>   	if (ib.length_dw != 0) {
>   		radeon_asic_vm_pad_ib(rdev, &ib);
>   
> -		radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false);
> +		radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false, false);
>   		radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use);
>   		WARN_ON(ib.length_dw > ndw);
>   		r = radeon_ib_schedule(rdev, &ib, NULL, false);
> @@ -825,7 +825,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
>   		unsigned nptes;
>   		uint64_t pte;
>   
> -		radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false);
> +		radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false, false);
>   
>   		if ((addr & ~mask) == (end & ~mask))
>   			nptes = end - addr;
> diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c
> index c112764adfdf..6ac25027d506 100644
> --- a/drivers/gpu/drm/radeon/rv770_dma.c
> +++ b/drivers/gpu/drm/radeon/rv770_dma.c
> @@ -67,7 +67,7 @@ struct radeon_fence *rv770_copy_dma(struct radeon_device *rdev,
>   		return ERR_PTR(r);
>   	}
>   
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>   
>   	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
> index 9b0dfbc913f3..381ce21dea2d 100644
> --- a/drivers/gpu/drm/radeon/si_dma.c
> +++ b/drivers/gpu/drm/radeon/si_dma.c
> @@ -252,7 +252,7 @@ struct radeon_fence *si_copy_dma(struct radeon_device *rdev,
>   		return ERR_PTR(r);
>   	}
>   
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>   
>   	for (i = 0; i < num_loops; i++) {

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

* Re: [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm
  2014-09-17 12:35 ` [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm Maarten Lankhorst
@ 2014-09-17 13:14   ` Christian König
  2014-09-18  3:22   ` Michel Dänzer
  2014-09-18 12:11   ` [PATCH v2 " Maarten Lankhorst
  2 siblings, 0 replies; 24+ messages in thread
From: Christian König @ 2014-09-17 13:14 UTC (permalink / raw)
  To: Maarten Lankhorst, dri-devel

Am 17.09.2014 um 14:35 schrieb Maarten Lankhorst:
> Adds an extra argument to ttm_bo_create, which is only used in radeon_prime.c.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
> ---
>   drivers/gpu/drm/radeon/cik.c              | 4 ++--
>   drivers/gpu/drm/radeon/evergreen.c        | 6 +++---
>   drivers/gpu/drm/radeon/r600.c             | 4 ++--
>   drivers/gpu/drm/radeon/radeon_benchmark.c | 4 ++--
>   drivers/gpu/drm/radeon/radeon_device.c    | 2 +-
>   drivers/gpu/drm/radeon/radeon_gart.c      | 2 +-
>   drivers/gpu/drm/radeon/radeon_gem.c       | 2 +-
>   drivers/gpu/drm/radeon/radeon_object.c    | 8 +++++---
>   drivers/gpu/drm/radeon/radeon_object.h    | 1 +
>   drivers/gpu/drm/radeon/radeon_prime.c     | 5 ++++-
>   drivers/gpu/drm/radeon/radeon_ring.c      | 2 +-
>   drivers/gpu/drm/radeon/radeon_sa.c        | 2 +-
>   drivers/gpu/drm/radeon/radeon_test.c      | 5 +++--
>   drivers/gpu/drm/radeon/radeon_ttm.c       | 2 +-
>   drivers/gpu/drm/radeon/radeon_uvd.c       | 3 ++-
>   drivers/gpu/drm/radeon/radeon_vce.c       | 3 ++-
>   drivers/gpu/drm/radeon/radeon_vm.c        | 5 +++--
>   17 files changed, 35 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
> index 1440b6e9281e..1f8484284b47 100644
> --- a/drivers/gpu/drm/radeon/cik.c
> +++ b/drivers/gpu/drm/radeon/cik.c
> @@ -4690,7 +4690,7 @@ static int cik_mec_init(struct radeon_device *rdev)
>   		r = radeon_bo_create(rdev,
>   				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
>   				     PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
>   				     &rdev->mec.hpd_eop_obj);
>   		if (r) {
>   			dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
> @@ -4861,7 +4861,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
>   					     sizeof(struct bonaire_mqd),
>   					     PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> -					     &rdev->ring[idx].mqd_obj);
> +					     NULL, &rdev->ring[idx].mqd_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
>   				return r;
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index dbca60c7d097..c6ccef6c3596 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -4023,7 +4023,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   		if (rdev->rlc.save_restore_obj == NULL) {
>   			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.save_restore_obj);
> +					     NULL, &rdev->rlc.save_restore_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
>   				return r;
> @@ -4102,7 +4102,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   		if (rdev->rlc.clear_state_obj == NULL) {
>   			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.clear_state_obj);
> +					     NULL, &rdev->rlc.clear_state_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
>   				sumo_rlc_fini(rdev);
> @@ -4179,7 +4179,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
>   					     PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.cp_table_obj);
> +					     NULL, &rdev->rlc.cp_table_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
>   				sumo_rlc_fini(rdev);
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 35c22ee9bc4a..a82eaa81cd07 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -1430,7 +1430,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev)
>   	if (rdev->vram_scratch.robj == NULL) {
>   		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
>   				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -				     0, NULL, &rdev->vram_scratch.robj);
> +				     0, NULL, NULL, &rdev->vram_scratch.robj);
>   		if (r) {
>   			return r;
>   		}
> @@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)
>   		r = radeon_bo_create(rdev, rdev->ih.ring_size,
>   				     PAGE_SIZE, true,
>   				     RADEON_GEM_DOMAIN_GTT, 0,
> -				     NULL, &rdev->ih.ring_obj);
> +				     NULL, NULL, &rdev->ih.ring_obj);
>   		if (r) {
>   			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
>   			return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
> index 1e8855060fc7..9e7f23dd14bd 100644
> --- a/drivers/gpu/drm/radeon/radeon_benchmark.c
> +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
> @@ -93,7 +93,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   	int time;
>   
>   	n = RADEON_BENCHMARK_ITERATIONS;
> -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
> +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);
>   	if (r) {
>   		goto out_cleanup;
>   	}
> @@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   	if (r) {
>   		goto out_cleanup;
>   	}
> -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
> +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);
>   	if (r) {
>   		goto out_cleanup;
>   	}
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index e84a76e6656a..6fbab1582112 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -430,7 +430,7 @@ int radeon_wb_init(struct radeon_device *rdev)
>   
>   	if (rdev->wb.wb_obj == NULL) {
>   		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
>   				     &rdev->wb.wb_obj);
>   		if (r) {
>   			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
> diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
> index a053a0779aac..84146d5901aa 100644
> --- a/drivers/gpu/drm/radeon/radeon_gart.c
> +++ b/drivers/gpu/drm/radeon/radeon_gart.c
> @@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
>   	if (rdev->gart.robj == NULL) {
>   		r = radeon_bo_create(rdev, rdev->gart.table_size,
>   				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -				     0, NULL, &rdev->gart.robj);
> +				     0, NULL, NULL, &rdev->gart.robj);
>   		if (r) {
>   			return r;
>   		}
> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
> index 4b7c8ec36c2f..c194497aa586 100644
> --- a/drivers/gpu/drm/radeon/radeon_gem.c
> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
> @@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
>   
>   retry:
>   	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
> -			     flags, NULL, &robj);
> +			     flags, NULL, NULL, &robj);
>   	if (r) {
>   		if (r != -ERESTARTSYS) {
>   			if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 0e82f0223fd4..22b4179c2f1e 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -167,8 +167,10 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>   }
>   
>   int radeon_bo_create(struct radeon_device *rdev,
> -		     unsigned long size, int byte_align, bool kernel, u32 domain,
> -		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
> +		     unsigned long size, int byte_align, bool kernel,
> +		     u32 domain, u32 flags, struct sg_table *sg,
> +		     struct reservation_object *robj,
> +		     struct radeon_bo **bo_ptr)

We should sooner or later split the function into multiple ones, we try 
to handle to many things with it.

Anyway, for now the patch looks good. Just don't name the new parameter 
"robj", cause that sounds to much like short for "radeon object". "resv" 
for example sounds fine to me.

Christian.

>   {
>   	struct radeon_bo *bo;
>   	enum ttm_bo_type type;
> @@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev,
>   	down_read(&rdev->pm.mclk_lock);
>   	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
>   			&bo->placement, page_align, !kernel, NULL,
> -			acc_size, sg, NULL, &radeon_ttm_bo_destroy);
> +			acc_size, sg, robj, &radeon_ttm_bo_destroy);
>   	up_read(&rdev->pm.mclk_lock);
>   	if (unlikely(r != 0)) {
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
> index 98a47fdf3625..fb6ec9ba97fa 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.h
> +++ b/drivers/gpu/drm/radeon/radeon_object.h
> @@ -126,6 +126,7 @@ extern int radeon_bo_create(struct radeon_device *rdev,
>   			    unsigned long size, int byte_align,
>   			    bool kernel, u32 domain, u32 flags,
>   			    struct sg_table *sg,
> +			    struct reservation_object *robj,
>   			    struct radeon_bo **bo_ptr);
>   extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
>   extern void radeon_bo_kunmap(struct radeon_bo *bo);
> diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
> index 171daf7fc483..aff2a5e4ded3 100644
> --- a/drivers/gpu/drm/radeon/radeon_prime.c
> +++ b/drivers/gpu/drm/radeon/radeon_prime.c
> @@ -61,12 +61,15 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
>   							struct dma_buf_attachment *attach,
>   							struct sg_table *sg)
>   {
> +	struct reservation_object *robj = attach->dmabuf->resv;
>   	struct radeon_device *rdev = dev->dev_private;
>   	struct radeon_bo *bo;
>   	int ret;
>   
> +	ww_mutex_lock(&robj->lock, NULL);
>   	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
> -			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
> +			       RADEON_GEM_DOMAIN_GTT, 0, sg, robj, &bo);
> +	ww_mutex_unlock(&robj->lock);
>   	if (ret)
>   		return ERR_PTR(ret);
>   
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index 6f2a9bd6bb54..3d17af34afa7 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -383,7 +383,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
>   	/* Allocate ring buffer */
>   	if (ring->ring_obj == NULL) {
>   		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
>   				     NULL, &ring->ring_obj);
>   		if (r) {
>   			dev_err(rdev->dev, "(%d) ring create failed\n", r);
> diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
> index b84f97c8718c..c507896aca45 100644
> --- a/drivers/gpu/drm/radeon/radeon_sa.c
> +++ b/drivers/gpu/drm/radeon/radeon_sa.c
> @@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
>   	}
>   
>   	r = radeon_bo_create(rdev, size, align, true,
> -			     domain, flags, NULL, &sa_manager->bo);
> +			     domain, flags, NULL, NULL, &sa_manager->bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
> index ce943e1a5e51..07b506b41008 100644
> --- a/drivers/gpu/drm/radeon/radeon_test.c
> +++ b/drivers/gpu/drm/radeon/radeon_test.c
> @@ -67,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
>   	}
>   
>   	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -			     0, NULL, &vram_obj);
> +			     0, NULL, NULL, &vram_obj);
>   	if (r) {
>   		DRM_ERROR("Failed to create VRAM object\n");
>   		goto out_cleanup;
> @@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
>   		struct radeon_fence *fence = NULL;
>   
>   		r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
> +				     gtt_obj + i);
>   		if (r) {
>   			DRM_ERROR("Failed to create GTT object %d\n", i);
>   			goto out_lclean;
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index eca2ce60d440..747307ec46da 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -858,7 +858,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
>   	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
>   
>   	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0,
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
>   			     NULL, &rdev->stollen_vga_memory);
>   	if (r) {
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
> index ba4f38916026..11b662469253 100644
> --- a/drivers/gpu/drm/radeon/radeon_uvd.c
> +++ b/drivers/gpu/drm/radeon/radeon_uvd.c
> @@ -141,7 +141,8 @@ int radeon_uvd_init(struct radeon_device *rdev)
>   		  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
>   		  RADEON_GPU_PAGE_SIZE;
>   	r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> +			     NULL, &rdev->uvd.vcpu_bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
> index c7190aadbd89..9e85757d5599 100644
> --- a/drivers/gpu/drm/radeon/radeon_vce.c
> +++ b/drivers/gpu/drm/radeon/radeon_vce.c
> @@ -126,7 +126,8 @@ int radeon_vce_init(struct radeon_device *rdev)
>   	size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
>   	       RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
>   	r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL,
> +			     &rdev->vce.vcpu_bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index f6e76c18d7eb..683062576a8d 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -548,7 +548,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   
>   		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
>   				     RADEON_GPU_PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
> +				     RADEON_GEM_DOMAIN_VRAM, 0,
> +				     NULL, NULL, &pt);
>   		if (r)
>   			return r;
>   
> @@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
>   
>   	r = radeon_bo_create(rdev, pd_size, align, true,
>   			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -			     &vm->page_directory);
> +			     NULL, &vm->page_directory);
>   	if (r)
>   		return r;
>   

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

* Re: [PATCH 5/8] drm/radeon: cope with foreign fences inside display
  2014-09-17 12:35 ` [PATCH 5/8] drm/radeon: cope with foreign fences inside display Maarten Lankhorst
@ 2014-09-17 13:16   ` Christian König
  0 siblings, 0 replies; 24+ messages in thread
From: Christian König @ 2014-09-17 13:16 UTC (permalink / raw)
  To: Maarten Lankhorst, dri-devel

Am 17.09.2014 um 14:35 schrieb Maarten Lankhorst:
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>

Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
>   drivers/gpu/drm/radeon/radeon.h         |  2 +-
>   drivers/gpu/drm/radeon/radeon_display.c | 30 +++++++++++++++++++-----------
>   2 files changed, 20 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 82b0e11ade89..9aa75c1af4f4 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -710,7 +710,7 @@ struct radeon_flip_work {
>   	uint64_t			base;
>   	struct drm_pending_vblank_event *event;
>   	struct radeon_bo		*old_rbo;
> -	struct radeon_fence		*fence;
> +	struct fence			*fence;
>   };
>   
>   struct r500_irq_stat_regs {
> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
> index 4eb37976f879..00ead8c2758a 100644
> --- a/drivers/gpu/drm/radeon/radeon_display.c
> +++ b/drivers/gpu/drm/radeon/radeon_display.c
> @@ -402,14 +402,21 @@ static void radeon_flip_work_func(struct work_struct *__work)
>   
>           down_read(&rdev->exclusive_lock);
>   	if (work->fence) {
> -		r = radeon_fence_wait(work->fence, false);
> -		if (r == -EDEADLK) {
> -			up_read(&rdev->exclusive_lock);
> -			do {
> -				r = radeon_gpu_reset(rdev);
> -			} while (r == -EAGAIN);
> -			down_read(&rdev->exclusive_lock);
> -		}
> +		struct radeon_fence *fence;
> +
> +		fence = to_radeon_fence(work->fence);
> +		if (fence && fence->rdev == rdev) {
> +			r = radeon_fence_wait(fence, false);
> +			if (r == -EDEADLK) {
> +				up_read(&rdev->exclusive_lock);
> +				do {
> +					r = radeon_gpu_reset(rdev);
> +				} while (r == -EAGAIN);
> +				down_read(&rdev->exclusive_lock);
> +			}
> +		} else
> +			r = fence_wait(work->fence, false);
> +
>   		if (r)
>   			DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
>   
> @@ -418,7 +425,8 @@ static void radeon_flip_work_func(struct work_struct *__work)
>   		 * confused about which BO the CRTC is scanning out
>   		 */
>   
> -		radeon_fence_unref(&work->fence);
> +		fence_put(work->fence);
> +		work->fence = NULL;
>   	}
>   
>   	/* We borrow the event spin lock for protecting flip_status */
> @@ -494,7 +502,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
>   		DRM_ERROR("failed to pin new rbo buffer before flip\n");
>   		goto cleanup;
>   	}
> -	work->fence = (struct radeon_fence *)fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
> +	work->fence = fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
>   	radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL);
>   	radeon_bo_unreserve(new_rbo);
>   
> @@ -576,7 +584,7 @@ pflip_cleanup:
>   
>   cleanup:
>   	drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
> -	radeon_fence_unref(&work->fence);
> +	fence_put(work->fence);
>   	kfree(work);
>   	return r;
>   }

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

* Re: [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm
  2014-09-17 12:35 ` [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm Maarten Lankhorst
  2014-09-17 13:14   ` Christian König
@ 2014-09-18  3:22   ` Michel Dänzer
  2014-09-18 12:11   ` [PATCH v2 " Maarten Lankhorst
  2 siblings, 0 replies; 24+ messages in thread
From: Michel Dänzer @ 2014-09-18  3:22 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: dri-devel

On 17.09.2014 21:35, Maarten Lankhorst wrote:
> Adds an extra argument to ttm_bo_create, which is only used in radeon_prime.c.

Typo: 'ttm_bo_create' -> 'radeon_bo_create'


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer

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

* Re: [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-17 12:35 ` [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object Maarten Lankhorst
  2014-09-17 13:09   ` Christian König
@ 2014-09-18  3:26   ` Michel Dänzer
  2014-09-18 10:22     ` Maarten Lankhorst
  1 sibling, 1 reply; 24+ messages in thread
From: Michel Dänzer @ 2014-09-18  3:26 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: dri-devel

On 17.09.2014 21:35, Maarten Lankhorst wrote:
> diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
> index 4d4b0773638a..68311da39c09 100644
> --- a/drivers/gpu/drm/radeon/radeon_semaphore.c
> +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
> @@ -124,27 +124,39 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>    *
>    * Sync to the fence using this semaphore object
>    */
> -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
> -				struct reservation_object *resv,
> -				bool shared)
> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
> +			       struct radeon_semaphore *sema,
> +			       struct reservation_object *resv,
> +			       bool shared, bool intr)

The callers of this function would be more readable if it took flags 
instead of the shared and intr bools.


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer

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

* Re: [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-18  3:26   ` [PATCH " Michel Dänzer
@ 2014-09-18 10:22     ` Maarten Lankhorst
  2014-09-19  1:19       ` Michel Dänzer
  0 siblings, 1 reply; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-18 10:22 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: dri-devel

Hey,

Op 18-09-14 om 05:26 schreef Michel Dänzer:
> On 17.09.2014 21:35, Maarten Lankhorst wrote:
>> diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
>> index 4d4b0773638a..68311da39c09 100644
>> --- a/drivers/gpu/drm/radeon/radeon_semaphore.c
>> +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
>> @@ -124,27 +124,39 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>>    *
>>    * Sync to the fence using this semaphore object
>>    */
>> -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
>> -                struct reservation_object *resv,
>> -                bool shared)
>> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
>> +                   struct radeon_semaphore *sema,
>> +                   struct reservation_object *resv,
>> +                   bool shared, bool intr)
>
> The callers of this function would be more readable if it took flags instead of the shared and intr bools.
This does not match the rest of the TTM design. Things like ttm_bo_reserve take separate bools, not flags.

~Maarten

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

* [PATCH v2 7/8] drm/radeon: export reservation_object from dmabuf to ttm
  2014-09-17 12:35 ` [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm Maarten Lankhorst
  2014-09-17 13:14   ` Christian König
  2014-09-18  3:22   ` Michel Dänzer
@ 2014-09-18 12:11   ` Maarten Lankhorst
  2014-09-18 13:13     ` Christian König
  2 siblings, 1 reply; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-18 12:11 UTC (permalink / raw)
  To: dri-devel, Christian König

drm/radeon: export reservation_object from dmabuf to ttm

Adds an extra argument to radeon_bo_create, which is only used in radeon_prime.c.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
v2:
robj -> resv
fix typo in commit description

diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 1440b6e9281e..1f8484284b47 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -4690,7 +4690,7 @@ static int cik_mec_init(struct radeon_device *rdev)
 		r = radeon_bo_create(rdev,
 				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
 				     PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
 				     &rdev->mec.hpd_eop_obj);
 		if (r) {
 			dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
@@ -4861,7 +4861,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
 					     sizeof(struct bonaire_mqd),
 					     PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_GTT, 0, NULL,
-					     &rdev->ring[idx].mqd_obj);
+					     NULL, &rdev->ring[idx].mqd_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
 				return r;
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index dbca60c7d097..c6ccef6c3596 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -4023,7 +4023,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
 		if (rdev->rlc.save_restore_obj == NULL) {
 			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.save_restore_obj);
+					     NULL, &rdev->rlc.save_restore_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
 				return r;
@@ -4102,7 +4102,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
 		if (rdev->rlc.clear_state_obj == NULL) {
 			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.clear_state_obj);
+					     NULL, &rdev->rlc.clear_state_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
 				sumo_rlc_fini(rdev);
@@ -4179,7 +4179,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
 			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
 					     PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.cp_table_obj);
+					     NULL, &rdev->rlc.cp_table_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
 				sumo_rlc_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 35c22ee9bc4a..a82eaa81cd07 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1430,7 +1430,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev)
 	if (rdev->vram_scratch.robj == NULL) {
 		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
 				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-				     0, NULL, &rdev->vram_scratch.robj);
+				     0, NULL, NULL, &rdev->vram_scratch.robj);
 		if (r) {
 			return r;
 		}
@@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)
 		r = radeon_bo_create(rdev, rdev->ih.ring_size,
 				     PAGE_SIZE, true,
 				     RADEON_GEM_DOMAIN_GTT, 0,
-				     NULL, &rdev->ih.ring_obj);
+				     NULL, NULL, &rdev->ih.ring_obj);
 		if (r) {
 			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
 			return r;
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
index 1e8855060fc7..9e7f23dd14bd 100644
--- a/drivers/gpu/drm/radeon/radeon_benchmark.c
+++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
@@ -93,7 +93,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 	int time;
 
 	n = RADEON_BENCHMARK_ITERATIONS;
-	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
+	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);
 	if (r) {
 		goto out_cleanup;
 	}
@@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 	if (r) {
 		goto out_cleanup;
 	}
-	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
+	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);
 	if (r) {
 		goto out_cleanup;
 	}
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index e84a76e6656a..6fbab1582112 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -430,7 +430,7 @@ int radeon_wb_init(struct radeon_device *rdev)
 
 	if (rdev->wb.wb_obj == NULL) {
 		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
 				     &rdev->wb.wb_obj);
 		if (r) {
 			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index a053a0779aac..84146d5901aa 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
 	if (rdev->gart.robj == NULL) {
 		r = radeon_bo_create(rdev, rdev->gart.table_size,
 				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-				     0, NULL, &rdev->gart.robj);
+				     0, NULL, NULL, &rdev->gart.robj);
 		if (r) {
 			return r;
 		}
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 4b7c8ec36c2f..c194497aa586 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
 
 retry:
 	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
-			     flags, NULL, &robj);
+			     flags, NULL, NULL, &robj);
 	if (r) {
 		if (r != -ERESTARTSYS) {
 			if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 0e82f0223fd4..99a960a4f302 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -167,8 +167,10 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
 }
 
 int radeon_bo_create(struct radeon_device *rdev,
-		     unsigned long size, int byte_align, bool kernel, u32 domain,
-		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
+		     unsigned long size, int byte_align, bool kernel,
+		     u32 domain, u32 flags, struct sg_table *sg,
+		     struct reservation_object *resv,
+		     struct radeon_bo **bo_ptr)
 {
 	struct radeon_bo *bo;
 	enum ttm_bo_type type;
@@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev,
 	down_read(&rdev->pm.mclk_lock);
 	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
 			&bo->placement, page_align, !kernel, NULL,
-			acc_size, sg, NULL, &radeon_ttm_bo_destroy);
+			acc_size, sg, resv, &radeon_ttm_bo_destroy);
 	up_read(&rdev->pm.mclk_lock);
 	if (unlikely(r != 0)) {
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 98a47fdf3625..1b8ec7917154 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -126,6 +126,7 @@ extern int radeon_bo_create(struct radeon_device *rdev,
 			    unsigned long size, int byte_align,
 			    bool kernel, u32 domain, u32 flags,
 			    struct sg_table *sg,
+			    struct reservation_object *resv,
 			    struct radeon_bo **bo_ptr);
 extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
 extern void radeon_bo_kunmap(struct radeon_bo *bo);
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
index 171daf7fc483..f3609c97496b 100644
--- a/drivers/gpu/drm/radeon/radeon_prime.c
+++ b/drivers/gpu/drm/radeon/radeon_prime.c
@@ -61,12 +61,15 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
 							struct dma_buf_attachment *attach,
 							struct sg_table *sg)
 {
+	struct reservation_object *resv = attach->dmabuf->resv;
 	struct radeon_device *rdev = dev->dev_private;
 	struct radeon_bo *bo;
 	int ret;
 
+	ww_mutex_lock(&resv->lock, NULL);
 	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
-			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
+			       RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo);
+	ww_mutex_unlock(&resv->lock);
 	if (ret)
 		return ERR_PTR(ret);
 
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 6f2a9bd6bb54..3d17af34afa7 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -383,7 +383,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
 	/* Allocate ring buffer */
 	if (ring->ring_obj == NULL) {
 		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
 				     NULL, &ring->ring_obj);
 		if (r) {
 			dev_err(rdev->dev, "(%d) ring create failed\n", r);
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
index b84f97c8718c..c507896aca45 100644
--- a/drivers/gpu/drm/radeon/radeon_sa.c
+++ b/drivers/gpu/drm/radeon/radeon_sa.c
@@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
 	}
 
 	r = radeon_bo_create(rdev, size, align, true,
-			     domain, flags, NULL, &sa_manager->bo);
+			     domain, flags, NULL, NULL, &sa_manager->bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index ce943e1a5e51..07b506b41008 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -67,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
 	}
 
 	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-			     0, NULL, &vram_obj);
+			     0, NULL, NULL, &vram_obj);
 	if (r) {
 		DRM_ERROR("Failed to create VRAM object\n");
 		goto out_cleanup;
@@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
 		struct radeon_fence *fence = NULL;
 
 		r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
+				     gtt_obj + i);
 		if (r) {
 			DRM_ERROR("Failed to create GTT object %d\n", i);
 			goto out_lclean;
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index eca2ce60d440..747307ec46da 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -858,7 +858,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
 	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
 
 	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0,
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
 			     NULL, &rdev->stollen_vga_memory);
 	if (r) {
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index ba4f38916026..11b662469253 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -141,7 +141,8 @@ int radeon_uvd_init(struct radeon_device *rdev)
 		  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
 		  RADEON_GPU_PAGE_SIZE;
 	r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
+			     NULL, &rdev->uvd.vcpu_bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
index c7190aadbd89..9e85757d5599 100644
--- a/drivers/gpu/drm/radeon/radeon_vce.c
+++ b/drivers/gpu/drm/radeon/radeon_vce.c
@@ -126,7 +126,8 @@ int radeon_vce_init(struct radeon_device *rdev)
 	size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
 	       RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
 	r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL,
+			     &rdev->vce.vcpu_bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index f6e76c18d7eb..683062576a8d 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -548,7 +548,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 
 		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
 				     RADEON_GPU_PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
+				     RADEON_GEM_DOMAIN_VRAM, 0,
+				     NULL, NULL, &pt);
 		if (r)
 			return r;
 
@@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
 
 	r = radeon_bo_create(rdev, pd_size, align, true,
 			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-			     &vm->page_directory);
+			     NULL, &vm->page_directory);
 	if (r)
 		return r;

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

* Re: [PATCH v2 7/8] drm/radeon: export reservation_object from dmabuf to ttm
  2014-09-18 12:11   ` [PATCH v2 " Maarten Lankhorst
@ 2014-09-18 13:13     ` Christian König
  0 siblings, 0 replies; 24+ messages in thread
From: Christian König @ 2014-09-18 13:13 UTC (permalink / raw)
  To: Maarten Lankhorst, dri-devel

Am 18.09.2014 um 14:11 schrieb Maarten Lankhorst:
> drm/radeon: export reservation_object from dmabuf to ttm
>
> Adds an extra argument to radeon_bo_create, which is only used in radeon_prime.c.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>

Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
> v2:
> robj -> resv
> fix typo in commit description
>
> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
> index 1440b6e9281e..1f8484284b47 100644
> --- a/drivers/gpu/drm/radeon/cik.c
> +++ b/drivers/gpu/drm/radeon/cik.c
> @@ -4690,7 +4690,7 @@ static int cik_mec_init(struct radeon_device *rdev)
>   		r = radeon_bo_create(rdev,
>   				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
>   				     PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
>   				     &rdev->mec.hpd_eop_obj);
>   		if (r) {
>   			dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
> @@ -4861,7 +4861,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
>   					     sizeof(struct bonaire_mqd),
>   					     PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> -					     &rdev->ring[idx].mqd_obj);
> +					     NULL, &rdev->ring[idx].mqd_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
>   				return r;
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index dbca60c7d097..c6ccef6c3596 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -4023,7 +4023,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   		if (rdev->rlc.save_restore_obj == NULL) {
>   			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.save_restore_obj);
> +					     NULL, &rdev->rlc.save_restore_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
>   				return r;
> @@ -4102,7 +4102,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   		if (rdev->rlc.clear_state_obj == NULL) {
>   			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.clear_state_obj);
> +					     NULL, &rdev->rlc.clear_state_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
>   				sumo_rlc_fini(rdev);
> @@ -4179,7 +4179,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
>   					     PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.cp_table_obj);
> +					     NULL, &rdev->rlc.cp_table_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
>   				sumo_rlc_fini(rdev);
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 35c22ee9bc4a..a82eaa81cd07 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -1430,7 +1430,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev)
>   	if (rdev->vram_scratch.robj == NULL) {
>   		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
>   				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -				     0, NULL, &rdev->vram_scratch.robj);
> +				     0, NULL, NULL, &rdev->vram_scratch.robj);
>   		if (r) {
>   			return r;
>   		}
> @@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)
>   		r = radeon_bo_create(rdev, rdev->ih.ring_size,
>   				     PAGE_SIZE, true,
>   				     RADEON_GEM_DOMAIN_GTT, 0,
> -				     NULL, &rdev->ih.ring_obj);
> +				     NULL, NULL, &rdev->ih.ring_obj);
>   		if (r) {
>   			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
>   			return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
> index 1e8855060fc7..9e7f23dd14bd 100644
> --- a/drivers/gpu/drm/radeon/radeon_benchmark.c
> +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
> @@ -93,7 +93,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   	int time;
>   
>   	n = RADEON_BENCHMARK_ITERATIONS;
> -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
> +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);
>   	if (r) {
>   		goto out_cleanup;
>   	}
> @@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   	if (r) {
>   		goto out_cleanup;
>   	}
> -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
> +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);
>   	if (r) {
>   		goto out_cleanup;
>   	}
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index e84a76e6656a..6fbab1582112 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -430,7 +430,7 @@ int radeon_wb_init(struct radeon_device *rdev)
>   
>   	if (rdev->wb.wb_obj == NULL) {
>   		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
>   				     &rdev->wb.wb_obj);
>   		if (r) {
>   			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
> diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
> index a053a0779aac..84146d5901aa 100644
> --- a/drivers/gpu/drm/radeon/radeon_gart.c
> +++ b/drivers/gpu/drm/radeon/radeon_gart.c
> @@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
>   	if (rdev->gart.robj == NULL) {
>   		r = radeon_bo_create(rdev, rdev->gart.table_size,
>   				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -				     0, NULL, &rdev->gart.robj);
> +				     0, NULL, NULL, &rdev->gart.robj);
>   		if (r) {
>   			return r;
>   		}
> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
> index 4b7c8ec36c2f..c194497aa586 100644
> --- a/drivers/gpu/drm/radeon/radeon_gem.c
> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
> @@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
>   
>   retry:
>   	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
> -			     flags, NULL, &robj);
> +			     flags, NULL, NULL, &robj);
>   	if (r) {
>   		if (r != -ERESTARTSYS) {
>   			if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 0e82f0223fd4..99a960a4f302 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -167,8 +167,10 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>   }
>   
>   int radeon_bo_create(struct radeon_device *rdev,
> -		     unsigned long size, int byte_align, bool kernel, u32 domain,
> -		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
> +		     unsigned long size, int byte_align, bool kernel,
> +		     u32 domain, u32 flags, struct sg_table *sg,
> +		     struct reservation_object *resv,
> +		     struct radeon_bo **bo_ptr)
>   {
>   	struct radeon_bo *bo;
>   	enum ttm_bo_type type;
> @@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev,
>   	down_read(&rdev->pm.mclk_lock);
>   	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
>   			&bo->placement, page_align, !kernel, NULL,
> -			acc_size, sg, NULL, &radeon_ttm_bo_destroy);
> +			acc_size, sg, resv, &radeon_ttm_bo_destroy);
>   	up_read(&rdev->pm.mclk_lock);
>   	if (unlikely(r != 0)) {
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
> index 98a47fdf3625..1b8ec7917154 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.h
> +++ b/drivers/gpu/drm/radeon/radeon_object.h
> @@ -126,6 +126,7 @@ extern int radeon_bo_create(struct radeon_device *rdev,
>   			    unsigned long size, int byte_align,
>   			    bool kernel, u32 domain, u32 flags,
>   			    struct sg_table *sg,
> +			    struct reservation_object *resv,
>   			    struct radeon_bo **bo_ptr);
>   extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
>   extern void radeon_bo_kunmap(struct radeon_bo *bo);
> diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
> index 171daf7fc483..f3609c97496b 100644
> --- a/drivers/gpu/drm/radeon/radeon_prime.c
> +++ b/drivers/gpu/drm/radeon/radeon_prime.c
> @@ -61,12 +61,15 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
>   							struct dma_buf_attachment *attach,
>   							struct sg_table *sg)
>   {
> +	struct reservation_object *resv = attach->dmabuf->resv;
>   	struct radeon_device *rdev = dev->dev_private;
>   	struct radeon_bo *bo;
>   	int ret;
>   
> +	ww_mutex_lock(&resv->lock, NULL);
>   	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
> -			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
> +			       RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo);
> +	ww_mutex_unlock(&resv->lock);
>   	if (ret)
>   		return ERR_PTR(ret);
>   
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index 6f2a9bd6bb54..3d17af34afa7 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -383,7 +383,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
>   	/* Allocate ring buffer */
>   	if (ring->ring_obj == NULL) {
>   		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
>   				     NULL, &ring->ring_obj);
>   		if (r) {
>   			dev_err(rdev->dev, "(%d) ring create failed\n", r);
> diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
> index b84f97c8718c..c507896aca45 100644
> --- a/drivers/gpu/drm/radeon/radeon_sa.c
> +++ b/drivers/gpu/drm/radeon/radeon_sa.c
> @@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
>   	}
>   
>   	r = radeon_bo_create(rdev, size, align, true,
> -			     domain, flags, NULL, &sa_manager->bo);
> +			     domain, flags, NULL, NULL, &sa_manager->bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
> index ce943e1a5e51..07b506b41008 100644
> --- a/drivers/gpu/drm/radeon/radeon_test.c
> +++ b/drivers/gpu/drm/radeon/radeon_test.c
> @@ -67,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
>   	}
>   
>   	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -			     0, NULL, &vram_obj);
> +			     0, NULL, NULL, &vram_obj);
>   	if (r) {
>   		DRM_ERROR("Failed to create VRAM object\n");
>   		goto out_cleanup;
> @@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
>   		struct radeon_fence *fence = NULL;
>   
>   		r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
> +				     gtt_obj + i);
>   		if (r) {
>   			DRM_ERROR("Failed to create GTT object %d\n", i);
>   			goto out_lclean;
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index eca2ce60d440..747307ec46da 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -858,7 +858,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
>   	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
>   
>   	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0,
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
>   			     NULL, &rdev->stollen_vga_memory);
>   	if (r) {
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
> index ba4f38916026..11b662469253 100644
> --- a/drivers/gpu/drm/radeon/radeon_uvd.c
> +++ b/drivers/gpu/drm/radeon/radeon_uvd.c
> @@ -141,7 +141,8 @@ int radeon_uvd_init(struct radeon_device *rdev)
>   		  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
>   		  RADEON_GPU_PAGE_SIZE;
>   	r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> +			     NULL, &rdev->uvd.vcpu_bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
> index c7190aadbd89..9e85757d5599 100644
> --- a/drivers/gpu/drm/radeon/radeon_vce.c
> +++ b/drivers/gpu/drm/radeon/radeon_vce.c
> @@ -126,7 +126,8 @@ int radeon_vce_init(struct radeon_device *rdev)
>   	size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
>   	       RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
>   	r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL,
> +			     &rdev->vce.vcpu_bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index f6e76c18d7eb..683062576a8d 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -548,7 +548,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   
>   		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
>   				     RADEON_GPU_PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
> +				     RADEON_GEM_DOMAIN_VRAM, 0,
> +				     NULL, NULL, &pt);
>   		if (r)
>   			return r;
>   
> @@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
>   
>   	r = radeon_bo_create(rdev, pd_size, align, true,
>   			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -			     &vm->page_directory);
> +			     NULL, &vm->page_directory);
>   	if (r)
>   		return r;
>   
>

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

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

* Re: [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-18 10:22     ` Maarten Lankhorst
@ 2014-09-19  1:19       ` Michel Dänzer
  0 siblings, 0 replies; 24+ messages in thread
From: Michel Dänzer @ 2014-09-19  1:19 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: dri-devel

On 18.09.2014 19:22, Maarten Lankhorst wrote:
> Op 18-09-14 om 05:26 schreef Michel Dänzer:
>> On 17.09.2014 21:35, Maarten Lankhorst wrote:
>>> diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
>>> index 4d4b0773638a..68311da39c09 100644
>>> --- a/drivers/gpu/drm/radeon/radeon_semaphore.c
>>> +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
>>> @@ -124,27 +124,39 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>>>     *
>>>     * Sync to the fence using this semaphore object
>>>     */
>>> -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
>>> -                struct reservation_object *resv,
>>> -                bool shared)
>>> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
>>> +                   struct radeon_semaphore *sema,
>>> +                   struct reservation_object *resv,
>>> +                   bool shared, bool intr)
>>
>> The callers of this function would be more readable if it took flags instead of the shared and intr bools.
> This does not match the rest of the TTM design. Things like
> ttm_bo_reserve take separate bools, not flags.

So? :)


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer

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

* Re: [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-17 13:09   ` Christian König
@ 2014-09-25  9:52     ` Maarten Lankhorst
  2014-09-25 10:39     ` [PATCH v2 " Maarten Lankhorst
  1 sibling, 0 replies; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-25  9:52 UTC (permalink / raw)
  To: Christian König, dri-devel; +Cc: Michel Dänzer

Op 17-09-14 om 15:09 schreef Christian König:
> Am 17.09.2014 um 14:35 schrieb Maarten Lankhorst:
>> Not the whole world is a radeon! :-)
>>
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
>> ---
>>   drivers/gpu/drm/radeon/cik.c              |  2 +-
>>   drivers/gpu/drm/radeon/cik_sdma.c         |  2 +-
>>   drivers/gpu/drm/radeon/evergreen_dma.c    |  2 +-
>>   drivers/gpu/drm/radeon/r600.c             |  2 +-
>>   drivers/gpu/drm/radeon/r600_dma.c         |  2 +-
>>   drivers/gpu/drm/radeon/radeon.h           |  7 ++++---
>>   drivers/gpu/drm/radeon/radeon_cs.c        | 27 ++++++++++++++++++++-------
>>   drivers/gpu/drm/radeon/radeon_fence.c     |  3 +++
>>   drivers/gpu/drm/radeon/radeon_semaphore.c | 24 ++++++++++++++++++------
>>   drivers/gpu/drm/radeon/radeon_vm.c        |  4 ++--
>>   drivers/gpu/drm/radeon/rv770_dma.c        |  2 +-
>>   drivers/gpu/drm/radeon/si_dma.c           |  2 +-
>>   12 files changed, 54 insertions(+), 25 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
>> index 0d761f73a7fa..1440b6e9281e 100644
>> --- a/drivers/gpu/drm/radeon/cik.c
>> +++ b/drivers/gpu/drm/radeon/cik.c
>> @@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
>>           return ERR_PTR(r);
>>       }
>>   -    radeon_semaphore_sync_resv(sem, resv, false);
>> +    radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>>       radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>         for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
>> index c01a6100c318..315c595418ec 100644
>> --- a/drivers/gpu/drm/radeon/cik_sdma.c
>> +++ b/drivers/gpu/drm/radeon/cik_sdma.c
>> @@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev,
>>           return ERR_PTR(r);
>>       }
>>   -    radeon_semaphore_sync_resv(sem, resv, false);
>> +    radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>>       radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>         for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
>> index 946f37d0b469..5a5686792068 100644
>> --- a/drivers/gpu/drm/radeon/evergreen_dma.c
>> +++ b/drivers/gpu/drm/radeon/evergreen_dma.c
>> @@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev,
>>           return ERR_PTR(r);
>>       }
>>   -    radeon_semaphore_sync_resv(sem, resv, false);
>> +    radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>>       radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>         for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
>> index 25f367ac4637..35c22ee9bc4a 100644
>> --- a/drivers/gpu/drm/radeon/r600.c
>> +++ b/drivers/gpu/drm/radeon/r600.c
>> @@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
>>           return ERR_PTR(r);
>>       }
>>   -    radeon_semaphore_sync_resv(sem, resv, false);
>> +    radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>>       radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>         radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
>> diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
>> index fc54224ce87b..674af8db7a35 100644
>> --- a/drivers/gpu/drm/radeon/r600_dma.c
>> +++ b/drivers/gpu/drm/radeon/r600_dma.c
>> @@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev,
>>           return ERR_PTR(r);
>>       }
>>   -    radeon_semaphore_sync_resv(sem, resv, false);
>> +    radeon_semaphore_sync_resv(rdev, sem, resv, false, false);
>>       radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>         for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
>> index 9aa75c1af4f4..6cdc5e62fe12 100644
>> --- a/drivers/gpu/drm/radeon/radeon.h
>> +++ b/drivers/gpu/drm/radeon/radeon.h
>> @@ -587,9 +587,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
>>                   struct radeon_semaphore *semaphore);
>>   void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>>                    struct radeon_fence *fence);
>> -void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore,
>> -                struct reservation_object *resv,
>> -                bool shared);
>> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
>> +                   struct radeon_semaphore *semaphore,
>> +                   struct reservation_object *resv,
>> +                   bool shared, bool intr);
>>   int radeon_semaphore_sync_rings(struct radeon_device *rdev,
>>                   struct radeon_semaphore *semaphore,
>>                   int waiting_ring);
>> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
>> index f662de41ba49..a4a608c8b1ba 100644
>> --- a/drivers/gpu/drm/radeon/radeon_cs.c
>> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
>> @@ -249,20 +249,21 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
>>       return 0;
>>   }
>>   -static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
>> +static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
>>   {
>> -    int i;
>> +    int i, r = 0;
>>   -    for (i = 0; i < p->nrelocs; i++) {
>> +    for (i = 0; !r && i < p->nrelocs; i++) {
>>           struct reservation_object *resv;
>>             if (!p->relocs[i].robj)
>>               continue;
>>             resv = p->relocs[i].robj->tbo.resv;
>> -        radeon_semaphore_sync_resv(p->ib.semaphore, resv,
>> -                       p->relocs[i].tv.shared);
>> +        r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
>> +                           p->relocs[i].tv.shared, true);
>
> Break on the first error?
It does, see the !r in the loop.

>>       }
>> +    return r;
>>   }
>>     /* XXX: note that this is called from the legacy UMS CS ioctl as well */
>> @@ -472,13 +473,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
>>           return r;
>>       }
>>   +    r = radeon_cs_sync_rings(parser);
>> +    if (r) {
>> +        if (r != -ERESTARTSYS)
>> +            DRM_ERROR("Failed to sync rings: %i\n", r);
>> +        return r;
>> +    }
>> +
>>       if (parser->ring == R600_RING_TYPE_UVD_INDEX)
>>           radeon_uvd_note_usage(rdev);
>>       else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||
>>            (parser->ring == TN_RING_TYPE_VCE2_INDEX))
>>           radeon_vce_note_usage(rdev);
>>   -    radeon_cs_sync_rings(parser);
>>       r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
>>       if (r) {
>>           DRM_ERROR("Failed to schedule IB !\n");
>> @@ -565,7 +572,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
>>       if (r) {
>>           goto out;
>>       }
>> -    radeon_cs_sync_rings(parser);
>> +
>> +    r = radeon_cs_sync_rings(parser);
>> +    if (r) {
>> +        if (r != -ERESTARTSYS)
>> +            DRM_ERROR("Failed to sync rings: %i\n", r);
>> +        goto out;
>> +    }
>>       radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);
>>         if ((rdev->family >= CHIP_TAHITI) &&
>> diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
>> index af9f2d6bd7d0..0262fe2580d2 100644
>> --- a/drivers/gpu/drm/radeon/radeon_fence.c
>> +++ b/drivers/gpu/drm/radeon/radeon_fence.c
>> @@ -541,6 +541,9 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
>>       uint64_t seq[RADEON_NUM_RINGS] = {};
>>       long r;
>>   +    if (unlikely(!to_radeon_fence(&fence->base)))
>> +        return fence_wait(&fence->base, intr);
>> +
>>       seq[fence->ring] = fence->seq;
>>       r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
>>       if (r < 0) {
>> diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
>> index 4d4b0773638a..68311da39c09 100644
>> --- a/drivers/gpu/drm/radeon/radeon_semaphore.c
>> +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
>> @@ -124,27 +124,39 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>>    *
>>    * Sync to the fence using this semaphore object
>>    */
>> -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
>> -                struct reservation_object *resv,
>> -                bool shared)
>> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
>> +                   struct radeon_semaphore *sema,
>> +                   struct reservation_object *resv,
>> +                   bool shared, bool intr)
>>   {
>>       struct reservation_object_list *flist;
>>       struct fence *f;
>> +    struct radeon_fence *fence;
>>       unsigned i;
>> +    int r = 0;
>>         /* always sync to the exclusive fence */
>>       f = reservation_object_get_excl(resv);
>> -    radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
>> +    fence = f ? to_radeon_fence(f) : NULL;
>> +    if (fence && fence->rdev == rdev)
>> +        radeon_semaphore_sync_fence(sema, fence);
>> +    else if (f)
>> +        r = fence_wait(f, intr);
>
> Error handling? If anything goes wrong while waiting on the exclusive fence we would overwrite the error with the result of the shared fences.
The if (!r) fence_wait in the shared fences takes care of that.
>>         flist = reservation_object_get_list(resv);
>>       if (shared || !flist)
>> -        return;
>> +        return r;
>>         for (i = 0; i < flist->shared_count; ++i) {
>>           f = rcu_dereference_protected(flist->shared[i],
>>                             reservation_object_held(resv));
>> -        radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
>> +        fence = to_radeon_fence(f);
>> +        if (fence && fence->rdev == rdev)
>> +            radeon_semaphore_sync_fence(sema, fence);
>> +        else if (!r)
>> +            r = fence_wait(f, intr);
>
> Again break on the first error.
Not all the functions check for errors, so if the wait fails I wanted to sync as much as possible.

But investigating them it looks like the places that don't check for errors are the .blit, .copy and radeon_vm calls,
Those bo's cannot be exported as dma-buf, so I think the resv call can't fail in that case, and I can return immediately if the calls fails after all.
I should be able to drop the intr parameter too for now, because it means the interruptible wait can be the default here.

~Maarten

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

* [PATCH v2 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-17 13:09   ` Christian König
  2014-09-25  9:52     ` Maarten Lankhorst
@ 2014-09-25 10:39     ` Maarten Lankhorst
  2014-10-01  8:57       ` Maarten Lankhorst
  1 sibling, 1 reply; 24+ messages in thread
From: Maarten Lankhorst @ 2014-09-25 10:39 UTC (permalink / raw)
  To: Christian König, dri-devel; +Cc: Michel Dänzer

Not the whole world is a radeon! :-)
    
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
Changes:
- Removed interruptible parameter, only 1 place has a use for it,
  and it's the only place that can hit it.
- Fail faster in radeon_semaphore_sync_resv.
- Make the break on error in radeon_cs.c more explicit.
- Upgrade the unlikely() to a WARN_ON_ONCE() in radeon_fence_wait, with a comment explaining why.

diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 0d761f73a7fa..7bdf80c2603d 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index c01a6100c318..c473c9125295 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
index 946f37d0b469..66bcfadeedd1 100644
--- a/drivers/gpu/drm/radeon/evergreen_dma.c
+++ b/drivers/gpu/drm/radeon/evergreen_dma.c
@@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 25f367ac4637..f8eb519c3286 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
index fc54224ce87b..a49db830a47f 100644
--- a/drivers/gpu/drm/radeon/r600_dma.c
+++ b/drivers/gpu/drm/radeon/r600_dma.c
@@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 864457cd7c98..07aa961bf5ca 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -589,9 +589,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
 				struct radeon_semaphore *semaphore);
 void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
 				 struct radeon_fence *fence);
-void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore,
-				struct reservation_object *resv,
-				bool shared);
+int radeon_semaphore_sync_resv(struct radeon_device *rdev,
+			       struct radeon_semaphore *semaphore,
+			       struct reservation_object *resv,
+			       bool shared);
 int radeon_semaphore_sync_rings(struct radeon_device *rdev,
 				struct radeon_semaphore *semaphore,
 				int waiting_ring);
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index f662de41ba49..1c893447d7cd 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -249,9 +249,9 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
 	return 0;
 }
 
-static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
+static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
 {
-	int i;
+	int i, r = 0;
 
 	for (i = 0; i < p->nrelocs; i++) {
 		struct reservation_object *resv;
@@ -260,9 +260,13 @@ static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
 			continue;
 
 		resv = p->relocs[i].robj->tbo.resv;
-		radeon_semaphore_sync_resv(p->ib.semaphore, resv,
-					   p->relocs[i].tv.shared);
+		r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
+					       p->relocs[i].tv.shared);
+
+		if (r)
+			break;
 	}
+	return r;
 }
 
 /* XXX: note that this is called from the legacy UMS CS ioctl as well */
@@ -472,13 +476,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
 		return r;
 	}
 
+	r = radeon_cs_sync_rings(parser);
+	if (r) {
+		if (r != -ERESTARTSYS)
+			DRM_ERROR("Failed to sync rings: %i\n", r);
+		return r;
+	}
+
 	if (parser->ring == R600_RING_TYPE_UVD_INDEX)
 		radeon_uvd_note_usage(rdev);
 	else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||
 		 (parser->ring == TN_RING_TYPE_VCE2_INDEX))
 		radeon_vce_note_usage(rdev);
 
-	radeon_cs_sync_rings(parser);
 	r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
 	if (r) {
 		DRM_ERROR("Failed to schedule IB !\n");
@@ -565,7 +575,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
 	if (r) {
 		goto out;
 	}
-	radeon_cs_sync_rings(parser);
+
+	r = radeon_cs_sync_rings(parser);
+	if (r) {
+		if (r != -ERESTARTSYS)
+			DRM_ERROR("Failed to sync rings: %i\n", r);
+		goto out;
+	}
 	radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);
 
 	if ((rdev->family >= CHIP_TAHITI) &&
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index af9f2d6bd7d0..995167025282 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -541,6 +541,15 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
 	uint64_t seq[RADEON_NUM_RINGS] = {};
 	long r;
 
+	/*
+	 * This function should not be called on !radeon fences.
+	 * If this is the case, it would mean this function can
+	 * also be called on radeon fences belonging to another card.
+	 * exclusive_lock is not held in that case.
+	 */
+	if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
+		return fence_wait(&fence->base, intr);
+
 	seq[fence->ring] = fence->seq;
 	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
 	if (r < 0) {
diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
index 4d4b0773638a..6deb08f045b7 100644
--- a/drivers/gpu/drm/radeon/radeon_semaphore.c
+++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
@@ -124,27 +124,42 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
  *
  * Sync to the fence using this semaphore object
  */
-void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
-				struct reservation_object *resv,
-				bool shared)
+int radeon_semaphore_sync_resv(struct radeon_device *rdev,
+			       struct radeon_semaphore *sema,
+			       struct reservation_object *resv,
+			       bool shared)
 {
 	struct reservation_object_list *flist;
 	struct fence *f;
+	struct radeon_fence *fence;
 	unsigned i;
+	int r = 0;
 
 	/* always sync to the exclusive fence */
 	f = reservation_object_get_excl(resv);
-	radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
+	fence = f ? to_radeon_fence(f) : NULL;
+	if (fence && fence->rdev == rdev)
+		radeon_semaphore_sync_fence(sema, fence);
+	else if (f)
+		r = fence_wait(f, true);
 
 	flist = reservation_object_get_list(resv);
-	if (shared || !flist)
-		return;
+	if (shared || !flist || r)
+		return r;
 
 	for (i = 0; i < flist->shared_count; ++i) {
 		f = rcu_dereference_protected(flist->shared[i],
 					      reservation_object_held(resv));
-		radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
+		fence = to_radeon_fence(f);
+		if (fence && fence->rdev == rdev)
+			radeon_semaphore_sync_fence(sema, fence);
+		else
+			r = fence_wait(f, true);
+
+		if (r)
+			break;
 	}
+	return r;
 }
 
 /**
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index ce870959dff8..8af1a94e7448 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -698,7 +698,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
 	if (ib.length_dw != 0) {
 		radeon_asic_vm_pad_ib(rdev, &ib);
 
-		radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false);
+		radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false);
 		radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use);
 		WARN_ON(ib.length_dw > ndw);
 		r = radeon_ib_schedule(rdev, &ib, NULL, false);
@@ -825,7 +825,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
 		unsigned nptes;
 		uint64_t pte;
 
-		radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false);
+		radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false);
 
 		if ((addr & ~mask) == (end & ~mask))
 			nptes = end - addr;
diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c
index c112764adfdf..7f34bad2e724 100644
--- a/drivers/gpu/drm/radeon/rv770_dma.c
+++ b/drivers/gpu/drm/radeon/rv770_dma.c
@@ -67,7 +67,7 @@ struct radeon_fence *rv770_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
index 9b0dfbc913f3..b58f12b762d7 100644
--- a/drivers/gpu/drm/radeon/si_dma.c
+++ b/drivers/gpu/drm/radeon/si_dma.c
@@ -252,7 +252,7 @@ struct radeon_fence *si_copy_dma(struct radeon_device *rdev,
 		return ERR_PTR(r);
 	}
 
-	radeon_semaphore_sync_resv(sem, resv, false);
+	radeon_semaphore_sync_resv(rdev, sem, resv, false);
 	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
 
 	for (i = 0; i < num_loops; i++) {

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

* Re: [PATCH v2 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-09-25 10:39     ` [PATCH v2 " Maarten Lankhorst
@ 2014-10-01  8:57       ` Maarten Lankhorst
  2014-10-01  9:04         ` Christian König
  0 siblings, 1 reply; 24+ messages in thread
From: Maarten Lankhorst @ 2014-10-01  8:57 UTC (permalink / raw)
  To: Christian König, dri-devel; +Cc: Michel Dänzer

Op 25-09-14 om 12:39 schreef Maarten Lankhorst:
> Not the whole world is a radeon! :-)
>     
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
> ---
> Changes:
> - Removed interruptible parameter, only 1 place has a use for it,
>   and it's the only place that can hit it.
> - Fail faster in radeon_semaphore_sync_resv.
> - Make the break on error in radeon_cs.c more explicit.
> - Upgrade the unlikely() to a WARN_ON_ONCE() in radeon_fence_wait, with a comment explaining why.
Ping, can you review?
> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
> index 0d761f73a7fa..7bdf80c2603d 100644
> --- a/drivers/gpu/drm/radeon/cik.c
> +++ b/drivers/gpu/drm/radeon/cik.c
> @@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
>  		return ERR_PTR(r);
>  	}
>  
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>  
>  	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
> index c01a6100c318..c473c9125295 100644
> --- a/drivers/gpu/drm/radeon/cik_sdma.c
> +++ b/drivers/gpu/drm/radeon/cik_sdma.c
> @@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev,
>  		return ERR_PTR(r);
>  	}
>  
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>  
>  	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
> index 946f37d0b469..66bcfadeedd1 100644
> --- a/drivers/gpu/drm/radeon/evergreen_dma.c
> +++ b/drivers/gpu/drm/radeon/evergreen_dma.c
> @@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev,
>  		return ERR_PTR(r);
>  	}
>  
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>  
>  	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 25f367ac4637..f8eb519c3286 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
>  		return ERR_PTR(r);
>  	}
>  
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>  
>  	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
> diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
> index fc54224ce87b..a49db830a47f 100644
> --- a/drivers/gpu/drm/radeon/r600_dma.c
> +++ b/drivers/gpu/drm/radeon/r600_dma.c
> @@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev,
>  		return ERR_PTR(r);
>  	}
>  
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>  
>  	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 864457cd7c98..07aa961bf5ca 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -589,9 +589,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
>  				struct radeon_semaphore *semaphore);
>  void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>  				 struct radeon_fence *fence);
> -void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore,
> -				struct reservation_object *resv,
> -				bool shared);
> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
> +			       struct radeon_semaphore *semaphore,
> +			       struct reservation_object *resv,
> +			       bool shared);
>  int radeon_semaphore_sync_rings(struct radeon_device *rdev,
>  				struct radeon_semaphore *semaphore,
>  				int waiting_ring);
> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> index f662de41ba49..1c893447d7cd 100644
> --- a/drivers/gpu/drm/radeon/radeon_cs.c
> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> @@ -249,9 +249,9 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
>  	return 0;
>  }
>  
> -static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
> +static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
>  {
> -	int i;
> +	int i, r = 0;
>  
>  	for (i = 0; i < p->nrelocs; i++) {
>  		struct reservation_object *resv;
> @@ -260,9 +260,13 @@ static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
>  			continue;
>  
>  		resv = p->relocs[i].robj->tbo.resv;
> -		radeon_semaphore_sync_resv(p->ib.semaphore, resv,
> -					   p->relocs[i].tv.shared);
> +		r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
> +					       p->relocs[i].tv.shared);
> +
> +		if (r)
> +			break;
>  	}
> +	return r;
>  }
>  
>  /* XXX: note that this is called from the legacy UMS CS ioctl as well */
> @@ -472,13 +476,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
>  		return r;
>  	}
>  
> +	r = radeon_cs_sync_rings(parser);
> +	if (r) {
> +		if (r != -ERESTARTSYS)
> +			DRM_ERROR("Failed to sync rings: %i\n", r);
> +		return r;
> +	}
> +
>  	if (parser->ring == R600_RING_TYPE_UVD_INDEX)
>  		radeon_uvd_note_usage(rdev);
>  	else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||
>  		 (parser->ring == TN_RING_TYPE_VCE2_INDEX))
>  		radeon_vce_note_usage(rdev);
>  
> -	radeon_cs_sync_rings(parser);
>  	r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
>  	if (r) {
>  		DRM_ERROR("Failed to schedule IB !\n");
> @@ -565,7 +575,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
>  	if (r) {
>  		goto out;
>  	}
> -	radeon_cs_sync_rings(parser);
> +
> +	r = radeon_cs_sync_rings(parser);
> +	if (r) {
> +		if (r != -ERESTARTSYS)
> +			DRM_ERROR("Failed to sync rings: %i\n", r);
> +		goto out;
> +	}
>  	radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);
>  
>  	if ((rdev->family >= CHIP_TAHITI) &&
> diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
> index af9f2d6bd7d0..995167025282 100644
> --- a/drivers/gpu/drm/radeon/radeon_fence.c
> +++ b/drivers/gpu/drm/radeon/radeon_fence.c
> @@ -541,6 +541,15 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
>  	uint64_t seq[RADEON_NUM_RINGS] = {};
>  	long r;
>  
> +	/*
> +	 * This function should not be called on !radeon fences.
> +	 * If this is the case, it would mean this function can
> +	 * also be called on radeon fences belonging to another card.
> +	 * exclusive_lock is not held in that case.
> +	 */
> +	if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
> +		return fence_wait(&fence->base, intr);
> +
>  	seq[fence->ring] = fence->seq;
>  	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
>  	if (r < 0) {
> diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
> index 4d4b0773638a..6deb08f045b7 100644
> --- a/drivers/gpu/drm/radeon/radeon_semaphore.c
> +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
> @@ -124,27 +124,42 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>   *
>   * Sync to the fence using this semaphore object
>   */
> -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
> -				struct reservation_object *resv,
> -				bool shared)
> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
> +			       struct radeon_semaphore *sema,
> +			       struct reservation_object *resv,
> +			       bool shared)
>  {
>  	struct reservation_object_list *flist;
>  	struct fence *f;
> +	struct radeon_fence *fence;
>  	unsigned i;
> +	int r = 0;
>  
>  	/* always sync to the exclusive fence */
>  	f = reservation_object_get_excl(resv);
> -	radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
> +	fence = f ? to_radeon_fence(f) : NULL;
> +	if (fence && fence->rdev == rdev)
> +		radeon_semaphore_sync_fence(sema, fence);
> +	else if (f)
> +		r = fence_wait(f, true);
>  
>  	flist = reservation_object_get_list(resv);
> -	if (shared || !flist)
> -		return;
> +	if (shared || !flist || r)
> +		return r;
>  
>  	for (i = 0; i < flist->shared_count; ++i) {
>  		f = rcu_dereference_protected(flist->shared[i],
>  					      reservation_object_held(resv));
> -		radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
> +		fence = to_radeon_fence(f);
> +		if (fence && fence->rdev == rdev)
> +			radeon_semaphore_sync_fence(sema, fence);
> +		else
> +			r = fence_wait(f, true);
> +
> +		if (r)
> +			break;
>  	}
> +	return r;
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index ce870959dff8..8af1a94e7448 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -698,7 +698,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
>  	if (ib.length_dw != 0) {
>  		radeon_asic_vm_pad_ib(rdev, &ib);
>  
> -		radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false);
> +		radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false);
>  		radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use);
>  		WARN_ON(ib.length_dw > ndw);
>  		r = radeon_ib_schedule(rdev, &ib, NULL, false);
> @@ -825,7 +825,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
>  		unsigned nptes;
>  		uint64_t pte;
>  
> -		radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false);
> +		radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false);
>  
>  		if ((addr & ~mask) == (end & ~mask))
>  			nptes = end - addr;
> diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c
> index c112764adfdf..7f34bad2e724 100644
> --- a/drivers/gpu/drm/radeon/rv770_dma.c
> +++ b/drivers/gpu/drm/radeon/rv770_dma.c
> @@ -67,7 +67,7 @@ struct radeon_fence *rv770_copy_dma(struct radeon_device *rdev,
>  		return ERR_PTR(r);
>  	}
>  
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>  
>  	for (i = 0; i < num_loops; i++) {
> diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
> index 9b0dfbc913f3..b58f12b762d7 100644
> --- a/drivers/gpu/drm/radeon/si_dma.c
> +++ b/drivers/gpu/drm/radeon/si_dma.c
> @@ -252,7 +252,7 @@ struct radeon_fence *si_copy_dma(struct radeon_device *rdev,
>  		return ERR_PTR(r);
>  	}
>  
> -	radeon_semaphore_sync_resv(sem, resv, false);
> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>  
>  	for (i = 0; i < num_loops; i++) {
>

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

* Re: [PATCH v2 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-10-01  8:57       ` Maarten Lankhorst
@ 2014-10-01  9:04         ` Christian König
  2014-10-01  9:22           ` Maarten Lankhorst
  0 siblings, 1 reply; 24+ messages in thread
From: Christian König @ 2014-10-01  9:04 UTC (permalink / raw)
  To: Maarten Lankhorst, dri-devel; +Cc: Michel Dänzer

Am 01.10.2014 um 10:57 schrieb Maarten Lankhorst:
> Op 25-09-14 om 12:39 schreef Maarten Lankhorst:
>> Not the whole world is a radeon! :-)
>>      
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
>> ---
>> Changes:
>> - Removed interruptible parameter, only 1 place has a use for it,
>>    and it's the only place that can hit it.
>> - Fail faster in radeon_semaphore_sync_resv.
>> - Make the break on error in radeon_cs.c more explicit.
>> - Upgrade the unlikely() to a WARN_ON_ONCE() in radeon_fence_wait, with a comment explaining why.
> Ping, can you review?

LGTM, patch is Reviewed-by: Christian König <christian.koenig@amd.com>

But we might want to pull it in through Alex drm-next-3.18 (or -3.19) 
branch to avoid merge conflicts.

Regards,
Christian.

>> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
>> index 0d761f73a7fa..7bdf80c2603d 100644
>> --- a/drivers/gpu/drm/radeon/cik.c
>> +++ b/drivers/gpu/drm/radeon/cik.c
>> @@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev,
>>   		return ERR_PTR(r);
>>   	}
>>   
>> -	radeon_semaphore_sync_resv(sem, resv, false);
>> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>   
>>   	for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
>> index c01a6100c318..c473c9125295 100644
>> --- a/drivers/gpu/drm/radeon/cik_sdma.c
>> +++ b/drivers/gpu/drm/radeon/cik_sdma.c
>> @@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev,
>>   		return ERR_PTR(r);
>>   	}
>>   
>> -	radeon_semaphore_sync_resv(sem, resv, false);
>> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>   
>>   	for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
>> index 946f37d0b469..66bcfadeedd1 100644
>> --- a/drivers/gpu/drm/radeon/evergreen_dma.c
>> +++ b/drivers/gpu/drm/radeon/evergreen_dma.c
>> @@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev,
>>   		return ERR_PTR(r);
>>   	}
>>   
>> -	radeon_semaphore_sync_resv(sem, resv, false);
>> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>   
>>   	for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
>> index 25f367ac4637..f8eb519c3286 100644
>> --- a/drivers/gpu/drm/radeon/r600.c
>> +++ b/drivers/gpu/drm/radeon/r600.c
>> @@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
>>   		return ERR_PTR(r);
>>   	}
>>   
>> -	radeon_semaphore_sync_resv(sem, resv, false);
>> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>   
>>   	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
>> diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
>> index fc54224ce87b..a49db830a47f 100644
>> --- a/drivers/gpu/drm/radeon/r600_dma.c
>> +++ b/drivers/gpu/drm/radeon/r600_dma.c
>> @@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev,
>>   		return ERR_PTR(r);
>>   	}
>>   
>> -	radeon_semaphore_sync_resv(sem, resv, false);
>> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>   
>>   	for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
>> index 864457cd7c98..07aa961bf5ca 100644
>> --- a/drivers/gpu/drm/radeon/radeon.h
>> +++ b/drivers/gpu/drm/radeon/radeon.h
>> @@ -589,9 +589,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
>>   				struct radeon_semaphore *semaphore);
>>   void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>>   				 struct radeon_fence *fence);
>> -void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore,
>> -				struct reservation_object *resv,
>> -				bool shared);
>> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
>> +			       struct radeon_semaphore *semaphore,
>> +			       struct reservation_object *resv,
>> +			       bool shared);
>>   int radeon_semaphore_sync_rings(struct radeon_device *rdev,
>>   				struct radeon_semaphore *semaphore,
>>   				int waiting_ring);
>> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
>> index f662de41ba49..1c893447d7cd 100644
>> --- a/drivers/gpu/drm/radeon/radeon_cs.c
>> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
>> @@ -249,9 +249,9 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
>>   	return 0;
>>   }
>>   
>> -static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
>> +static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
>>   {
>> -	int i;
>> +	int i, r = 0;
>>   
>>   	for (i = 0; i < p->nrelocs; i++) {
>>   		struct reservation_object *resv;
>> @@ -260,9 +260,13 @@ static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
>>   			continue;
>>   
>>   		resv = p->relocs[i].robj->tbo.resv;
>> -		radeon_semaphore_sync_resv(p->ib.semaphore, resv,
>> -					   p->relocs[i].tv.shared);
>> +		r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv,
>> +					       p->relocs[i].tv.shared);
>> +
>> +		if (r)
>> +			break;
>>   	}
>> +	return r;
>>   }
>>   
>>   /* XXX: note that this is called from the legacy UMS CS ioctl as well */
>> @@ -472,13 +476,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
>>   		return r;
>>   	}
>>   
>> +	r = radeon_cs_sync_rings(parser);
>> +	if (r) {
>> +		if (r != -ERESTARTSYS)
>> +			DRM_ERROR("Failed to sync rings: %i\n", r);
>> +		return r;
>> +	}
>> +
>>   	if (parser->ring == R600_RING_TYPE_UVD_INDEX)
>>   		radeon_uvd_note_usage(rdev);
>>   	else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||
>>   		 (parser->ring == TN_RING_TYPE_VCE2_INDEX))
>>   		radeon_vce_note_usage(rdev);
>>   
>> -	radeon_cs_sync_rings(parser);
>>   	r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);
>>   	if (r) {
>>   		DRM_ERROR("Failed to schedule IB !\n");
>> @@ -565,7 +575,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
>>   	if (r) {
>>   		goto out;
>>   	}
>> -	radeon_cs_sync_rings(parser);
>> +
>> +	r = radeon_cs_sync_rings(parser);
>> +	if (r) {
>> +		if (r != -ERESTARTSYS)
>> +			DRM_ERROR("Failed to sync rings: %i\n", r);
>> +		goto out;
>> +	}
>>   	radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);
>>   
>>   	if ((rdev->family >= CHIP_TAHITI) &&
>> diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
>> index af9f2d6bd7d0..995167025282 100644
>> --- a/drivers/gpu/drm/radeon/radeon_fence.c
>> +++ b/drivers/gpu/drm/radeon/radeon_fence.c
>> @@ -541,6 +541,15 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
>>   	uint64_t seq[RADEON_NUM_RINGS] = {};
>>   	long r;
>>   
>> +	/*
>> +	 * This function should not be called on !radeon fences.
>> +	 * If this is the case, it would mean this function can
>> +	 * also be called on radeon fences belonging to another card.
>> +	 * exclusive_lock is not held in that case.
>> +	 */
>> +	if (WARN_ON_ONCE(!to_radeon_fence(&fence->base)))
>> +		return fence_wait(&fence->base, intr);
>> +
>>   	seq[fence->ring] = fence->seq;
>>   	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);
>>   	if (r < 0) {
>> diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c
>> index 4d4b0773638a..6deb08f045b7 100644
>> --- a/drivers/gpu/drm/radeon/radeon_semaphore.c
>> +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c
>> @@ -124,27 +124,42 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,
>>    *
>>    * Sync to the fence using this semaphore object
>>    */
>> -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema,
>> -				struct reservation_object *resv,
>> -				bool shared)
>> +int radeon_semaphore_sync_resv(struct radeon_device *rdev,
>> +			       struct radeon_semaphore *sema,
>> +			       struct reservation_object *resv,
>> +			       bool shared)
>>   {
>>   	struct reservation_object_list *flist;
>>   	struct fence *f;
>> +	struct radeon_fence *fence;
>>   	unsigned i;
>> +	int r = 0;
>>   
>>   	/* always sync to the exclusive fence */
>>   	f = reservation_object_get_excl(resv);
>> -	radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
>> +	fence = f ? to_radeon_fence(f) : NULL;
>> +	if (fence && fence->rdev == rdev)
>> +		radeon_semaphore_sync_fence(sema, fence);
>> +	else if (f)
>> +		r = fence_wait(f, true);
>>   
>>   	flist = reservation_object_get_list(resv);
>> -	if (shared || !flist)
>> -		return;
>> +	if (shared || !flist || r)
>> +		return r;
>>   
>>   	for (i = 0; i < flist->shared_count; ++i) {
>>   		f = rcu_dereference_protected(flist->shared[i],
>>   					      reservation_object_held(resv));
>> -		radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f);
>> +		fence = to_radeon_fence(f);
>> +		if (fence && fence->rdev == rdev)
>> +			radeon_semaphore_sync_fence(sema, fence);
>> +		else
>> +			r = fence_wait(f, true);
>> +
>> +		if (r)
>> +			break;
>>   	}
>> +	return r;
>>   }
>>   
>>   /**
>> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
>> index ce870959dff8..8af1a94e7448 100644
>> --- a/drivers/gpu/drm/radeon/radeon_vm.c
>> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
>> @@ -698,7 +698,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
>>   	if (ib.length_dw != 0) {
>>   		radeon_asic_vm_pad_ib(rdev, &ib);
>>   
>> -		radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false);
>> +		radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false);
>>   		radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use);
>>   		WARN_ON(ib.length_dw > ndw);
>>   		r = radeon_ib_schedule(rdev, &ib, NULL, false);
>> @@ -825,7 +825,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
>>   		unsigned nptes;
>>   		uint64_t pte;
>>   
>> -		radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false);
>> +		radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false);
>>   
>>   		if ((addr & ~mask) == (end & ~mask))
>>   			nptes = end - addr;
>> diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c
>> index c112764adfdf..7f34bad2e724 100644
>> --- a/drivers/gpu/drm/radeon/rv770_dma.c
>> +++ b/drivers/gpu/drm/radeon/rv770_dma.c
>> @@ -67,7 +67,7 @@ struct radeon_fence *rv770_copy_dma(struct radeon_device *rdev,
>>   		return ERR_PTR(r);
>>   	}
>>   
>> -	radeon_semaphore_sync_resv(sem, resv, false);
>> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>   
>>   	for (i = 0; i < num_loops; i++) {
>> diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
>> index 9b0dfbc913f3..b58f12b762d7 100644
>> --- a/drivers/gpu/drm/radeon/si_dma.c
>> +++ b/drivers/gpu/drm/radeon/si_dma.c
>> @@ -252,7 +252,7 @@ struct radeon_fence *si_copy_dma(struct radeon_device *rdev,
>>   		return ERR_PTR(r);
>>   	}
>>   
>> -	radeon_semaphore_sync_resv(sem, resv, false);
>> +	radeon_semaphore_sync_resv(rdev, sem, resv, false);
>>   	radeon_semaphore_sync_rings(rdev, sem, ring->idx);
>>   
>>   	for (i = 0; i < num_loops; i++) {
>>

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

* Re: [PATCH v2 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-10-01  9:04         ` Christian König
@ 2014-10-01  9:22           ` Maarten Lankhorst
  2014-10-01 12:26             ` Alex Deucher
  0 siblings, 1 reply; 24+ messages in thread
From: Maarten Lankhorst @ 2014-10-01  9:22 UTC (permalink / raw)
  To: Christian König, dri-devel; +Cc: Deucher, Alexander, Michel Dänzer

Hey,

Op 01-10-14 om 11:04 schreef Christian König:
> Am 01.10.2014 um 10:57 schrieb Maarten Lankhorst:
>> Op 25-09-14 om 12:39 schreef Maarten Lankhorst:
>>> Not the whole world is a radeon! :-)
>>>      Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
>>> ---
>>> Changes:
>>> - Removed interruptible parameter, only 1 place has a use for it,
>>>    and it's the only place that can hit it.
>>> - Fail faster in radeon_semaphore_sync_resv.
>>> - Make the break on error in radeon_cs.c more explicit.
>>> - Upgrade the unlikely() to a WARN_ON_ONCE() in radeon_fence_wait, with a comment explaining why.
>> Ping, can you review?
>
> LGTM, patch is Reviewed-by: Christian König <christian.koenig@amd.com>
>
> But we might want to pull it in through Alex drm-next-3.18 (or -3.19) branch to avoid merge conflicts.
I can push nouveau through my own tree and once the patches are merged get the radeon changes through agd5f's tree?

~Maarten

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

* Re: [PATCH v2 6/8] drm/radeon: cope with foreign fences inside the reservation object
  2014-10-01  9:22           ` Maarten Lankhorst
@ 2014-10-01 12:26             ` Alex Deucher
  0 siblings, 0 replies; 24+ messages in thread
From: Alex Deucher @ 2014-10-01 12:26 UTC (permalink / raw)
  To: Maarten Lankhorst
  Cc: Deucher, Alexander, Michel Dänzer, Maling list - DRI developers

On Wed, Oct 1, 2014 at 5:22 AM, Maarten Lankhorst
<maarten.lankhorst@canonical.com> wrote:
> Hey,
>
> Op 01-10-14 om 11:04 schreef Christian König:
>> Am 01.10.2014 um 10:57 schrieb Maarten Lankhorst:
>>> Op 25-09-14 om 12:39 schreef Maarten Lankhorst:
>>>> Not the whole world is a radeon! :-)
>>>>      Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
>>>> ---
>>>> Changes:
>>>> - Removed interruptible parameter, only 1 place has a use for it,
>>>>    and it's the only place that can hit it.
>>>> - Fail faster in radeon_semaphore_sync_resv.
>>>> - Make the break on error in radeon_cs.c more explicit.
>>>> - Upgrade the unlikely() to a WARN_ON_ONCE() in radeon_fence_wait, with a comment explaining why.
>>> Ping, can you review?
>>
>> LGTM, patch is Reviewed-by: Christian König <christian.koenig@amd.com>
>>
>> But we might want to pull it in through Alex drm-next-3.18 (or -3.19) branch to avoid merge conflicts.
> I can push nouveau through my own tree and once the patches are merged get the radeon changes through agd5f's tree?

Either way works for me.  Are we trying to get this in for 3.18 or 3.19?

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

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

end of thread, other threads:[~2014-10-01 12:26 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-17 12:34 [PATCH 00/10] drm fence fixes and cross-dev sync Maarten Lankhorst
2014-09-17 12:34 ` [PATCH 1/8] drm/nouveau: bump driver patchlevel to 1.2.1 Maarten Lankhorst
2014-09-17 12:34 ` [PATCH 2/8] drm/nouveau: specify if interruptible wait is desired in nouveau_fence_sync Maarten Lankhorst
2014-09-17 12:35 ` [PATCH 3/8] drm: Pass dma-buf as argument to gem_prime_import_sg_table Maarten Lankhorst
2014-09-17 12:35 ` [PATCH 4/8] drm/ttm: add reservation_object as argument to ttm_bo_init Maarten Lankhorst
2014-09-17 12:35 ` [PATCH 5/8] drm/radeon: cope with foreign fences inside display Maarten Lankhorst
2014-09-17 13:16   ` Christian König
2014-09-17 12:35 ` [PATCH 6/8] drm/radeon: cope with foreign fences inside the reservation object Maarten Lankhorst
2014-09-17 13:09   ` Christian König
2014-09-25  9:52     ` Maarten Lankhorst
2014-09-25 10:39     ` [PATCH v2 " Maarten Lankhorst
2014-10-01  8:57       ` Maarten Lankhorst
2014-10-01  9:04         ` Christian König
2014-10-01  9:22           ` Maarten Lankhorst
2014-10-01 12:26             ` Alex Deucher
2014-09-18  3:26   ` [PATCH " Michel Dänzer
2014-09-18 10:22     ` Maarten Lankhorst
2014-09-19  1:19       ` Michel Dänzer
2014-09-17 12:35 ` [PATCH 7/8] drm/radeon: export reservation_object from dmabuf to ttm Maarten Lankhorst
2014-09-17 13:14   ` Christian König
2014-09-18  3:22   ` Michel Dänzer
2014-09-18 12:11   ` [PATCH v2 " Maarten Lankhorst
2014-09-18 13:13     ` Christian König
2014-09-17 12:35 ` [PATCH 8/8] drm/nouveau: " Maarten Lankhorst

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.