[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