dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc
@ 2014-11-27 13:48 Christian König
  2014-11-27 13:48 ` [PATCH 2/7] drm/radeon: drop the handle " Christian König
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Christian König @ 2014-11-27 13:48 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

From: Christian König <christian.koenig@amd.com>

It's only used once after initializing and that
ptr can be calculated from the BO as well.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon.h    |  1 -
 drivers/gpu/drm/radeon/radeon_cs.c | 15 +++++++++------
 drivers/gpu/drm/radeon/radeon_vm.c |  2 --
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 3207bb6..4a09ffd 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1045,7 +1045,6 @@ void cayman_dma_fini(struct radeon_device *rdev);
  * CS.
  */
 struct radeon_cs_reloc {
-	struct drm_gem_object		*gobj;
 	struct radeon_bo		*robj;
 	struct ttm_validate_buffer	tv;
 	uint64_t			gpu_offset;
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index f5e0a69..7846c3e 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -101,6 +101,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 
 	for (i = 0; i < p->nrelocs; i++) {
 		struct drm_radeon_cs_reloc *r;
+		struct drm_gem_object *gobj;
 		unsigned priority;
 
 		duplicate = false;
@@ -117,15 +118,14 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 			continue;
 		}
 
-		p->relocs[i].gobj = drm_gem_object_lookup(ddev, p->filp,
-							  r->handle);
-		if (p->relocs[i].gobj == NULL) {
+		gobj = drm_gem_object_lookup(ddev, p->filp, r->handle);
+		if (gobj == NULL) {
 			DRM_ERROR("gem object lookup failed 0x%x\n",
 				  r->handle);
 			return -ENOENT;
 		}
 		p->relocs_ptr[i] = &p->relocs[i];
-		p->relocs[i].robj = gem_to_radeon_bo(p->relocs[i].gobj);
+		p->relocs[i].robj = gem_to_radeon_bo(gobj);
 
 		/* The userspace buffer priorities are from 0 to 15. A higher
 		 * number means the buffer is more important.
@@ -439,8 +439,11 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo
 
 	if (parser->relocs != NULL) {
 		for (i = 0; i < parser->nrelocs; i++) {
-			if (parser->relocs[i].gobj)
-				drm_gem_object_unreference_unlocked(parser->relocs[i].gobj);
+			struct radeon_bo *bo = parser->relocs[i].robj;
+			if (bo == NULL)
+				continue;
+
+			drm_gem_object_unreference_unlocked(&bo->gem_base);
 		}
 	}
 	kfree(parser->track);
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 0b10f3a..2b2eb1c 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -138,7 +138,6 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
 		return NULL;
 
 	/* add the vm page table to the list */
-	list[0].gobj = NULL;
 	list[0].robj = vm->page_directory;
 	list[0].prefered_domains = RADEON_GEM_DOMAIN_VRAM;
 	list[0].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
@@ -152,7 +151,6 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
 		if (!vm->page_tables[i].bo)
 			continue;
 
-		list[idx].gobj = NULL;
 		list[idx].robj = vm->page_tables[i].bo;
 		list[idx].prefered_domains = RADEON_GEM_DOMAIN_VRAM;
 		list[idx].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
-- 
1.9.1

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

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

* [PATCH 2/7] drm/radeon: drop the handle from radeon_cs_reloc
  2014-11-27 13:48 [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc Christian König
@ 2014-11-27 13:48 ` Christian König
  2014-11-27 13:48 ` [PATCH 3/7] drm/radeon: rename radeon_cs_reloc to radeon_bo_list Christian König
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2014-11-27 13:48 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

From: Christian König <christian.koenig@amd.com>

It's only used for duplicate check and that
can be done on the original as well.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon.h    | 1 -
 drivers/gpu/drm/radeon/radeon_cs.c | 6 +++---
 drivers/gpu/drm/radeon/radeon_vm.c | 2 --
 3 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 4a09ffd..17db846 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1051,7 +1051,6 @@ struct radeon_cs_reloc {
 	unsigned			prefered_domains;
 	unsigned			allowed_domains;
 	uint32_t			tiling_flags;
-	uint32_t			handle;
 };
 
 struct radeon_cs_chunk {
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 7846c3e..f1f584a 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -107,14 +107,15 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 		duplicate = false;
 		r = (struct drm_radeon_cs_reloc *)&chunk->kdata[i*4];
 		for (j = 0; j < i; j++) {
-			if (r->handle == p->relocs[j].handle) {
+			struct drm_radeon_cs_reloc *other;
+			other = (void *)&chunk->kdata[j*4];
+			if (r->handle == other->handle) {
 				p->relocs_ptr[i] = &p->relocs[j];
 				duplicate = true;
 				break;
 			}
 		}
 		if (duplicate) {
-			p->relocs[i].handle = 0;
 			continue;
 		}
 
@@ -184,7 +185,6 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 
 		p->relocs[i].tv.bo = &p->relocs[i].robj->tbo;
 		p->relocs[i].tv.shared = !r->write_domain;
-		p->relocs[i].handle = r->handle;
 
 		radeon_cs_buckets_add(&buckets, &p->relocs[i].tv.head,
 				      priority);
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 2b2eb1c..c4ffe02 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -144,7 +144,6 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
 	list[0].tv.bo = &vm->page_directory->tbo;
 	list[0].tv.shared = true;
 	list[0].tiling_flags = 0;
-	list[0].handle = 0;
 	list_add(&list[0].tv.head, head);
 
 	for (i = 0, idx = 1; i <= vm->max_pde_used; i++) {
@@ -157,7 +156,6 @@ struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
 		list[idx].tv.bo = &list[idx].robj->tbo;
 		list[idx].tv.shared = true;
 		list[idx].tiling_flags = 0;
-		list[idx].handle = 0;
 		list_add(&list[idx++].tv.head, head);
 	}
 
-- 
1.9.1

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

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

* [PATCH 3/7] drm/radeon: rename radeon_cs_reloc to radeon_bo_list
  2014-11-27 13:48 [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc Christian König
  2014-11-27 13:48 ` [PATCH 2/7] drm/radeon: drop the handle " Christian König
@ 2014-11-27 13:48 ` Christian König
  2014-11-27 13:48 ` [PATCH 4/7] drm/radeon: fence PT updates as shared Christian König
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2014-11-27 13:48 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

From: Christian König <christian.koenig@amd.com>

Better match what it is actually doing.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/evergreen_cs.c  |  8 ++++----
 drivers/gpu/drm/radeon/r100.c          |  8 ++++----
 drivers/gpu/drm/radeon/r200.c          |  2 +-
 drivers/gpu/drm/radeon/r300.c          |  4 ++--
 drivers/gpu/drm/radeon/r600_cs.c       | 10 +++++-----
 drivers/gpu/drm/radeon/radeon.h        | 28 ++++++++++++++--------------
 drivers/gpu/drm/radeon/radeon_cs.c     | 10 +++++-----
 drivers/gpu/drm/radeon/radeon_gem.c    |  2 +-
 drivers/gpu/drm/radeon/radeon_object.c |  2 +-
 drivers/gpu/drm/radeon/radeon_uvd.c    |  2 +-
 drivers/gpu/drm/radeon/radeon_vce.c    |  2 +-
 drivers/gpu/drm/radeon/radeon_vm.c     |  6 +++---
 12 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
index 5c8b358..a1dece6 100644
--- a/drivers/gpu/drm/radeon/evergreen_cs.c
+++ b/drivers/gpu/drm/radeon/evergreen_cs.c
@@ -35,7 +35,7 @@
 #define MIN(a,b)                   (((a)<(b))?(a):(b))
 
 int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
-			   struct radeon_cs_reloc **cs_reloc);
+			   struct radeon_bo_list **cs_reloc);
 struct evergreen_cs_track {
 	u32			group_size;
 	u32			nbanks;
@@ -1094,7 +1094,7 @@ static int evergreen_cs_parse_packet0(struct radeon_cs_parser *p,
 static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
 {
 	struct evergreen_cs_track *track = (struct evergreen_cs_track *)p->track;
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	u32 last_reg;
 	u32 m, i, tmp, *ib;
 	int r;
@@ -1792,7 +1792,7 @@ static bool evergreen_is_safe_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
 static int evergreen_packet3_check(struct radeon_cs_parser *p,
 				   struct radeon_cs_packet *pkt)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct evergreen_cs_track *track;
 	volatile u32 *ib;
 	unsigned idx;
@@ -2685,7 +2685,7 @@ int evergreen_cs_parse(struct radeon_cs_parser *p)
 int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
 {
 	struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx];
-	struct radeon_cs_reloc *src_reloc, *dst_reloc, *dst2_reloc;
+	struct radeon_bo_list *src_reloc, *dst_reloc, *dst2_reloc;
 	u32 header, cmd, count, sub_cmd;
 	volatile u32 *ib = p->ib.ptr;
 	u32 idx;
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 10f8be0..8174731 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -1254,7 +1254,7 @@ int r100_reloc_pitch_offset(struct radeon_cs_parser *p,
 	int r;
 	u32 tile_flags = 0;
 	u32 tmp;
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	u32 value;
 
 	r = radeon_cs_packet_next_reloc(p, &reloc, 0);
@@ -1293,7 +1293,7 @@ int r100_packet3_load_vbpntr(struct radeon_cs_parser *p,
 			     int idx)
 {
 	unsigned c, i;
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct r100_cs_track *track;
 	int r = 0;
 	volatile uint32_t *ib;
@@ -1542,7 +1542,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
 			      struct radeon_cs_packet *pkt,
 			      unsigned idx, unsigned reg)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct r100_cs_track *track;
 	volatile uint32_t *ib;
 	uint32_t tmp;
@@ -1901,7 +1901,7 @@ int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
 static int r100_packet3_check(struct radeon_cs_parser *p,
 			      struct radeon_cs_packet *pkt)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct r100_cs_track *track;
 	unsigned idx;
 	volatile uint32_t *ib;
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
index 732d493..c70e6d5 100644
--- a/drivers/gpu/drm/radeon/r200.c
+++ b/drivers/gpu/drm/radeon/r200.c
@@ -146,7 +146,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
 		       struct radeon_cs_packet *pkt,
 		       unsigned idx, unsigned reg)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct r100_cs_track *track;
 	volatile uint32_t *ib;
 	uint32_t tmp;
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index 1bc4704..91d2442 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -598,7 +598,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
 		struct radeon_cs_packet *pkt,
 		unsigned idx, unsigned reg)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct r100_cs_track *track;
 	volatile uint32_t *ib;
 	uint32_t tmp, tile_flags = 0;
@@ -1142,7 +1142,7 @@ fail:
 static int r300_packet3_check(struct radeon_cs_parser *p,
 			      struct radeon_cs_packet *pkt)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct r100_cs_track *track;
 	volatile uint32_t *ib;
 	unsigned idx;
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
index c47537a..b81ba19 100644
--- a/drivers/gpu/drm/radeon/r600_cs.c
+++ b/drivers/gpu/drm/radeon/r600_cs.c
@@ -969,7 +969,7 @@ static int r600_cs_parse_packet0(struct radeon_cs_parser *p,
 static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
 {
 	struct r600_cs_track *track = (struct r600_cs_track *)p->track;
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	u32 m, i, tmp, *ib;
 	int r;
 
@@ -1626,7 +1626,7 @@ static bool r600_is_safe_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
 static int r600_packet3_check(struct radeon_cs_parser *p,
 				struct radeon_cs_packet *pkt)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	struct r600_cs_track *track;
 	volatile u32 *ib;
 	unsigned idx;
@@ -2354,7 +2354,7 @@ static int r600_cs_parser_relocs_legacy(struct radeon_cs_parser *p)
 	if (p->chunk_relocs_idx == -1) {
 		return 0;
 	}
-	p->relocs = kzalloc(sizeof(struct radeon_cs_reloc), GFP_KERNEL);
+	p->relocs = kzalloc(sizeof(struct radeon_bo_list), GFP_KERNEL);
 	if (p->relocs == NULL) {
 		return -ENOMEM;
 	}
@@ -2435,7 +2435,7 @@ void r600_cs_legacy_init(void)
  * GPU offset using the provided start.
  **/
 int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
-			   struct radeon_cs_reloc **cs_reloc)
+			   struct radeon_bo_list **cs_reloc)
 {
 	struct radeon_cs_chunk *relocs_chunk;
 	unsigned idx;
@@ -2473,7 +2473,7 @@ int r600_dma_cs_next_reloc(struct radeon_cs_parser *p,
 int r600_dma_cs_parse(struct radeon_cs_parser *p)
 {
 	struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx];
-	struct radeon_cs_reloc *src_reloc, *dst_reloc;
+	struct radeon_bo_list *src_reloc, *dst_reloc;
 	u32 header, cmd, count, tiled;
 	volatile u32 *ib = p->ib.ptr;
 	u32 idx, idx_value;
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 17db846..da1c549 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -450,6 +450,15 @@ struct radeon_mman {
 #endif
 };
 
+struct radeon_bo_list {
+	struct radeon_bo		*robj;
+	struct ttm_validate_buffer	tv;
+	uint64_t			gpu_offset;
+	unsigned			prefered_domains;
+	unsigned			allowed_domains;
+	uint32_t			tiling_flags;
+};
+
 /* bo virtual address in a specific vm */
 struct radeon_bo_va {
 	/* protected by bo being reserved */
@@ -1044,15 +1053,6 @@ void cayman_dma_fini(struct radeon_device *rdev);
 /*
  * CS.
  */
-struct radeon_cs_reloc {
-	struct radeon_bo		*robj;
-	struct ttm_validate_buffer	tv;
-	uint64_t			gpu_offset;
-	unsigned			prefered_domains;
-	unsigned			allowed_domains;
-	uint32_t			tiling_flags;
-};
-
 struct radeon_cs_chunk {
 	uint32_t		chunk_id;
 	uint32_t		length_dw;
@@ -1072,9 +1072,9 @@ struct radeon_cs_parser {
 	unsigned		idx;
 	/* relocations */
 	unsigned		nrelocs;
-	struct radeon_cs_reloc	*relocs;
-	struct radeon_cs_reloc	**relocs_ptr;
-	struct radeon_cs_reloc	*vm_bos;
+	struct radeon_bo_list	*relocs;
+	struct radeon_bo_list	**relocs_ptr;
+	struct radeon_bo_list	*vm_bos;
 	struct list_head	validated;
 	unsigned		dma_reloc_idx;
 	/* indices of various chunks */
@@ -2973,7 +2973,7 @@ int radeon_vm_manager_init(struct radeon_device *rdev);
 void radeon_vm_manager_fini(struct radeon_device *rdev);
 int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm);
 void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm);
-struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
+struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
 					  struct radeon_vm *vm,
                                           struct list_head *head);
 struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
@@ -3087,7 +3087,7 @@ bool radeon_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p);
 void radeon_cs_dump_packet(struct radeon_cs_parser *p,
 			   struct radeon_cs_packet *pkt);
 int radeon_cs_packet_next_reloc(struct radeon_cs_parser *p,
-				struct radeon_cs_reloc **cs_reloc,
+				struct radeon_bo_list **cs_reloc,
 				int nomm);
 int r600_cs_common_vline_parse(struct radeon_cs_parser *p,
 			       uint32_t *vline_start_end,
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index f1f584a..fb776cb 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -92,7 +92,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 	if (p->relocs_ptr == NULL) {
 		return -ENOMEM;
 	}
-	p->relocs = kcalloc(p->nrelocs, sizeof(struct radeon_cs_reloc), GFP_KERNEL);
+	p->relocs = kcalloc(p->nrelocs, sizeof(struct radeon_bo_list), GFP_KERNEL);
 	if (p->relocs == NULL) {
 		return -ENOMEM;
 	}
@@ -251,7 +251,7 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority
 
 static int radeon_cs_sync_rings(struct radeon_cs_parser *p)
 {
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	int r;
 
 	list_for_each_entry(reloc, &p->validated, tv.head) {
@@ -397,8 +397,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
 static int cmp_size_smaller_first(void *priv, struct list_head *a,
 				  struct list_head *b)
 {
-	struct radeon_cs_reloc *la = list_entry(a, struct radeon_cs_reloc, tv.head);
-	struct radeon_cs_reloc *lb = list_entry(b, struct radeon_cs_reloc, tv.head);
+	struct radeon_bo_list *la = list_entry(a, struct radeon_bo_list, tv.head);
+	struct radeon_bo_list *lb = list_entry(b, struct radeon_bo_list, tv.head);
 
 	/* Sort A before B if A is smaller. */
 	return (int)la->robj->tbo.num_pages - (int)lb->robj->tbo.num_pages;
@@ -832,7 +832,7 @@ void radeon_cs_dump_packet(struct radeon_cs_parser *p,
  * GPU offset using the provided start.
  **/
 int radeon_cs_packet_next_reloc(struct radeon_cs_parser *p,
-				struct radeon_cs_reloc **cs_reloc,
+				struct radeon_bo_list **cs_reloc,
 				int nomm)
 {
 	struct radeon_cs_chunk *relocs_chunk;
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 12cfaea..6162bd2 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -548,7 +548,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
 				    struct radeon_bo_va *bo_va)
 {
 	struct ttm_validate_buffer tv, *entry;
-	struct radeon_cs_reloc *vm_bos;
+	struct radeon_bo_list *vm_bos;
 	struct ww_acquire_ctx ticket;
 	struct list_head list;
 	unsigned domain;
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 87b00d9..4ab0747 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -502,7 +502,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
 			    struct ww_acquire_ctx *ticket,
 			    struct list_head *head, int ring)
 {
-	struct radeon_cs_reloc *lobj;
+	struct radeon_bo_list *lobj;
 	struct radeon_bo *bo;
 	int r;
 	u64 bytes_moved = 0, initial_bytes_moved;
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 11b6624..7c22b93 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -488,7 +488,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
 			       unsigned buf_sizes[], bool *has_msg_cmd)
 {
 	struct radeon_cs_chunk *relocs_chunk;
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	unsigned idx, cmd, offset;
 	uint64_t start, end;
 	int r;
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
index 9e85757..8b4eea4 100644
--- a/drivers/gpu/drm/radeon/radeon_vce.c
+++ b/drivers/gpu/drm/radeon/radeon_vce.c
@@ -453,7 +453,7 @@ int radeon_vce_cs_reloc(struct radeon_cs_parser *p, int lo, int hi,
 			unsigned size)
 {
 	struct radeon_cs_chunk *relocs_chunk;
-	struct radeon_cs_reloc *reloc;
+	struct radeon_bo_list *reloc;
 	uint64_t start, end, offset;
 	unsigned idx;
 
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index c4ffe02..0423e29 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -125,15 +125,15 @@ void radeon_vm_manager_fini(struct radeon_device *rdev)
  * Add the page directory to the list of BOs to
  * validate for command submission (cayman+).
  */
-struct radeon_cs_reloc *radeon_vm_get_bos(struct radeon_device *rdev,
+struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
 					  struct radeon_vm *vm,
 					  struct list_head *head)
 {
-	struct radeon_cs_reloc *list;
+	struct radeon_bo_list *list;
 	unsigned i, idx;
 
 	list = drm_malloc_ab(vm->max_pde_used + 2,
-			     sizeof(struct radeon_cs_reloc));
+			     sizeof(struct radeon_bo_list));
 	if (!list)
 		return NULL;
 
-- 
1.9.1

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

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

* [PATCH 4/7] drm/radeon: fence PT updates as shared
  2014-11-27 13:48 [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc Christian König
  2014-11-27 13:48 ` [PATCH 2/7] drm/radeon: drop the handle " Christian König
  2014-11-27 13:48 ` [PATCH 3/7] drm/radeon: rename radeon_cs_reloc to radeon_bo_list Christian König
@ 2014-11-27 13:48 ` Christian König
  2014-11-27 13:48 ` [PATCH 5/7] drm/radeon: add spinlock for BO_VA status protection Christian König
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2014-11-27 13:48 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

From: Christian König <christian.koenig@amd.com>

The BO_VA contains everything necessary.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon_vm.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 0423e29..6bc3821 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -798,11 +798,11 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev,
  *
  * Global and local mutex must be locked!
  */
-static void radeon_vm_update_ptes(struct radeon_device *rdev,
-				  struct radeon_vm *vm,
-				  struct radeon_ib *ib,
-				  uint64_t start, uint64_t end,
-				  uint64_t dst, uint32_t flags)
+static int radeon_vm_update_ptes(struct radeon_device *rdev,
+				 struct radeon_vm *vm,
+				 struct radeon_ib *ib,
+				 uint64_t start, uint64_t end,
+				 uint64_t dst, uint32_t flags)
 {
 	uint64_t mask = RADEON_VM_PTE_COUNT - 1;
 	uint64_t last_pte = ~0, last_dst = ~0;
@@ -815,8 +815,12 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
 		struct radeon_bo *pt = vm->page_tables[pt_idx].bo;
 		unsigned nptes;
 		uint64_t pte;
+		int r;
 
 		radeon_sync_resv(rdev, &ib->sync, pt->tbo.resv, true);
+		r = reservation_object_reserve_shared(pt->tbo.resv);
+		if (r)
+			return r;
 
 		if ((addr & ~mask) == (end & ~mask))
 			nptes = end - addr;
@@ -850,6 +854,8 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
 				    last_pte + 8 * count,
 				    last_dst, flags);
 	}
+
+	return 0;
 }
 
 /**
@@ -874,7 +880,7 @@ static void radeon_vm_fence_pts(struct radeon_vm *vm,
 	end >>= radeon_vm_block_size;
 
 	for (i = start; i <= end; ++i)
-		radeon_bo_fence(vm->page_tables[i].bo, fence, false);
+		radeon_bo_fence(vm->page_tables[i].bo, fence, true);
 }
 
 /**
@@ -983,9 +989,13 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
 			radeon_sync_fence(&ib.sync, vm->ids[i].last_id_use);
 	}
 
-	radeon_vm_update_ptes(rdev, vm, &ib, bo_va->it.start,
-			      bo_va->it.last + 1, addr,
-			      radeon_vm_page_flags(bo_va->flags));
+	r = radeon_vm_update_ptes(rdev, vm, &ib, bo_va->it.start,
+				  bo_va->it.last + 1, addr,
+				  radeon_vm_page_flags(bo_va->flags));
+	if (r) {
+		radeon_ib_free(rdev, &ib);
+		return r;
+	}
 
 	radeon_asic_vm_pad_ib(rdev, &ib);
 	WARN_ON(ib.length_dw > ndw);
-- 
1.9.1

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

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

* [PATCH 5/7] drm/radeon: add spinlock for BO_VA status protection
  2014-11-27 13:48 [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc Christian König
                   ` (2 preceding siblings ...)
  2014-11-27 13:48 ` [PATCH 4/7] drm/radeon: fence PT updates as shared Christian König
@ 2014-11-27 13:48 ` Christian König
  2014-11-28  2:52   ` Dieter Nützel
  2014-11-27 13:48 ` [PATCH 6/7] drm/radeon: take VM lock before BO locks Christian König
  2014-11-27 13:48 ` [PATCH 7/7] drm/radeon: don't allocate PD/PT BO list any more Christian König
  5 siblings, 1 reply; 10+ messages in thread
From: Christian König @ 2014-11-27 13:48 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

From: Christian König <christian.koenig@amd.com>

Stop using the VM mutex for this

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon.h    |  3 +++
 drivers/gpu/drm/radeon/radeon_vm.c | 36 ++++++++++++++++++++++++++++++------
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index da1c549..3680cf0 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -929,6 +929,9 @@ struct radeon_vm {
 
 	struct rb_root		va;
 
+	/* ptotecting invalidated and freed */
+	spinlock_t		status_lock;
+
 	/* BOs moved, but not yet updated in the PT */
 	struct list_head	invalidated;
 
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 6bc3821..cde48c4 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -487,7 +487,9 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 			tmp->vm = vm;
 			tmp->addr = bo_va->addr;
 			tmp->bo = radeon_bo_ref(bo_va->bo);
+			spin_lock(&vm->status_lock);
 			list_add(&tmp->vm_status, &vm->freed);
+			spin_unlock(&vm->status_lock);
 		}
 
 		interval_tree_remove(&bo_va->it, &vm->va);
@@ -913,7 +915,9 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
 		return -EINVAL;
 	}
 
+	spin_lock(&vm->status_lock);
 	list_del_init(&bo_va->vm_status);
+	spin_unlock(&vm->status_lock);
 
 	bo_va->flags &= ~RADEON_VM_PAGE_VALID;
 	bo_va->flags &= ~RADEON_VM_PAGE_SYSTEM;
@@ -1028,17 +1032,25 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
 int radeon_vm_clear_freed(struct radeon_device *rdev,
 			  struct radeon_vm *vm)
 {
-	struct radeon_bo_va *bo_va, *tmp;
+	struct radeon_bo_va *bo_va;
 	int r;
 
-	list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) {
+	spin_lock(&vm->status_lock);
+	while (!list_empty(&vm->freed)) {
+		bo_va = list_first_entry(&vm->freed,
+			struct radeon_bo_va, vm_status);
+		spin_unlock(&vm->status_lock);
+
 		r = radeon_vm_bo_update(rdev, bo_va, NULL);
 		radeon_bo_unref(&bo_va->bo);
 		radeon_fence_unref(&bo_va->last_pt_update);
 		kfree(bo_va);
 		if (r)
 			return r;
+
+		spin_lock(&vm->status_lock);
 	}
+	spin_unlock(&vm->status_lock);
 	return 0;
 
 }
@@ -1057,14 +1069,23 @@ int radeon_vm_clear_freed(struct radeon_device *rdev,
 int radeon_vm_clear_invalids(struct radeon_device *rdev,
 			     struct radeon_vm *vm)
 {
-	struct radeon_bo_va *bo_va, *tmp;
+	struct radeon_bo_va *bo_va;
 	int r;
 
-	list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, vm_status) {
+	spin_lock(&vm->status_lock);
+	while (!list_empty(&vm->invalidated)) {
+		bo_va = list_first_entry(&vm->invalidated,
+			struct radeon_bo_va, vm_status);
+		spin_unlock(&vm->status_lock);
+
 		r = radeon_vm_bo_update(rdev, bo_va, NULL);
 		if (r)
 			return r;
+
+		spin_lock(&vm->status_lock);
 	}
+	spin_unlock(&vm->status_lock);
+
 	return 0;
 }
 
@@ -1087,6 +1108,7 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
 
 	mutex_lock(&vm->mutex);
 	interval_tree_remove(&bo_va->it, &vm->va);
+	spin_lock(&vm->status_lock);
 	list_del(&bo_va->vm_status);
 
 	if (bo_va->addr) {
@@ -1096,6 +1118,7 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
 		radeon_fence_unref(&bo_va->last_pt_update);
 		kfree(bo_va);
 	}
+	spin_unlock(&vm->status_lock);
 
 	mutex_unlock(&vm->mutex);
 }
@@ -1116,10 +1139,10 @@ void radeon_vm_bo_invalidate(struct radeon_device *rdev,
 
 	list_for_each_entry(bo_va, &bo->va, bo_list) {
 		if (bo_va->addr) {
-			mutex_lock(&bo_va->vm->mutex);
+			spin_lock(&bo_va->vm->status_lock);
 			list_del(&bo_va->vm_status);
 			list_add(&bo_va->vm_status, &bo_va->vm->invalidated);
-			mutex_unlock(&bo_va->vm->mutex);
+			spin_unlock(&bo_va->vm->status_lock);
 		}
 	}
 }
@@ -1147,6 +1170,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
 	}
 	mutex_init(&vm->mutex);
 	vm->va = RB_ROOT;
+	spin_lock_init(&vm->status_lock);
 	INIT_LIST_HEAD(&vm->invalidated);
 	INIT_LIST_HEAD(&vm->freed);
 
-- 
1.9.1

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

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

* [PATCH 6/7] drm/radeon: take VM lock before BO locks
  2014-11-27 13:48 [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc Christian König
                   ` (3 preceding siblings ...)
  2014-11-27 13:48 ` [PATCH 5/7] drm/radeon: add spinlock for BO_VA status protection Christian König
@ 2014-11-27 13:48 ` Christian König
  2014-11-27 14:06   ` Christian König
  2014-11-27 13:48 ` [PATCH 7/7] drm/radeon: don't allocate PD/PT BO list any more Christian König
  5 siblings, 1 reply; 10+ messages in thread
From: Christian König @ 2014-11-27 13:48 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

From: Christian König <christian.koenig@amd.com>

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon.h     |  2 +-
 drivers/gpu/drm/radeon/radeon_cs.c  |  9 +++++--
 drivers/gpu/drm/radeon/radeon_gem.c | 17 ++++++++++----
 drivers/gpu/drm/radeon/radeon_kms.c |  5 ++++
 drivers/gpu/drm/radeon/radeon_vm.c  | 47 +++++++++----------------------------
 5 files changed, 36 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 3680cf0..699446a 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -925,7 +925,7 @@ struct radeon_vm_id {
 };
 
 struct radeon_vm {
-	struct mutex		mutex;
+	struct mutex		lock;
 
 	struct rb_root		va;
 
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index fb776cb..7a90378 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -195,6 +195,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 	if (p->cs_flags & RADEON_CS_USE_VM)
 		p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm,
 					      &p->validated);
+
 	if (need_mmap_lock)
 		down_read(&current->mm->mmap_sem);
 
@@ -571,7 +572,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
 	if (parser->ring == R600_RING_TYPE_UVD_INDEX)
 		radeon_uvd_note_usage(rdev);
 
-	mutex_lock(&vm->mutex);
 	r = radeon_bo_vm_update_pte(parser, vm);
 	if (r) {
 		goto out;
@@ -592,7 +592,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
 	}
 
 out:
-	mutex_unlock(&vm->mutex);
 	return r;
 }
 
@@ -696,6 +695,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
 	}
 
 	r = radeon_cs_ib_fill(rdev, &parser);
+	if (parser.cs_flags & RADEON_CS_USE_VM)
+		mutex_lock(&parser.ib.vm->lock);
 	if (!r) {
 		r = radeon_cs_parser_relocs(&parser);
 		if (r && r != -ERESTARTSYS)
@@ -704,6 +705,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
 
 	if (r) {
 		radeon_cs_parser_fini(&parser, r, false);
+		if (parser.cs_flags & RADEON_CS_USE_VM)
+			mutex_unlock(&parser.ib.vm->lock);
 		up_read(&rdev->exclusive_lock);
 		r = radeon_cs_handle_lockup(rdev, r);
 		return r;
@@ -721,6 +724,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
 	}
 out:
 	radeon_cs_parser_fini(&parser, r, true);
+	if (parser.cs_flags & RADEON_CS_USE_VM)
+		mutex_unlock(&parser.ib.vm->lock);
 	up_read(&rdev->exclusive_lock);
 	r = radeon_cs_handle_lockup(rdev, r);
 	return r;
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 6162bd2..4eafec6 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -150,8 +150,10 @@ int radeon_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri
 		return 0;
 	}
 
+	mutex_lock(&vm->lock);
 	r = radeon_bo_reserve(rbo, false);
 	if (r) {
+		mutex_unlock(&vm->lock);
 		return r;
 	}
 
@@ -162,6 +164,7 @@ int radeon_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri
 		++bo_va->ref_count;
 	}
 	radeon_bo_unreserve(rbo);
+	mutex_unlock(&vm->lock);
 
 	return 0;
 }
@@ -180,8 +183,10 @@ void radeon_gem_object_close(struct drm_gem_object *obj,
 		return;
 	}
 
+	mutex_lock(&vm->lock);
 	r = radeon_bo_reserve(rbo, true);
 	if (r) {
+		mutex_unlock(&vm->lock);
 		dev_err(rdev->dev, "leaking bo va because "
 			"we fail to reserve bo (%d)\n", r);
 		return;
@@ -193,6 +198,7 @@ void radeon_gem_object_close(struct drm_gem_object *obj,
 		}
 	}
 	radeon_bo_unreserve(rbo);
+	mutex_unlock(&vm->lock);
 }
 
 static int radeon_gem_handle_lockup(struct radeon_device *rdev, int r)
@@ -576,17 +582,13 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
 			goto error_unreserve;
 	}
 
-	mutex_lock(&bo_va->vm->mutex);
 	r = radeon_vm_clear_freed(rdev, bo_va->vm);
 	if (r)
-		goto error_unlock;
+		goto error_unreserve;
 
 	if (bo_va->it.start)
 		r = radeon_vm_bo_update(rdev, bo_va, &bo_va->bo->tbo.mem);
 
-error_unlock:
-	mutex_unlock(&bo_va->vm->mutex);
-
 error_unreserve:
 	ttm_eu_backoff_reservation(&ticket, &list);
 
@@ -662,14 +664,18 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
 		return -ENOENT;
 	}
 	rbo = gem_to_radeon_bo(gobj);
+	mutex_lock(&fpriv->vm.lock);
 	r = radeon_bo_reserve(rbo, false);
 	if (r) {
+		mutex_unlock(&fpriv->vm.lock);
 		args->operation = RADEON_VA_RESULT_ERROR;
 		drm_gem_object_unreference_unlocked(gobj);
 		return r;
 	}
 	bo_va = radeon_vm_bo_find(&fpriv->vm, rbo);
 	if (!bo_va) {
+		radeon_bo_unreserve(rbo);
+		mutex_unlock(&fpriv->vm.lock);
 		args->operation = RADEON_VA_RESULT_ERROR;
 		drm_gem_object_unreference_unlocked(gobj);
 		return -ENOENT;
@@ -698,6 +704,7 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
 		args->operation = RADEON_VA_RESULT_ERROR;
 	}
 out:
+	mutex_unlock(&fpriv->vm.lock);
 	drm_gem_object_unreference_unlocked(gobj);
 	return r;
 }
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index f4dd26a..d994006 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -613,8 +613,10 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
 		}
 
 		if (rdev->accel_working) {
+			mutex_lock(&vm->lock);
 			r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
 			if (r) {
+				mutex_unlock(&vm->lock);
 				radeon_vm_fini(rdev, vm);
 				kfree(fpriv);
 				return r;
@@ -628,6 +630,7 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
 						  RADEON_VA_IB_OFFSET,
 						  RADEON_VM_PAGE_READABLE |
 						  RADEON_VM_PAGE_SNOOPED);
+			mutex_unlock(&vm->lock);
 			if (r) {
 				radeon_vm_fini(rdev, vm);
 				kfree(fpriv);
@@ -662,12 +665,14 @@ void radeon_driver_postclose_kms(struct drm_device *dev,
 		int r;
 
 		if (rdev->accel_working) {
+			mutex_lock(&vm->lock);
 			r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
 			if (!r) {
 				if (vm->ib_bo_va)
 					radeon_vm_bo_rmv(rdev, vm->ib_bo_va);
 				radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
 			}
+			mutex_unlock(&vm->lock);
 		}
 
 		radeon_vm_fini(rdev, vm);
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index cde48c4..658183f 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -172,7 +172,7 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
  * Allocate an id for the vm (cayman+).
  * Returns the fence we need to sync to (if any).
  *
- * Global and local mutex must be locked!
+ * Mutex must be locked!
  */
 struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
 				       struct radeon_vm *vm, int ring)
@@ -231,7 +231,7 @@ struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
  *
  * Flush the vm (cayman+).
  *
- * Global and local mutex must be locked!
+ * Mutex must be locked!
  */
 void radeon_vm_flush(struct radeon_device *rdev,
 		     struct radeon_vm *vm,
@@ -263,7 +263,7 @@ void radeon_vm_flush(struct radeon_device *rdev,
  * Fence the vm (cayman+).
  * Set the fence used to protect page table and id.
  *
- * Global and local mutex must be locked!
+ * Mutex must be locked!
  */
 void radeon_vm_fence(struct radeon_device *rdev,
 		     struct radeon_vm *vm,
@@ -314,7 +314,7 @@ struct radeon_bo_va *radeon_vm_bo_find(struct radeon_vm *vm,
  * Add @bo to the list of bos associated with the vm
  * Returns newly added bo_va or NULL for failure
  *
- * Object has to be reserved!
+ * Mutex must be locked and object has to be reserved!
  */
 struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev,
 				      struct radeon_vm *vm,
@@ -336,9 +336,7 @@ struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev,
 	INIT_LIST_HEAD(&bo_va->bo_list);
 	INIT_LIST_HEAD(&bo_va->vm_status);
 
-	mutex_lock(&vm->mutex);
 	list_add_tail(&bo_va->bo_list, &bo->va);
-	mutex_unlock(&vm->mutex);
 
 	return bo_va;
 }
@@ -441,7 +439,8 @@ error_unreserve:
  * Validate and set the offset requested within the vm address space.
  * Returns 0 for success, error for failure.
  *
- * Object has to be reserved and gets unreserved by this function!
+ * Mutex must be locked and object has to be reserved and gets
+ * unreserved by this function!
  */
 int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 			  struct radeon_bo_va *bo_va,
@@ -472,14 +471,12 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 		eoffset = last_pfn = 0;
 	}
 
-	mutex_lock(&vm->mutex);
 	if (bo_va->it.start || bo_va->it.last) {
 		if (bo_va->addr) {
 			/* add a clone of the bo_va to clear the old address */
 			struct radeon_bo_va *tmp;
 			tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
 			if (!tmp) {
-				mutex_unlock(&vm->mutex);
 				return -ENOMEM;
 			}
 			tmp->it.start = bo_va->it.start;
@@ -509,7 +506,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 			dev_err(rdev->dev, "bo %p va 0x%010Lx conflict with "
 				"(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
 				soffset, tmp->bo, tmp->it.start, tmp->it.last);
-			mutex_unlock(&vm->mutex);
 			return -EINVAL;
 		}
 		bo_va->it.start = soffset;
@@ -537,9 +533,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 		if (vm->page_tables[pt_idx].bo)
 			continue;
 
-		/* drop mutex to allocate and clear page table */
-		mutex_unlock(&vm->mutex);
-
 		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
 				     RADEON_GPU_PAGE_SIZE, true,
 				     RADEON_GEM_DOMAIN_VRAM, 0,
@@ -554,21 +547,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 			return r;
 		}
 
-		/* aquire mutex again */
-		mutex_lock(&vm->mutex);
-		if (vm->page_tables[pt_idx].bo) {
-			/* someone else allocated the pt in the meantime */
-			mutex_unlock(&vm->mutex);
-			radeon_bo_unref(&pt);
-			mutex_lock(&vm->mutex);
-			continue;
-		}
-
 		vm->page_tables[pt_idx].addr = 0;
 		vm->page_tables[pt_idx].bo = pt;
 	}
 
-	mutex_unlock(&vm->mutex);
 	return 0;
 }
 
@@ -627,7 +609,7 @@ static uint32_t radeon_vm_page_flags(uint32_t flags)
  * and updates the page directory (cayman+).
  * Returns 0 for success, error for failure.
  *
- * Global and local mutex must be locked!
+ * Mutex must be locked!
  */
 int radeon_vm_update_page_directory(struct radeon_device *rdev,
 				    struct radeon_vm *vm)
@@ -717,8 +699,6 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
  * @pe_end: last PTE to handle
  * @addr: addr those PTEs should point to
  * @flags: hw mapping flags
- *
- * Global and local mutex must be locked!
  */
 static void radeon_vm_frag_ptes(struct radeon_device *rdev,
 				struct radeon_ib *ib,
@@ -798,7 +778,6 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev,
  *
  * Update the page tables in the range @start - @end (cayman+).
  *
- * Global and local mutex must be locked!
  */
 static int radeon_vm_update_ptes(struct radeon_device *rdev,
 				 struct radeon_vm *vm,
@@ -870,7 +849,6 @@ static int radeon_vm_update_ptes(struct radeon_device *rdev,
  *
  * Fence the page tables in the range @start - @end (cayman+).
  *
- * Global and local mutex must be locked!
  */
 static void radeon_vm_fence_pts(struct radeon_vm *vm,
 				uint64_t start, uint64_t end,
@@ -896,7 +874,7 @@ static void radeon_vm_fence_pts(struct radeon_vm *vm,
  * Fill in the page table entries for @bo (cayman+).
  * Returns 0 for success, -EINVAL for failure.
  *
- * Object have to be reserved and mutex must be locked!
+ * Mutex must be locked and BOs have to be reserved!
  */
 int radeon_vm_bo_update(struct radeon_device *rdev,
 			struct radeon_bo_va *bo_va,
@@ -1097,7 +1075,7 @@ int radeon_vm_clear_invalids(struct radeon_device *rdev,
  *
  * Remove @bo_va->bo from the requested vm (cayman+).
  *
- * Object have to be reserved!
+ * Mutex must be locked and object has to be reserved!
  */
 void radeon_vm_bo_rmv(struct radeon_device *rdev,
 		      struct radeon_bo_va *bo_va)
@@ -1106,7 +1084,6 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
 
 	list_del(&bo_va->bo_list);
 
-	mutex_lock(&vm->mutex);
 	interval_tree_remove(&bo_va->it, &vm->va);
 	spin_lock(&vm->status_lock);
 	list_del(&bo_va->vm_status);
@@ -1119,8 +1096,6 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
 		kfree(bo_va);
 	}
 	spin_unlock(&vm->status_lock);
-
-	mutex_unlock(&vm->mutex);
 }
 
 /**
@@ -1168,7 +1143,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
 		vm->ids[i].flushed_updates = NULL;
 		vm->ids[i].last_id_use = NULL;
 	}
-	mutex_init(&vm->mutex);
+	mutex_init(&vm->lock);
 	vm->va = RB_ROOT;
 	spin_lock_init(&vm->status_lock);
 	INIT_LIST_HEAD(&vm->invalidated);
@@ -1245,5 +1220,5 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm)
 		radeon_fence_unref(&vm->ids[i].last_id_use);
 	}
 
-	mutex_destroy(&vm->mutex);
+	mutex_destroy(&vm->lock);
 }
-- 
1.9.1

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

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

* [PATCH 7/7] drm/radeon: don't allocate PD/PT BO list any more
  2014-11-27 13:48 [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc Christian König
                   ` (4 preceding siblings ...)
  2014-11-27 13:48 ` [PATCH 6/7] drm/radeon: take VM lock before BO locks Christian König
@ 2014-11-27 13:48 ` Christian König
  5 siblings, 0 replies; 10+ messages in thread
From: Christian König @ 2014-11-27 13:48 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

From: Christian König <christian.koenig@amd.com>

Just use the list structure directly for representing the entries.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/radeon/radeon.h     | 12 +++---
 drivers/gpu/drm/radeon/radeon_cs.c  |  4 +-
 drivers/gpu/drm/radeon/radeon_gem.c | 11 ++----
 drivers/gpu/drm/radeon/radeon_vm.c  | 75 ++++++++++++++++---------------------
 4 files changed, 41 insertions(+), 61 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 699446a..d652ccb 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -911,8 +911,8 @@ struct radeon_mec {
 				  R600_PTE_SYSTEM | R600_PTE_VALID )
 
 struct radeon_vm_pt {
-	struct radeon_bo		*bo;
-	uint64_t			addr;
+	struct radeon_bo_list	list;
+	uint64_t		addr;
 };
 
 struct radeon_vm_id {
@@ -939,7 +939,7 @@ struct radeon_vm {
 	struct list_head	freed;
 
 	/* contains the page directory */
-	struct radeon_bo	*page_directory;
+	struct radeon_bo_list	page_directory;
 	unsigned		max_pde_used;
 
 	/* array of page tables, one for each page directory entry */
@@ -1077,7 +1077,6 @@ struct radeon_cs_parser {
 	unsigned		nrelocs;
 	struct radeon_bo_list	*relocs;
 	struct radeon_bo_list	**relocs_ptr;
-	struct radeon_bo_list	*vm_bos;
 	struct list_head	validated;
 	unsigned		dma_reloc_idx;
 	/* indices of various chunks */
@@ -2976,9 +2975,8 @@ int radeon_vm_manager_init(struct radeon_device *rdev);
 void radeon_vm_manager_fini(struct radeon_device *rdev);
 int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm);
 void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm);
-struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
-					  struct radeon_vm *vm,
-                                          struct list_head *head);
+void radeon_vm_add_bos(struct radeon_device *rdev, struct radeon_vm *vm,
+		       struct list_head *head);
 struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
 				       struct radeon_vm *vm, int ring);
 void radeon_vm_flush(struct radeon_device *rdev,
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 7a90378..551980c 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -193,8 +193,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 	radeon_cs_buckets_get_list(&buckets, &p->validated);
 
 	if (p->cs_flags & RADEON_CS_USE_VM)
-		p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm,
-					      &p->validated);
+		radeon_vm_add_bos(p->rdev, p->ib.vm, &p->validated);
 
 	if (need_mmap_lock)
 		down_read(&current->mm->mmap_sem);
@@ -450,7 +449,6 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo
 	kfree(parser->track);
 	kfree(parser->relocs);
 	kfree(parser->relocs_ptr);
-	drm_free_large(parser->vm_bos);
 	for (i = 0; i < parser->nchunks; i++)
 		drm_free_large(parser->chunks[i].kdata);
 	kfree(parser->chunks);
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 4eafec6..26d1af1 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -554,7 +554,6 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
 				    struct radeon_bo_va *bo_va)
 {
 	struct ttm_validate_buffer tv, *entry;
-	struct radeon_bo_list *vm_bos;
 	struct ww_acquire_ctx ticket;
 	struct list_head list;
 	unsigned domain;
@@ -566,13 +565,11 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
 	tv.shared = true;
 	list_add(&tv.head, &list);
 
-	vm_bos = radeon_vm_get_bos(rdev, bo_va->vm, &list);
-	if (!vm_bos)
-		return;
+	radeon_vm_add_bos(rdev, bo_va->vm, &list);
 
 	r = ttm_eu_reserve_buffers(&ticket, &list, true);
 	if (r)
-		goto error_free;
+		goto error_done;
 
 	list_for_each_entry(entry, &list, head) {
 		domain = radeon_mem_type_to_domain(entry->bo->mem.mem_type);
@@ -592,9 +589,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
 error_unreserve:
 	ttm_eu_backoff_reservation(&ticket, &list);
 
-error_free:
-	drm_free_large(vm_bos);
-
+error_done:
 	if (r)
 		DRM_ERROR("Couldn't update BO_VA (%d)\n", r);
 }
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 658183f..b09c998 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -117,7 +117,7 @@ void radeon_vm_manager_fini(struct radeon_device *rdev)
 }
 
 /**
- * radeon_vm_get_bos - add the vm BOs to a validation list
+ * radeon_vm_add_bos - add the PD/PT BOs to a validation list
  *
  * @vm: vm providing the BOs
  * @head: head of validation list
@@ -125,41 +125,18 @@ void radeon_vm_manager_fini(struct radeon_device *rdev)
  * Add the page directory to the list of BOs to
  * validate for command submission (cayman+).
  */
-struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
-					  struct radeon_vm *vm,
-					  struct list_head *head)
+void radeon_vm_add_bos(struct radeon_device *rdev, struct radeon_vm *vm,
+		       struct list_head *head)
 {
-	struct radeon_bo_list *list;
 	unsigned i, idx;
 
-	list = drm_malloc_ab(vm->max_pde_used + 2,
-			     sizeof(struct radeon_bo_list));
-	if (!list)
-		return NULL;
-
-	/* add the vm page table to the list */
-	list[0].robj = vm->page_directory;
-	list[0].prefered_domains = RADEON_GEM_DOMAIN_VRAM;
-	list[0].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
-	list[0].tv.bo = &vm->page_directory->tbo;
-	list[0].tv.shared = true;
-	list[0].tiling_flags = 0;
-	list_add(&list[0].tv.head, head);
-
+	list_add(&vm->page_directory.tv.head, head);
 	for (i = 0, idx = 1; i <= vm->max_pde_used; i++) {
-		if (!vm->page_tables[i].bo)
+		if (!vm->page_tables[i].list.robj)
 			continue;
 
-		list[idx].robj = vm->page_tables[i].bo;
-		list[idx].prefered_domains = RADEON_GEM_DOMAIN_VRAM;
-		list[idx].allowed_domains = RADEON_GEM_DOMAIN_VRAM;
-		list[idx].tv.bo = &list[idx].robj->tbo;
-		list[idx].tv.shared = true;
-		list[idx].tiling_flags = 0;
-		list_add(&list[idx++].tv.head, head);
+		list_add(&vm->page_tables[i].list.tv.head, head);
 	}
-
-	return list;
 }
 
 /**
@@ -237,7 +214,7 @@ void radeon_vm_flush(struct radeon_device *rdev,
 		     struct radeon_vm *vm,
 		     int ring, struct radeon_fence *updates)
 {
-	uint64_t pd_addr = radeon_bo_gpu_offset(vm->page_directory);
+	uint64_t pd_addr = vm->page_directory.gpu_offset;
 	struct radeon_vm_id *vm_id = &vm->ids[ring];
 
 	if (pd_addr != vm_id->pd_gpu_addr || !vm_id->flushed_updates ||
@@ -528,9 +505,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 
 	/* walk over the address space and allocate the page tables */
 	for (pt_idx = soffset; pt_idx <= eoffset; ++pt_idx) {
+		struct radeon_vm_pt *entry = &vm->page_tables[pt_idx];
 		struct radeon_bo *pt;
 
-		if (vm->page_tables[pt_idx].bo)
+		if (entry->list.robj)
 			continue;
 
 		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
@@ -547,8 +525,13 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 			return r;
 		}
 
-		vm->page_tables[pt_idx].addr = 0;
-		vm->page_tables[pt_idx].bo = pt;
+		entry->list.robj = pt;
+		entry->list.prefered_domains = RADEON_GEM_DOMAIN_VRAM;
+		entry->list.allowed_domains = RADEON_GEM_DOMAIN_VRAM;
+		entry->list.tv.bo = &pt->tbo;
+		entry->list.tv.shared = true;
+		entry->list.tiling_flags = 0;
+		entry->addr = 0;
 	}
 
 	return 0;
@@ -614,7 +597,7 @@ static uint32_t radeon_vm_page_flags(uint32_t flags)
 int radeon_vm_update_page_directory(struct radeon_device *rdev,
 				    struct radeon_vm *vm)
 {
-	struct radeon_bo *pd = vm->page_directory;
+	struct radeon_bo *pd = vm->page_directory.robj;
 	uint64_t pd_addr = radeon_bo_gpu_offset(pd);
 	uint32_t incr = RADEON_VM_PTE_COUNT * 8;
 	uint64_t last_pde = ~0, last_pt = ~0;
@@ -639,7 +622,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
 
 	/* walk over the address space and update the page directory */
 	for (pt_idx = 0; pt_idx <= vm->max_pde_used; ++pt_idx) {
-		struct radeon_bo *bo = vm->page_tables[pt_idx].bo;
+		struct radeon_bo *bo = vm->page_tables[pt_idx].list.robj;
 		uint64_t pde, pt;
 
 		if (bo == NULL)
@@ -793,7 +776,7 @@ static int radeon_vm_update_ptes(struct radeon_device *rdev,
 	/* walk over the address space and update the page tables */
 	for (addr = start; addr < end; ) {
 		uint64_t pt_idx = addr >> radeon_vm_block_size;
-		struct radeon_bo *pt = vm->page_tables[pt_idx].bo;
+		struct radeon_bo *pt = vm->page_tables[pt_idx].list.robj;
 		unsigned nptes;
 		uint64_t pte;
 		int r;
@@ -860,7 +843,7 @@ static void radeon_vm_fence_pts(struct radeon_vm *vm,
 	end >>= radeon_vm_block_size;
 
 	for (i = start; i <= end; ++i)
-		radeon_bo_fence(vm->page_tables[i].bo, fence, true);
+		radeon_bo_fence(vm->page_tables[i].list.robj, fence, true);
 }
 
 /**
@@ -1162,17 +1145,23 @@ 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,
-			     NULL, &vm->page_directory);
+			     NULL, &vm->page_directory.robj);
 	if (r)
 		return r;
 
-	r = radeon_vm_clear_bo(rdev, vm->page_directory);
+	r = radeon_vm_clear_bo(rdev, vm->page_directory.robj);
 	if (r) {
-		radeon_bo_unref(&vm->page_directory);
-		vm->page_directory = NULL;
+		radeon_bo_unref(&vm->page_directory.robj);
+		vm->page_directory.robj = NULL;
 		return r;
 	}
 
+	vm->page_directory.prefered_domains = RADEON_GEM_DOMAIN_VRAM;
+	vm->page_directory.allowed_domains = RADEON_GEM_DOMAIN_VRAM;
+	vm->page_directory.tv.bo = &vm->page_directory.robj->tbo;
+	vm->page_directory.tv.shared = true;
+	vm->page_directory.tiling_flags = 0;
+
 	return 0;
 }
 
@@ -1210,10 +1199,10 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm)
 	}
 
 	for (i = 0; i < radeon_vm_num_pdes(rdev); i++)
-		radeon_bo_unref(&vm->page_tables[i].bo);
+		radeon_bo_unref(&vm->page_tables[i].list.robj);
 	kfree(vm->page_tables);
 
-	radeon_bo_unref(&vm->page_directory);
+	radeon_bo_unref(&vm->page_directory.robj);
 
 	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
 		radeon_fence_unref(&vm->ids[i].flushed_updates);
-- 
1.9.1

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

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

* Re: [PATCH 6/7] drm/radeon: take VM lock before BO locks
  2014-11-27 13:48 ` [PATCH 6/7] drm/radeon: take VM lock before BO locks Christian König
@ 2014-11-27 14:06   ` Christian König
  2014-12-01  3:30     ` Alex Deucher
  0 siblings, 1 reply; 10+ messages in thread
From: Christian König @ 2014-11-27 14:06 UTC (permalink / raw)
  To: alexdeucher; +Cc: dri-devel

Ah, crap. Drop the last two, they are still work in progress.

I was on the wrong branch while sending them,
Christian.

Am 27.11.2014 um 14:48 schrieb Christian König:
> From: Christian König <christian.koenig@amd.com>
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>   drivers/gpu/drm/radeon/radeon.h     |  2 +-
>   drivers/gpu/drm/radeon/radeon_cs.c  |  9 +++++--
>   drivers/gpu/drm/radeon/radeon_gem.c | 17 ++++++++++----
>   drivers/gpu/drm/radeon/radeon_kms.c |  5 ++++
>   drivers/gpu/drm/radeon/radeon_vm.c  | 47 +++++++++----------------------------
>   5 files changed, 36 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 3680cf0..699446a 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -925,7 +925,7 @@ struct radeon_vm_id {
>   };
>   
>   struct radeon_vm {
> -	struct mutex		mutex;
> +	struct mutex		lock;
>   
>   	struct rb_root		va;
>   
> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> index fb776cb..7a90378 100644
> --- a/drivers/gpu/drm/radeon/radeon_cs.c
> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> @@ -195,6 +195,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
>   	if (p->cs_flags & RADEON_CS_USE_VM)
>   		p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm,
>   					      &p->validated);
> +
>   	if (need_mmap_lock)
>   		down_read(&current->mm->mmap_sem);
>   
> @@ -571,7 +572,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
>   	if (parser->ring == R600_RING_TYPE_UVD_INDEX)
>   		radeon_uvd_note_usage(rdev);
>   
> -	mutex_lock(&vm->mutex);
>   	r = radeon_bo_vm_update_pte(parser, vm);
>   	if (r) {
>   		goto out;
> @@ -592,7 +592,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
>   	}
>   
>   out:
> -	mutex_unlock(&vm->mutex);
>   	return r;
>   }
>   
> @@ -696,6 +695,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
>   	}
>   
>   	r = radeon_cs_ib_fill(rdev, &parser);
> +	if (parser.cs_flags & RADEON_CS_USE_VM)
> +		mutex_lock(&parser.ib.vm->lock);
>   	if (!r) {
>   		r = radeon_cs_parser_relocs(&parser);
>   		if (r && r != -ERESTARTSYS)
> @@ -704,6 +705,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
>   
>   	if (r) {
>   		radeon_cs_parser_fini(&parser, r, false);
> +		if (parser.cs_flags & RADEON_CS_USE_VM)
> +			mutex_unlock(&parser.ib.vm->lock);
>   		up_read(&rdev->exclusive_lock);
>   		r = radeon_cs_handle_lockup(rdev, r);
>   		return r;
> @@ -721,6 +724,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
>   	}
>   out:
>   	radeon_cs_parser_fini(&parser, r, true);
> +	if (parser.cs_flags & RADEON_CS_USE_VM)
> +		mutex_unlock(&parser.ib.vm->lock);
>   	up_read(&rdev->exclusive_lock);
>   	r = radeon_cs_handle_lockup(rdev, r);
>   	return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
> index 6162bd2..4eafec6 100644
> --- a/drivers/gpu/drm/radeon/radeon_gem.c
> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
> @@ -150,8 +150,10 @@ int radeon_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri
>   		return 0;
>   	}
>   
> +	mutex_lock(&vm->lock);
>   	r = radeon_bo_reserve(rbo, false);
>   	if (r) {
> +		mutex_unlock(&vm->lock);
>   		return r;
>   	}
>   
> @@ -162,6 +164,7 @@ int radeon_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri
>   		++bo_va->ref_count;
>   	}
>   	radeon_bo_unreserve(rbo);
> +	mutex_unlock(&vm->lock);
>   
>   	return 0;
>   }
> @@ -180,8 +183,10 @@ void radeon_gem_object_close(struct drm_gem_object *obj,
>   		return;
>   	}
>   
> +	mutex_lock(&vm->lock);
>   	r = radeon_bo_reserve(rbo, true);
>   	if (r) {
> +		mutex_unlock(&vm->lock);
>   		dev_err(rdev->dev, "leaking bo va because "
>   			"we fail to reserve bo (%d)\n", r);
>   		return;
> @@ -193,6 +198,7 @@ void radeon_gem_object_close(struct drm_gem_object *obj,
>   		}
>   	}
>   	radeon_bo_unreserve(rbo);
> +	mutex_unlock(&vm->lock);
>   }
>   
>   static int radeon_gem_handle_lockup(struct radeon_device *rdev, int r)
> @@ -576,17 +582,13 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
>   			goto error_unreserve;
>   	}
>   
> -	mutex_lock(&bo_va->vm->mutex);
>   	r = radeon_vm_clear_freed(rdev, bo_va->vm);
>   	if (r)
> -		goto error_unlock;
> +		goto error_unreserve;
>   
>   	if (bo_va->it.start)
>   		r = radeon_vm_bo_update(rdev, bo_va, &bo_va->bo->tbo.mem);
>   
> -error_unlock:
> -	mutex_unlock(&bo_va->vm->mutex);
> -
>   error_unreserve:
>   	ttm_eu_backoff_reservation(&ticket, &list);
>   
> @@ -662,14 +664,18 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
>   		return -ENOENT;
>   	}
>   	rbo = gem_to_radeon_bo(gobj);
> +	mutex_lock(&fpriv->vm.lock);
>   	r = radeon_bo_reserve(rbo, false);
>   	if (r) {
> +		mutex_unlock(&fpriv->vm.lock);
>   		args->operation = RADEON_VA_RESULT_ERROR;
>   		drm_gem_object_unreference_unlocked(gobj);
>   		return r;
>   	}
>   	bo_va = radeon_vm_bo_find(&fpriv->vm, rbo);
>   	if (!bo_va) {
> +		radeon_bo_unreserve(rbo);
> +		mutex_unlock(&fpriv->vm.lock);
>   		args->operation = RADEON_VA_RESULT_ERROR;
>   		drm_gem_object_unreference_unlocked(gobj);
>   		return -ENOENT;
> @@ -698,6 +704,7 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
>   		args->operation = RADEON_VA_RESULT_ERROR;
>   	}
>   out:
> +	mutex_unlock(&fpriv->vm.lock);
>   	drm_gem_object_unreference_unlocked(gobj);
>   	return r;
>   }
> diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
> index f4dd26a..d994006 100644
> --- a/drivers/gpu/drm/radeon/radeon_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_kms.c
> @@ -613,8 +613,10 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
>   		}
>   
>   		if (rdev->accel_working) {
> +			mutex_lock(&vm->lock);
>   			r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
>   			if (r) {
> +				mutex_unlock(&vm->lock);
>   				radeon_vm_fini(rdev, vm);
>   				kfree(fpriv);
>   				return r;
> @@ -628,6 +630,7 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
>   						  RADEON_VA_IB_OFFSET,
>   						  RADEON_VM_PAGE_READABLE |
>   						  RADEON_VM_PAGE_SNOOPED);
> +			mutex_unlock(&vm->lock);
>   			if (r) {
>   				radeon_vm_fini(rdev, vm);
>   				kfree(fpriv);
> @@ -662,12 +665,14 @@ void radeon_driver_postclose_kms(struct drm_device *dev,
>   		int r;
>   
>   		if (rdev->accel_working) {
> +			mutex_lock(&vm->lock);
>   			r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
>   			if (!r) {
>   				if (vm->ib_bo_va)
>   					radeon_vm_bo_rmv(rdev, vm->ib_bo_va);
>   				radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
>   			}
> +			mutex_unlock(&vm->lock);
>   		}
>   
>   		radeon_vm_fini(rdev, vm);
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index cde48c4..658183f 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -172,7 +172,7 @@ struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
>    * Allocate an id for the vm (cayman+).
>    * Returns the fence we need to sync to (if any).
>    *
> - * Global and local mutex must be locked!
> + * Mutex must be locked!
>    */
>   struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
>   				       struct radeon_vm *vm, int ring)
> @@ -231,7 +231,7 @@ struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
>    *
>    * Flush the vm (cayman+).
>    *
> - * Global and local mutex must be locked!
> + * Mutex must be locked!
>    */
>   void radeon_vm_flush(struct radeon_device *rdev,
>   		     struct radeon_vm *vm,
> @@ -263,7 +263,7 @@ void radeon_vm_flush(struct radeon_device *rdev,
>    * Fence the vm (cayman+).
>    * Set the fence used to protect page table and id.
>    *
> - * Global and local mutex must be locked!
> + * Mutex must be locked!
>    */
>   void radeon_vm_fence(struct radeon_device *rdev,
>   		     struct radeon_vm *vm,
> @@ -314,7 +314,7 @@ struct radeon_bo_va *radeon_vm_bo_find(struct radeon_vm *vm,
>    * Add @bo to the list of bos associated with the vm
>    * Returns newly added bo_va or NULL for failure
>    *
> - * Object has to be reserved!
> + * Mutex must be locked and object has to be reserved!
>    */
>   struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev,
>   				      struct radeon_vm *vm,
> @@ -336,9 +336,7 @@ struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev,
>   	INIT_LIST_HEAD(&bo_va->bo_list);
>   	INIT_LIST_HEAD(&bo_va->vm_status);
>   
> -	mutex_lock(&vm->mutex);
>   	list_add_tail(&bo_va->bo_list, &bo->va);
> -	mutex_unlock(&vm->mutex);
>   
>   	return bo_va;
>   }
> @@ -441,7 +439,8 @@ error_unreserve:
>    * Validate and set the offset requested within the vm address space.
>    * Returns 0 for success, error for failure.
>    *
> - * Object has to be reserved and gets unreserved by this function!
> + * Mutex must be locked and object has to be reserved and gets
> + * unreserved by this function!
>    */
>   int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   			  struct radeon_bo_va *bo_va,
> @@ -472,14 +471,12 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   		eoffset = last_pfn = 0;
>   	}
>   
> -	mutex_lock(&vm->mutex);
>   	if (bo_va->it.start || bo_va->it.last) {
>   		if (bo_va->addr) {
>   			/* add a clone of the bo_va to clear the old address */
>   			struct radeon_bo_va *tmp;
>   			tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
>   			if (!tmp) {
> -				mutex_unlock(&vm->mutex);
>   				return -ENOMEM;
>   			}
>   			tmp->it.start = bo_va->it.start;
> @@ -509,7 +506,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   			dev_err(rdev->dev, "bo %p va 0x%010Lx conflict with "
>   				"(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
>   				soffset, tmp->bo, tmp->it.start, tmp->it.last);
> -			mutex_unlock(&vm->mutex);
>   			return -EINVAL;
>   		}
>   		bo_va->it.start = soffset;
> @@ -537,9 +533,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   		if (vm->page_tables[pt_idx].bo)
>   			continue;
>   
> -		/* drop mutex to allocate and clear page table */
> -		mutex_unlock(&vm->mutex);
> -
>   		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
>   				     RADEON_GPU_PAGE_SIZE, true,
>   				     RADEON_GEM_DOMAIN_VRAM, 0,
> @@ -554,21 +547,10 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   			return r;
>   		}
>   
> -		/* aquire mutex again */
> -		mutex_lock(&vm->mutex);
> -		if (vm->page_tables[pt_idx].bo) {
> -			/* someone else allocated the pt in the meantime */
> -			mutex_unlock(&vm->mutex);
> -			radeon_bo_unref(&pt);
> -			mutex_lock(&vm->mutex);
> -			continue;
> -		}
> -
>   		vm->page_tables[pt_idx].addr = 0;
>   		vm->page_tables[pt_idx].bo = pt;
>   	}
>   
> -	mutex_unlock(&vm->mutex);
>   	return 0;
>   }
>   
> @@ -627,7 +609,7 @@ static uint32_t radeon_vm_page_flags(uint32_t flags)
>    * and updates the page directory (cayman+).
>    * Returns 0 for success, error for failure.
>    *
> - * Global and local mutex must be locked!
> + * Mutex must be locked!
>    */
>   int radeon_vm_update_page_directory(struct radeon_device *rdev,
>   				    struct radeon_vm *vm)
> @@ -717,8 +699,6 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
>    * @pe_end: last PTE to handle
>    * @addr: addr those PTEs should point to
>    * @flags: hw mapping flags
> - *
> - * Global and local mutex must be locked!
>    */
>   static void radeon_vm_frag_ptes(struct radeon_device *rdev,
>   				struct radeon_ib *ib,
> @@ -798,7 +778,6 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev,
>    *
>    * Update the page tables in the range @start - @end (cayman+).
>    *
> - * Global and local mutex must be locked!
>    */
>   static int radeon_vm_update_ptes(struct radeon_device *rdev,
>   				 struct radeon_vm *vm,
> @@ -870,7 +849,6 @@ static int radeon_vm_update_ptes(struct radeon_device *rdev,
>    *
>    * Fence the page tables in the range @start - @end (cayman+).
>    *
> - * Global and local mutex must be locked!
>    */
>   static void radeon_vm_fence_pts(struct radeon_vm *vm,
>   				uint64_t start, uint64_t end,
> @@ -896,7 +874,7 @@ static void radeon_vm_fence_pts(struct radeon_vm *vm,
>    * Fill in the page table entries for @bo (cayman+).
>    * Returns 0 for success, -EINVAL for failure.
>    *
> - * Object have to be reserved and mutex must be locked!
> + * Mutex must be locked and BOs have to be reserved!
>    */
>   int radeon_vm_bo_update(struct radeon_device *rdev,
>   			struct radeon_bo_va *bo_va,
> @@ -1097,7 +1075,7 @@ int radeon_vm_clear_invalids(struct radeon_device *rdev,
>    *
>    * Remove @bo_va->bo from the requested vm (cayman+).
>    *
> - * Object have to be reserved!
> + * Mutex must be locked and object has to be reserved!
>    */
>   void radeon_vm_bo_rmv(struct radeon_device *rdev,
>   		      struct radeon_bo_va *bo_va)
> @@ -1106,7 +1084,6 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
>   
>   	list_del(&bo_va->bo_list);
>   
> -	mutex_lock(&vm->mutex);
>   	interval_tree_remove(&bo_va->it, &vm->va);
>   	spin_lock(&vm->status_lock);
>   	list_del(&bo_va->vm_status);
> @@ -1119,8 +1096,6 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
>   		kfree(bo_va);
>   	}
>   	spin_unlock(&vm->status_lock);
> -
> -	mutex_unlock(&vm->mutex);
>   }
>   
>   /**
> @@ -1168,7 +1143,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
>   		vm->ids[i].flushed_updates = NULL;
>   		vm->ids[i].last_id_use = NULL;
>   	}
> -	mutex_init(&vm->mutex);
> +	mutex_init(&vm->lock);
>   	vm->va = RB_ROOT;
>   	spin_lock_init(&vm->status_lock);
>   	INIT_LIST_HEAD(&vm->invalidated);
> @@ -1245,5 +1220,5 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm)
>   		radeon_fence_unref(&vm->ids[i].last_id_use);
>   	}
>   
> -	mutex_destroy(&vm->mutex);
> +	mutex_destroy(&vm->lock);
>   }

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

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

* Re: [PATCH 5/7] drm/radeon: add spinlock for BO_VA status protection
  2014-11-27 13:48 ` [PATCH 5/7] drm/radeon: add spinlock for BO_VA status protection Christian König
@ 2014-11-28  2:52   ` Dieter Nützel
  0 siblings, 0 replies; 10+ messages in thread
From: Dieter Nützel @ 2014-11-28  2:52 UTC (permalink / raw)
  To: Christian König; +Cc: dri-devel

Am 27.11.2014 14:48, schrieb Christian König:
> From: Christian König <christian.koenig@amd.com>
> 
> Stop using the VM mutex for this
> 
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>  drivers/gpu/drm/radeon/radeon.h    |  3 +++
>  drivers/gpu/drm/radeon/radeon_vm.c | 36 
> ++++++++++++++++++++++++++++++------
>  2 files changed, 33 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/radeon.h 
> b/drivers/gpu/drm/radeon/radeon.h
> index da1c549..3680cf0 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -929,6 +929,9 @@ struct radeon_vm {
> 
>  	struct rb_root		va;
> 
> +	/* ptotecting invalidated and freed */

protecting

> +	spinlock_t		status_lock;
> +
>  	/* BOs moved, but not yet updated in the PT */
>  	struct list_head	invalidated;
> 
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c
> b/drivers/gpu/drm/radeon/radeon_vm.c
> index 6bc3821..cde48c4 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -487,7 +487,9 @@ int radeon_vm_bo_set_addr(struct radeon_device 
> *rdev,
>  			tmp->vm = vm;
>  			tmp->addr = bo_va->addr;
>  			tmp->bo = radeon_bo_ref(bo_va->bo);
> +			spin_lock(&vm->status_lock);
>  			list_add(&tmp->vm_status, &vm->freed);
> +			spin_unlock(&vm->status_lock);
>  		}
> 
>  		interval_tree_remove(&bo_va->it, &vm->va);
> @@ -913,7 +915,9 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
>  		return -EINVAL;
>  	}
> 
> +	spin_lock(&vm->status_lock);
>  	list_del_init(&bo_va->vm_status);
> +	spin_unlock(&vm->status_lock);
> 
>  	bo_va->flags &= ~RADEON_VM_PAGE_VALID;
>  	bo_va->flags &= ~RADEON_VM_PAGE_SYSTEM;
> @@ -1028,17 +1032,25 @@ int radeon_vm_bo_update(struct radeon_device 
> *rdev,
>  int radeon_vm_clear_freed(struct radeon_device *rdev,
>  			  struct radeon_vm *vm)
>  {
> -	struct radeon_bo_va *bo_va, *tmp;
> +	struct radeon_bo_va *bo_va;
>  	int r;
> 
> -	list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) {
> +	spin_lock(&vm->status_lock);
> +	while (!list_empty(&vm->freed)) {
> +		bo_va = list_first_entry(&vm->freed,
> +			struct radeon_bo_va, vm_status);
> +		spin_unlock(&vm->status_lock);
> +
>  		r = radeon_vm_bo_update(rdev, bo_va, NULL);
>  		radeon_bo_unref(&bo_va->bo);
>  		radeon_fence_unref(&bo_va->last_pt_update);
>  		kfree(bo_va);
>  		if (r)
>  			return r;
> +
> +		spin_lock(&vm->status_lock);
>  	}
> +	spin_unlock(&vm->status_lock);
>  	return 0;
> 
>  }
> @@ -1057,14 +1069,23 @@ int radeon_vm_clear_freed(struct radeon_device 
> *rdev,
>  int radeon_vm_clear_invalids(struct radeon_device *rdev,
>  			     struct radeon_vm *vm)
>  {
> -	struct radeon_bo_va *bo_va, *tmp;
> +	struct radeon_bo_va *bo_va;
>  	int r;
> 
> -	list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, vm_status) {
> +	spin_lock(&vm->status_lock);
> +	while (!list_empty(&vm->invalidated)) {
> +		bo_va = list_first_entry(&vm->invalidated,
> +			struct radeon_bo_va, vm_status);
> +		spin_unlock(&vm->status_lock);
> +
>  		r = radeon_vm_bo_update(rdev, bo_va, NULL);
>  		if (r)
>  			return r;
> +
> +		spin_lock(&vm->status_lock);
>  	}
> +	spin_unlock(&vm->status_lock);
> +
>  	return 0;
>  }
> 
> @@ -1087,6 +1108,7 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
> 
>  	mutex_lock(&vm->mutex);
>  	interval_tree_remove(&bo_va->it, &vm->va);
> +	spin_lock(&vm->status_lock);
>  	list_del(&bo_va->vm_status);
> 
>  	if (bo_va->addr) {
> @@ -1096,6 +1118,7 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
>  		radeon_fence_unref(&bo_va->last_pt_update);
>  		kfree(bo_va);
>  	}
> +	spin_unlock(&vm->status_lock);
> 
>  	mutex_unlock(&vm->mutex);
>  }
> @@ -1116,10 +1139,10 @@ void radeon_vm_bo_invalidate(struct 
> radeon_device *rdev,
> 
>  	list_for_each_entry(bo_va, &bo->va, bo_list) {
>  		if (bo_va->addr) {
> -			mutex_lock(&bo_va->vm->mutex);
> +			spin_lock(&bo_va->vm->status_lock);
>  			list_del(&bo_va->vm_status);
>  			list_add(&bo_va->vm_status, &bo_va->vm->invalidated);
> -			mutex_unlock(&bo_va->vm->mutex);
> +			spin_unlock(&bo_va->vm->status_lock);
>  		}
>  	}
>  }
> @@ -1147,6 +1170,7 @@ int radeon_vm_init(struct radeon_device *rdev,
> struct radeon_vm *vm)
>  	}
>  	mutex_init(&vm->mutex);
>  	vm->va = RB_ROOT;
> +	spin_lock_init(&vm->status_lock);
>  	INIT_LIST_HEAD(&vm->invalidated);
>  	INIT_LIST_HEAD(&vm->freed);
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 6/7] drm/radeon: take VM lock before BO locks
  2014-11-27 14:06   ` Christian König
@ 2014-12-01  3:30     ` Alex Deucher
  0 siblings, 0 replies; 10+ messages in thread
From: Alex Deucher @ 2014-12-01  3:30 UTC (permalink / raw)
  To: Christian König; +Cc: Maling list - DRI developers

On Thu, Nov 27, 2014 at 9:06 AM, Christian König
<deathsimple@vodafone.de> wrote:
> Ah, crap. Drop the last two, they are still work in progress.
>
> I was on the wrong branch while sending them,

Added 1-5 to my -next branch including fixing the spelling in the
comment in patch 5.

Thanks,

Alex

> Christian.
>
> Am 27.11.2014 um 14:48 schrieb Christian König:
>
>> From: Christian König <christian.koenig@amd.com>
>>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
>> ---
>>   drivers/gpu/drm/radeon/radeon.h     |  2 +-
>>   drivers/gpu/drm/radeon/radeon_cs.c  |  9 +++++--
>>   drivers/gpu/drm/radeon/radeon_gem.c | 17 ++++++++++----
>>   drivers/gpu/drm/radeon/radeon_kms.c |  5 ++++
>>   drivers/gpu/drm/radeon/radeon_vm.c  | 47
>> +++++++++----------------------------
>>   5 files changed, 36 insertions(+), 44 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon.h
>> b/drivers/gpu/drm/radeon/radeon.h
>> index 3680cf0..699446a 100644
>> --- a/drivers/gpu/drm/radeon/radeon.h
>> +++ b/drivers/gpu/drm/radeon/radeon.h
>> @@ -925,7 +925,7 @@ struct radeon_vm_id {
>>   };
>>     struct radeon_vm {
>> -       struct mutex            mutex;
>> +       struct mutex            lock;
>>         struct rb_root          va;
>>   diff --git a/drivers/gpu/drm/radeon/radeon_cs.c
>> b/drivers/gpu/drm/radeon/radeon_cs.c
>> index fb776cb..7a90378 100644
>> --- a/drivers/gpu/drm/radeon/radeon_cs.c
>> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
>> @@ -195,6 +195,7 @@ static int radeon_cs_parser_relocs(struct
>> radeon_cs_parser *p)
>>         if (p->cs_flags & RADEON_CS_USE_VM)
>>                 p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm,
>>                                               &p->validated);
>> +
>>         if (need_mmap_lock)
>>                 down_read(&current->mm->mmap_sem);
>>   @@ -571,7 +572,6 @@ static int radeon_cs_ib_vm_chunk(struct
>> radeon_device *rdev,
>>         if (parser->ring == R600_RING_TYPE_UVD_INDEX)
>>                 radeon_uvd_note_usage(rdev);
>>   -     mutex_lock(&vm->mutex);
>>         r = radeon_bo_vm_update_pte(parser, vm);
>>         if (r) {
>>                 goto out;
>> @@ -592,7 +592,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device
>> *rdev,
>>         }
>>     out:
>> -       mutex_unlock(&vm->mutex);
>>         return r;
>>   }
>>   @@ -696,6 +695,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void
>> *data, struct drm_file *filp)
>>         }
>>         r = radeon_cs_ib_fill(rdev, &parser);
>> +       if (parser.cs_flags & RADEON_CS_USE_VM)
>> +               mutex_lock(&parser.ib.vm->lock);
>>         if (!r) {
>>                 r = radeon_cs_parser_relocs(&parser);
>>                 if (r && r != -ERESTARTSYS)
>> @@ -704,6 +705,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void
>> *data, struct drm_file *filp)
>>         if (r) {
>>                 radeon_cs_parser_fini(&parser, r, false);
>> +               if (parser.cs_flags & RADEON_CS_USE_VM)
>> +                       mutex_unlock(&parser.ib.vm->lock);
>>                 up_read(&rdev->exclusive_lock);
>>                 r = radeon_cs_handle_lockup(rdev, r);
>>                 return r;
>> @@ -721,6 +724,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void
>> *data, struct drm_file *filp)
>>         }
>>   out:
>>         radeon_cs_parser_fini(&parser, r, true);
>> +       if (parser.cs_flags & RADEON_CS_USE_VM)
>> +               mutex_unlock(&parser.ib.vm->lock);
>>         up_read(&rdev->exclusive_lock);
>>         r = radeon_cs_handle_lockup(rdev, r);
>>         return r;
>> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c
>> b/drivers/gpu/drm/radeon/radeon_gem.c
>> index 6162bd2..4eafec6 100644
>> --- a/drivers/gpu/drm/radeon/radeon_gem.c
>> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
>> @@ -150,8 +150,10 @@ int radeon_gem_object_open(struct drm_gem_object
>> *obj, struct drm_file *file_pri
>>                 return 0;
>>         }
>>   +     mutex_lock(&vm->lock);
>>         r = radeon_bo_reserve(rbo, false);
>>         if (r) {
>> +               mutex_unlock(&vm->lock);
>>                 return r;
>>         }
>>   @@ -162,6 +164,7 @@ int radeon_gem_object_open(struct drm_gem_object
>> *obj, struct drm_file *file_pri
>>                 ++bo_va->ref_count;
>>         }
>>         radeon_bo_unreserve(rbo);
>> +       mutex_unlock(&vm->lock);
>>         return 0;
>>   }
>> @@ -180,8 +183,10 @@ void radeon_gem_object_close(struct drm_gem_object
>> *obj,
>>                 return;
>>         }
>>   +     mutex_lock(&vm->lock);
>>         r = radeon_bo_reserve(rbo, true);
>>         if (r) {
>> +               mutex_unlock(&vm->lock);
>>                 dev_err(rdev->dev, "leaking bo va because "
>>                         "we fail to reserve bo (%d)\n", r);
>>                 return;
>> @@ -193,6 +198,7 @@ void radeon_gem_object_close(struct drm_gem_object
>> *obj,
>>                 }
>>         }
>>         radeon_bo_unreserve(rbo);
>> +       mutex_unlock(&vm->lock);
>>   }
>>     static int radeon_gem_handle_lockup(struct radeon_device *rdev, int r)
>> @@ -576,17 +582,13 @@ static void radeon_gem_va_update_vm(struct
>> radeon_device *rdev,
>>                         goto error_unreserve;
>>         }
>>   -     mutex_lock(&bo_va->vm->mutex);
>>         r = radeon_vm_clear_freed(rdev, bo_va->vm);
>>         if (r)
>> -               goto error_unlock;
>> +               goto error_unreserve;
>>         if (bo_va->it.start)
>>                 r = radeon_vm_bo_update(rdev, bo_va, &bo_va->bo->tbo.mem);
>>   -error_unlock:
>> -       mutex_unlock(&bo_va->vm->mutex);
>> -
>>   error_unreserve:
>>         ttm_eu_backoff_reservation(&ticket, &list);
>>   @@ -662,14 +664,18 @@ int radeon_gem_va_ioctl(struct drm_device *dev,
>> void *data,
>>                 return -ENOENT;
>>         }
>>         rbo = gem_to_radeon_bo(gobj);
>> +       mutex_lock(&fpriv->vm.lock);
>>         r = radeon_bo_reserve(rbo, false);
>>         if (r) {
>> +               mutex_unlock(&fpriv->vm.lock);
>>                 args->operation = RADEON_VA_RESULT_ERROR;
>>                 drm_gem_object_unreference_unlocked(gobj);
>>                 return r;
>>         }
>>         bo_va = radeon_vm_bo_find(&fpriv->vm, rbo);
>>         if (!bo_va) {
>> +               radeon_bo_unreserve(rbo);
>> +               mutex_unlock(&fpriv->vm.lock);
>>                 args->operation = RADEON_VA_RESULT_ERROR;
>>                 drm_gem_object_unreference_unlocked(gobj);
>>                 return -ENOENT;
>> @@ -698,6 +704,7 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void
>> *data,
>>                 args->operation = RADEON_VA_RESULT_ERROR;
>>         }
>>   out:
>> +       mutex_unlock(&fpriv->vm.lock);
>>         drm_gem_object_unreference_unlocked(gobj);
>>         return r;
>>   }
>> diff --git a/drivers/gpu/drm/radeon/radeon_kms.c
>> b/drivers/gpu/drm/radeon/radeon_kms.c
>> index f4dd26a..d994006 100644
>> --- a/drivers/gpu/drm/radeon/radeon_kms.c
>> +++ b/drivers/gpu/drm/radeon/radeon_kms.c
>> @@ -613,8 +613,10 @@ int radeon_driver_open_kms(struct drm_device *dev,
>> struct drm_file *file_priv)
>>                 }
>>                 if (rdev->accel_working) {
>> +                       mutex_lock(&vm->lock);
>>                         r = radeon_bo_reserve(rdev->ring_tmp_bo.bo,
>> false);
>>                         if (r) {
>> +                               mutex_unlock(&vm->lock);
>>                                 radeon_vm_fini(rdev, vm);
>>                                 kfree(fpriv);
>>                                 return r;
>> @@ -628,6 +630,7 @@ int radeon_driver_open_kms(struct drm_device *dev,
>> struct drm_file *file_priv)
>>                                                   RADEON_VA_IB_OFFSET,
>>                                                   RADEON_VM_PAGE_READABLE
>> |
>>                                                   RADEON_VM_PAGE_SNOOPED);
>> +                       mutex_unlock(&vm->lock);
>>                         if (r) {
>>                                 radeon_vm_fini(rdev, vm);
>>                                 kfree(fpriv);
>> @@ -662,12 +665,14 @@ void radeon_driver_postclose_kms(struct drm_device
>> *dev,
>>                 int r;
>>                 if (rdev->accel_working) {
>> +                       mutex_lock(&vm->lock);
>>                         r = radeon_bo_reserve(rdev->ring_tmp_bo.bo,
>> false);
>>                         if (!r) {
>>                                 if (vm->ib_bo_va)
>>                                         radeon_vm_bo_rmv(rdev,
>> vm->ib_bo_va);
>>                                 radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
>>                         }
>> +                       mutex_unlock(&vm->lock);
>>                 }
>>                 radeon_vm_fini(rdev, vm);
>> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c
>> b/drivers/gpu/drm/radeon/radeon_vm.c
>> index cde48c4..658183f 100644
>> --- a/drivers/gpu/drm/radeon/radeon_vm.c
>> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
>> @@ -172,7 +172,7 @@ struct radeon_bo_list *radeon_vm_get_bos(struct
>> radeon_device *rdev,
>>    * Allocate an id for the vm (cayman+).
>>    * Returns the fence we need to sync to (if any).
>>    *
>> - * Global and local mutex must be locked!
>> + * Mutex must be locked!
>>    */
>>   struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
>>                                        struct radeon_vm *vm, int ring)
>> @@ -231,7 +231,7 @@ struct radeon_fence *radeon_vm_grab_id(struct
>> radeon_device *rdev,
>>    *
>>    * Flush the vm (cayman+).
>>    *
>> - * Global and local mutex must be locked!
>> + * Mutex must be locked!
>>    */
>>   void radeon_vm_flush(struct radeon_device *rdev,
>>                      struct radeon_vm *vm,
>> @@ -263,7 +263,7 @@ void radeon_vm_flush(struct radeon_device *rdev,
>>    * Fence the vm (cayman+).
>>    * Set the fence used to protect page table and id.
>>    *
>> - * Global and local mutex must be locked!
>> + * Mutex must be locked!
>>    */
>>   void radeon_vm_fence(struct radeon_device *rdev,
>>                      struct radeon_vm *vm,
>> @@ -314,7 +314,7 @@ struct radeon_bo_va *radeon_vm_bo_find(struct
>> radeon_vm *vm,
>>    * Add @bo to the list of bos associated with the vm
>>    * Returns newly added bo_va or NULL for failure
>>    *
>> - * Object has to be reserved!
>> + * Mutex must be locked and object has to be reserved!
>>    */
>>   struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev,
>>                                       struct radeon_vm *vm,
>> @@ -336,9 +336,7 @@ struct radeon_bo_va *radeon_vm_bo_add(struct
>> radeon_device *rdev,
>>         INIT_LIST_HEAD(&bo_va->bo_list);
>>         INIT_LIST_HEAD(&bo_va->vm_status);
>>   -     mutex_lock(&vm->mutex);
>>         list_add_tail(&bo_va->bo_list, &bo->va);
>> -       mutex_unlock(&vm->mutex);
>>         return bo_va;
>>   }
>> @@ -441,7 +439,8 @@ error_unreserve:
>>    * Validate and set the offset requested within the vm address space.
>>    * Returns 0 for success, error for failure.
>>    *
>> - * Object has to be reserved and gets unreserved by this function!
>> + * Mutex must be locked and object has to be reserved and gets
>> + * unreserved by this function!
>>    */
>>   int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>>                           struct radeon_bo_va *bo_va,
>> @@ -472,14 +471,12 @@ int radeon_vm_bo_set_addr(struct radeon_device
>> *rdev,
>>                 eoffset = last_pfn = 0;
>>         }
>>   -     mutex_lock(&vm->mutex);
>>         if (bo_va->it.start || bo_va->it.last) {
>>                 if (bo_va->addr) {
>>                         /* add a clone of the bo_va to clear the old
>> address */
>>                         struct radeon_bo_va *tmp;
>>                         tmp = kzalloc(sizeof(struct radeon_bo_va),
>> GFP_KERNEL);
>>                         if (!tmp) {
>> -                               mutex_unlock(&vm->mutex);
>>                                 return -ENOMEM;
>>                         }
>>                         tmp->it.start = bo_va->it.start;
>> @@ -509,7 +506,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>>                         dev_err(rdev->dev, "bo %p va 0x%010Lx conflict
>> with "
>>                                 "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
>>                                 soffset, tmp->bo, tmp->it.start,
>> tmp->it.last);
>> -                       mutex_unlock(&vm->mutex);
>>                         return -EINVAL;
>>                 }
>>                 bo_va->it.start = soffset;
>> @@ -537,9 +533,6 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>>                 if (vm->page_tables[pt_idx].bo)
>>                         continue;
>>   -             /* drop mutex to allocate and clear page table */
>> -               mutex_unlock(&vm->mutex);
>> -
>>                 r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
>>                                      RADEON_GPU_PAGE_SIZE, true,
>>                                      RADEON_GEM_DOMAIN_VRAM, 0,
>> @@ -554,21 +547,10 @@ int radeon_vm_bo_set_addr(struct radeon_device
>> *rdev,
>>                         return r;
>>                 }
>>   -             /* aquire mutex again */
>> -               mutex_lock(&vm->mutex);
>> -               if (vm->page_tables[pt_idx].bo) {
>> -                       /* someone else allocated the pt in the meantime
>> */
>> -                       mutex_unlock(&vm->mutex);
>> -                       radeon_bo_unref(&pt);
>> -                       mutex_lock(&vm->mutex);
>> -                       continue;
>> -               }
>> -
>>                 vm->page_tables[pt_idx].addr = 0;
>>                 vm->page_tables[pt_idx].bo = pt;
>>         }
>>   -     mutex_unlock(&vm->mutex);
>>         return 0;
>>   }
>>   @@ -627,7 +609,7 @@ static uint32_t radeon_vm_page_flags(uint32_t flags)
>>    * and updates the page directory (cayman+).
>>    * Returns 0 for success, error for failure.
>>    *
>> - * Global and local mutex must be locked!
>> + * Mutex must be locked!
>>    */
>>   int radeon_vm_update_page_directory(struct radeon_device *rdev,
>>                                     struct radeon_vm *vm)
>> @@ -717,8 +699,6 @@ int radeon_vm_update_page_directory(struct
>> radeon_device *rdev,
>>    * @pe_end: last PTE to handle
>>    * @addr: addr those PTEs should point to
>>    * @flags: hw mapping flags
>> - *
>> - * Global and local mutex must be locked!
>>    */
>>   static void radeon_vm_frag_ptes(struct radeon_device *rdev,
>>                                 struct radeon_ib *ib,
>> @@ -798,7 +778,6 @@ static void radeon_vm_frag_ptes(struct radeon_device
>> *rdev,
>>    *
>>    * Update the page tables in the range @start - @end (cayman+).
>>    *
>> - * Global and local mutex must be locked!
>>    */
>>   static int radeon_vm_update_ptes(struct radeon_device *rdev,
>>                                  struct radeon_vm *vm,
>> @@ -870,7 +849,6 @@ static int radeon_vm_update_ptes(struct radeon_device
>> *rdev,
>>    *
>>    * Fence the page tables in the range @start - @end (cayman+).
>>    *
>> - * Global and local mutex must be locked!
>>    */
>>   static void radeon_vm_fence_pts(struct radeon_vm *vm,
>>                                 uint64_t start, uint64_t end,
>> @@ -896,7 +874,7 @@ static void radeon_vm_fence_pts(struct radeon_vm *vm,
>>    * Fill in the page table entries for @bo (cayman+).
>>    * Returns 0 for success, -EINVAL for failure.
>>    *
>> - * Object have to be reserved and mutex must be locked!
>> + * Mutex must be locked and BOs have to be reserved!
>>    */
>>   int radeon_vm_bo_update(struct radeon_device *rdev,
>>                         struct radeon_bo_va *bo_va,
>> @@ -1097,7 +1075,7 @@ int radeon_vm_clear_invalids(struct radeon_device
>> *rdev,
>>    *
>>    * Remove @bo_va->bo from the requested vm (cayman+).
>>    *
>> - * Object have to be reserved!
>> + * Mutex must be locked and object has to be reserved!
>>    */
>>   void radeon_vm_bo_rmv(struct radeon_device *rdev,
>>                       struct radeon_bo_va *bo_va)
>> @@ -1106,7 +1084,6 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
>>         list_del(&bo_va->bo_list);
>>   -     mutex_lock(&vm->mutex);
>>         interval_tree_remove(&bo_va->it, &vm->va);
>>         spin_lock(&vm->status_lock);
>>         list_del(&bo_va->vm_status);
>> @@ -1119,8 +1096,6 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
>>                 kfree(bo_va);
>>         }
>>         spin_unlock(&vm->status_lock);
>> -
>> -       mutex_unlock(&vm->mutex);
>>   }
>>     /**
>> @@ -1168,7 +1143,7 @@ int radeon_vm_init(struct radeon_device *rdev,
>> struct radeon_vm *vm)
>>                 vm->ids[i].flushed_updates = NULL;
>>                 vm->ids[i].last_id_use = NULL;
>>         }
>> -       mutex_init(&vm->mutex);
>> +       mutex_init(&vm->lock);
>>         vm->va = RB_ROOT;
>>         spin_lock_init(&vm->status_lock);
>>         INIT_LIST_HEAD(&vm->invalidated);
>> @@ -1245,5 +1220,5 @@ void radeon_vm_fini(struct radeon_device *rdev,
>> struct radeon_vm *vm)
>>                 radeon_fence_unref(&vm->ids[i].last_id_use);
>>         }
>>   -     mutex_destroy(&vm->mutex);
>> +       mutex_destroy(&vm->lock);
>>   }
>
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

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

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-27 13:48 [PATCH 1/7] drm/radeon drop gobj from radeon_cs_reloc Christian König
2014-11-27 13:48 ` [PATCH 2/7] drm/radeon: drop the handle " Christian König
2014-11-27 13:48 ` [PATCH 3/7] drm/radeon: rename radeon_cs_reloc to radeon_bo_list Christian König
2014-11-27 13:48 ` [PATCH 4/7] drm/radeon: fence PT updates as shared Christian König
2014-11-27 13:48 ` [PATCH 5/7] drm/radeon: add spinlock for BO_VA status protection Christian König
2014-11-28  2:52   ` Dieter Nützel
2014-11-27 13:48 ` [PATCH 6/7] drm/radeon: take VM lock before BO locks Christian König
2014-11-27 14:06   ` Christian König
2014-12-01  3:30     ` Alex Deucher
2014-11-27 13:48 ` [PATCH 7/7] drm/radeon: don't allocate PD/PT BO list any more Christian König

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox