[PATCH 11/11] drm/i915/gtt: Use NULL to indicate scratch entries

Chris Wilson chris at chris-wilson.co.uk
Sat Jul 6 22:23:59 UTC 2019


add/remove: 0/0 grow/shrink: 2/9 up/down: 9/-214 (-205)
Function                                     old     new   delta
__gen8_ppgtt_clear                           671     677      +6
release_pd_entry                             247     250      +3
pd_vma_unbind                                136     129      -7
__alloc_pd                                    71      64      -7
__gen8_ppgtt_alloc                          1223    1213     -10
gen6_ppgtt_cleanup                           174     163     -11
gen8_ppgtt_insert_4lvl                      1731    1716     -15
gen8_ppgtt_insert_3lvl                       646     626     -20
__gen8_ppgtt_cleanup                         131     103     -28
gen6_alloc_va_range                          853     803     -50
__ppgtt_create                              2214    2148     -66

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem_gtt.c | 59 +++++++++++------------------
 1 file changed, 22 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 0c98fe2b2795..169ac37c7e5a 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -719,13 +719,11 @@ static struct i915_page_directory *__alloc_pd(void)
 {
 	struct i915_page_directory *pd;
 
-	pd = kmalloc(sizeof(*pd), I915_GFP_ALLOW_FAIL);
+	pd = kzalloc(sizeof(*pd), I915_GFP_ALLOW_FAIL);
 	if (unlikely(!pd))
 		return NULL;
 
-	atomic_set(px_used(pd), 0);
 	spin_lock_init(&pd->lock);
-
 	return pd;
 }
 
@@ -753,13 +751,6 @@ static void free_pd(struct i915_address_space *vm, struct i915_page_dma *pd)
 
 #define free_px(vm, px) free_pd(vm, px_base(px))
 
-static void init_pd(struct i915_page_directory *pd,
-		    struct i915_page_scratch *scratch)
-{
-	fill_px(pd, scratch->encode);
-	memset_p(pd->entry, scratch, I915_PDES);
-}
-
 static inline void
 write_dma_entry(struct i915_page_dma * const pdma,
 		const unsigned short pde,
@@ -792,7 +783,7 @@ clear_pd_entry(struct i915_page_directory * const pd,
 	GEM_BUG_ON(!atomic_read(px_used(pd)));
 
 	write_dma_entry(px_base(pd), pde, scratch->encode);
-	pd->entry[pde] = scratch;
+	pd->entry[pde] = NULL;
 	atomic_dec(px_used(pd));
 }
 
@@ -902,11 +893,10 @@ static void __gen8_ppgtt_cleanup(struct i915_address_space *vm,
 				 int count, int lvl)
 {
 	if (lvl) {
-		struct i915_page_scratch *scratch = &vm->scratch[lvl];
 		void **pde = pd->entry;
 
 		do {
-			if (*pde == scratch)
+			if (!*pde)
 				continue;
 
 			__gen8_ppgtt_cleanup(vm, *pde, I915_PDES, lvl - 1);
@@ -954,7 +944,7 @@ static void __gen8_ppgtt_clear(struct i915_address_space *vm,
 	do {
 		struct i915_page_table *pt = pd->entry[idx];
 
-		GEM_BUG_ON(pd->entry[idx] == scratch);
+		GEM_BUG_ON(!pd->entry[idx]);
 
 		if (atomic_fetch_inc(&pt->used) >> pd_lvl(1) &&
 		    gen8_pd_index(*start, lvl - 1) == 0 &&
@@ -994,8 +984,7 @@ static int __gen8_ppgtt_alloc(struct i915_address_space *vm,
 	do {
 		GEM_BUG_ON(!atomic_read(px_used(pd))); /* Must be pinned! */
 		pt = pd->entry[idx];
-
-		if (px_base(pt) == px_base(scratch)) {
+		if (!pt) {
 			spin_unlock(&pd->lock);
 
 			pt = fetch_and_zero(&alloc);
@@ -1008,7 +997,7 @@ static int __gen8_ppgtt_alloc(struct i915_address_space *vm,
 					}
 				}
 
-				init_pd(as_pd(pt), &vm->scratch[lvl]);
+				fill_px(as_pd(pt), vm->scratch[lvl].encode);
 			} else {
 				if (!pt) {
 					pt = alloc_pt(vm);
@@ -1024,7 +1013,7 @@ static int __gen8_ppgtt_alloc(struct i915_address_space *vm,
 			}
 
 			spin_lock(&pd->lock);
-			if (likely(pd->entry[idx] == scratch))
+			if (likely(!pd->entry[idx]))
 				set_pd_entry(pd, idx, pt);
 			else
 				alloc = pt, pt = pd->entry[idx];
@@ -1097,10 +1086,10 @@ gen8_ppgtt_insert_pte_entries(struct i915_ppgtt *ppgtt,
 	const gen8_pte_t pte_encode = gen8_pte_encode(0, cache_level, flags);
 	gen8_pte_t *vaddr;
 
+	GEM_BUG_ON(!pdp->entry[pde_idx(idx, 2)]);
 	pd = i915_pd_entry(pdp, pde_idx(idx, 2));
-	GEM_BUG_ON(px_base(pd) == px_base(&ppgtt->vm.scratch[2]));
-	GEM_BUG_ON(pd->entry[pde_idx(idx, 1)] == &ppgtt->vm.scratch[1]);
 
+	GEM_BUG_ON(!pd->entry[pde_idx(idx, 1)]);
 	vaddr = kmap_atomic_px(i915_pt_entry(pd, pde_idx(idx, 1)));
 	do {
 		vaddr[pde_idx(idx, 0)] = pte_encode | iter->dma;
@@ -1123,12 +1112,12 @@ gen8_ppgtt_insert_pte_entries(struct i915_ppgtt *ppgtt,
 				if (pde_idx(idx, 2) == 0)
 					break;
 
+				GEM_BUG_ON(!pdp->entry[pde_idx(idx, 2)]);
 				pd = pdp->entry[pde_idx(idx, 2)];
-				GEM_BUG_ON(px_base(pd) == px_base(&ppgtt->vm.scratch[2]));
 			}
 
 			kunmap_atomic(vaddr);
-			GEM_BUG_ON(pd->entry[pde_idx(idx, 1)] == &ppgtt->vm.scratch[1]);
+			GEM_BUG_ON(!pd->entry[pde_idx(idx, 1)]);
 			vaddr = kmap_atomic_px(i915_pt_entry(pd, pde_idx(idx, 1)));
 		}
 	} while (1);
@@ -1360,7 +1349,7 @@ static int gen8_preallocate_top_level_pdp(struct i915_ppgtt *ppgtt)
 		if (IS_ERR(pde))
 			goto unwind;
 
-		init_pd(pde, &vm->scratch[1]);
+		fill_px(pde, vm->scratch[1].encode);
 		set_pd_entry(pd, idx, &pde->pt);
 	}
 
@@ -1409,8 +1398,6 @@ gen8_alloc_top_pd(struct i915_address_space *vm)
 	memset64(vaddr, vm->scratch[top].encode, count);
 	kunmap_atomic(vaddr);
 
-	memset_p(pd->entry, &vm->scratch[top], count);
-
 	atomic_inc(px_used(pd)); /* mark as pinned */
 	return pd;
 }
@@ -1649,7 +1636,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
 	gen6_for_each_pde(pt, pd, start, length, pde) {
 		const unsigned int count = gen6_pte_count(start, length);
 
-		if (px_base(pt) == px_base(&vm->scratch[1])) {
+		if (!pt) {
 			spin_unlock(&pd->lock);
 
 			pt = fetch_and_zero(&alloc);
@@ -1663,7 +1650,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
 			fill32_px(pt, vm->scratch[0].encode);
 
 			spin_lock(&pd->lock);
-			if (pd->entry[pde] == &vm->scratch[1]) {
+			if (!pd->entry[pde]) {
 				pd->entry[pde] = pt;
 				if (i915_vma_is_bound(ppgtt->vma,
 						      I915_VMA_GLOBAL_BIND)) {
@@ -1699,7 +1686,6 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
 static int gen6_ppgtt_init_scratch(struct gen6_ppgtt *ppgtt)
 {
 	struct i915_address_space * const vm = &ppgtt->base.vm;
-	struct i915_page_directory * const pd = ppgtt->base.pd;
 	int ret;
 
 	ret = setup_scratch_page(vm, __GFP_HIGHMEM);
@@ -1716,8 +1702,6 @@ static int gen6_ppgtt_init_scratch(struct gen6_ppgtt *ppgtt)
 	}
 
 	fill_page_dma_32(px_base(&vm->scratch[1]), vm->scratch[0].encode);
-	memset_p(pd->entry, &vm->scratch[1], I915_PDES);
-
 	return 0;
 }
 
@@ -1727,9 +1711,12 @@ static void gen6_ppgtt_free_pd(struct gen6_ppgtt *ppgtt)
 	struct i915_page_table *pt;
 	u32 pde;
 
-	gen6_for_all_pdes(pt, pd, pde)
-		if (px_base(pt) != px_base(&ppgtt->base.vm.scratch[1]))
-			free_px(&ppgtt->base.vm, pt);
+	gen6_for_all_pdes(pt, pd, pde) {
+		if (!pt)
+			continue;
+
+		free_px(&ppgtt->base.vm, pt);
+	}
 }
 
 static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
@@ -1786,8 +1773,6 @@ static void pd_vma_unbind(struct i915_vma *vma)
 {
 	struct gen6_ppgtt *ppgtt = vma->private;
 	struct i915_page_directory * const pd = ppgtt->base.pd;
-	struct i915_page_dma * const scratch =
-		px_base(&ppgtt->base.vm.scratch[1]);
 	struct i915_page_table *pt;
 	unsigned int pde;
 
@@ -1796,11 +1781,11 @@ static void pd_vma_unbind(struct i915_vma *vma)
 
 	/* Free all no longer used page tables */
 	gen6_for_all_pdes(pt, ppgtt->base.pd, pde) {
-		if (px_base(pt) == scratch || atomic_read(&pt->used))
+		if (!pt || atomic_read(&pt->used))
 			continue;
 
 		free_px(&ppgtt->base.vm, pt);
-		pd->entry[pde] = scratch;
+		pd->entry[pde] = NULL;
 	}
 
 	ppgtt->scan_for_unused_pt = false;
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list