[Intel-gfx] [PATCH 1/1] drm/i915: eliminate 'temp' in gen8_for_each_{pdd, pdpe, pml4e} macros

Daniel Vetter daniel at ffwll.ch
Thu Dec 10 00:39:22 PST 2015


On Tue, Dec 08, 2015 at 01:30:51PM +0000, Dave Gordon wrote:
> All of these iterator macros require a 'temp' argument, used merely to
> hold internal partial results. We can instead declare the temporary
> variable inside the macro, so the caller need not provide it.
> 
> Some of the old code contained nested iterators that actually reused the
> same 'temp' variable for both inner and outer instances. It's quite
> surprising that this didn't introduce bugs! But it does show that the
> value of 'temp' isn't required to persist during the iterated body.
> 
> Signed-off-by: Dave Gordon <david.s.gordon at intel.com>

Queued for -next, thanks for the patch.
-Daniel

> ---
>  drivers/gpu/drm/i915/i915_gem_gtt.c | 39 ++++++++++++++---------------
>  drivers/gpu/drm/i915/i915_gem_gtt.h | 49 +++++++++++++++++--------------------
>  2 files changed, 41 insertions(+), 47 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 1f7e6b9..c25e8b0 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -770,10 +770,10 @@ static void gen8_ppgtt_clear_range(struct i915_address_space *vm,
>  		gen8_ppgtt_clear_pte_range(vm, &ppgtt->pdp, start, length,
>  					   scratch_pte);
>  	} else {
> -		uint64_t templ4, pml4e;
> +		uint64_t pml4e;
>  		struct i915_page_directory_pointer *pdp;
>  
> -		gen8_for_each_pml4e(pdp, &ppgtt->pml4, start, length, templ4, pml4e) {
> +		gen8_for_each_pml4e(pdp, &ppgtt->pml4, start, length, pml4e) {
>  			gen8_ppgtt_clear_pte_range(vm, pdp, start, length,
>  						   scratch_pte);
>  		}
> @@ -839,10 +839,10 @@ static void gen8_ppgtt_insert_entries(struct i915_address_space *vm,
>  					      cache_level);
>  	} else {
>  		struct i915_page_directory_pointer *pdp;
> -		uint64_t templ4, pml4e;
> +		uint64_t pml4e;
>  		uint64_t length = (uint64_t)pages->orig_nents << PAGE_SHIFT;
>  
> -		gen8_for_each_pml4e(pdp, &ppgtt->pml4, start, length, templ4, pml4e) {
> +		gen8_for_each_pml4e(pdp, &ppgtt->pml4, start, length, pml4e) {
>  			gen8_ppgtt_insert_pte_entries(vm, pdp, &sg_iter,
>  						      start, cache_level);
>  		}
> @@ -1020,10 +1020,9 @@ static int gen8_ppgtt_alloc_pagetabs(struct i915_address_space *vm,
>  {
>  	struct drm_device *dev = vm->dev;
>  	struct i915_page_table *pt;
> -	uint64_t temp;
>  	uint32_t pde;
>  
> -	gen8_for_each_pde(pt, pd, start, length, temp, pde) {
> +	gen8_for_each_pde(pt, pd, start, length, pde) {
>  		/* Don't reallocate page tables */
>  		if (test_bit(pde, pd->used_pdes)) {
>  			/* Scratch is never allocated this way */
> @@ -1082,13 +1081,12 @@ gen8_ppgtt_alloc_page_directories(struct i915_address_space *vm,
>  {
>  	struct drm_device *dev = vm->dev;
>  	struct i915_page_directory *pd;
> -	uint64_t temp;
>  	uint32_t pdpe;
>  	uint32_t pdpes = I915_PDPES_PER_PDP(dev);
>  
>  	WARN_ON(!bitmap_empty(new_pds, pdpes));
>  
> -	gen8_for_each_pdpe(pd, pdp, start, length, temp, pdpe) {
> +	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
>  		if (test_bit(pdpe, pdp->used_pdpes))
>  			continue;
>  
> @@ -1136,12 +1134,11 @@ gen8_ppgtt_alloc_page_dirpointers(struct i915_address_space *vm,
>  {
>  	struct drm_device *dev = vm->dev;
>  	struct i915_page_directory_pointer *pdp;
> -	uint64_t temp;
>  	uint32_t pml4e;
>  
>  	WARN_ON(!bitmap_empty(new_pdps, GEN8_PML4ES_PER_PML4));
>  
> -	gen8_for_each_pml4e(pdp, pml4, start, length, temp, pml4e) {
> +	gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
>  		if (!test_bit(pml4e, pml4->used_pml4es)) {
>  			pdp = alloc_pdp(dev);
>  			if (IS_ERR(pdp))
> @@ -1225,7 +1222,6 @@ static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
>  	struct i915_page_directory *pd;
>  	const uint64_t orig_start = start;
>  	const uint64_t orig_length = length;
> -	uint64_t temp;
>  	uint32_t pdpe;
>  	uint32_t pdpes = I915_PDPES_PER_PDP(dev);
>  	int ret;
> @@ -1252,7 +1248,7 @@ static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
>  	}
>  
>  	/* For every page directory referenced, allocate page tables */
> -	gen8_for_each_pdpe(pd, pdp, start, length, temp, pdpe) {
> +	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
>  		ret = gen8_ppgtt_alloc_pagetabs(vm, pd, start, length,
>  						new_page_tables + pdpe * BITS_TO_LONGS(I915_PDES));
>  		if (ret)
> @@ -1264,7 +1260,7 @@ static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
>  
>  	/* Allocations have completed successfully, so set the bitmaps, and do
>  	 * the mappings. */
> -	gen8_for_each_pdpe(pd, pdp, start, length, temp, pdpe) {
> +	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
>  		gen8_pde_t *const page_directory = kmap_px(pd);
>  		struct i915_page_table *pt;
>  		uint64_t pd_len = length;
> @@ -1274,7 +1270,7 @@ static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
>  		/* Every pd should be allocated, we just did that above. */
>  		WARN_ON(!pd);
>  
> -		gen8_for_each_pde(pt, pd, pd_start, pd_len, temp, pde) {
> +		gen8_for_each_pde(pt, pd, pd_start, pd_len, pde) {
>  			/* Same reasoning as pd */
>  			WARN_ON(!pt);
>  			WARN_ON(!pd_len);
> @@ -1311,6 +1307,8 @@ static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
>  
>  err_out:
>  	while (pdpe--) {
> +		unsigned long temp;
> +
>  		for_each_set_bit(temp, new_page_tables + pdpe *
>  				BITS_TO_LONGS(I915_PDES), I915_PDES)
>  			free_pt(dev, pdp->page_directory[pdpe]->page_table[temp]);
> @@ -1333,7 +1331,7 @@ static int gen8_alloc_va_range_4lvl(struct i915_address_space *vm,
>  	struct i915_hw_ppgtt *ppgtt =
>  			container_of(vm, struct i915_hw_ppgtt, base);
>  	struct i915_page_directory_pointer *pdp;
> -	uint64_t temp, pml4e;
> +	uint64_t pml4e;
>  	int ret = 0;
>  
>  	/* Do the pml4 allocations first, so we don't need to track the newly
> @@ -1352,7 +1350,7 @@ static int gen8_alloc_va_range_4lvl(struct i915_address_space *vm,
>  	     "The allocation has spanned more than 512GB. "
>  	     "It is highly likely this is incorrect.");
>  
> -	gen8_for_each_pml4e(pdp, pml4, start, length, temp, pml4e) {
> +	gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
>  		WARN_ON(!pdp);
>  
>  		ret = gen8_alloc_va_range_3lvl(vm, pdp, start, length);
> @@ -1392,10 +1390,9 @@ static void gen8_dump_pdp(struct i915_page_directory_pointer *pdp,
>  			  struct seq_file *m)
>  {
>  	struct i915_page_directory *pd;
> -	uint64_t temp;
>  	uint32_t pdpe;
>  
> -	gen8_for_each_pdpe(pd, pdp, start, length, temp, pdpe) {
> +	gen8_for_each_pdpe(pd, pdp, start, length, pdpe) {
>  		struct i915_page_table *pt;
>  		uint64_t pd_len = length;
>  		uint64_t pd_start = start;
> @@ -1405,7 +1402,7 @@ static void gen8_dump_pdp(struct i915_page_directory_pointer *pdp,
>  			continue;
>  
>  		seq_printf(m, "\tPDPE #%d\n", pdpe);
> -		gen8_for_each_pde(pt, pd, pd_start, pd_len, temp, pde) {
> +		gen8_for_each_pde(pt, pd, pd_start, pd_len, pde) {
>  			uint32_t  pte;
>  			gen8_pte_t *pt_vaddr;
>  
> @@ -1455,11 +1452,11 @@ static void gen8_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
>  	if (!USES_FULL_48BIT_PPGTT(vm->dev)) {
>  		gen8_dump_pdp(&ppgtt->pdp, start, length, scratch_pte, m);
>  	} else {
> -		uint64_t templ4, pml4e;
> +		uint64_t pml4e;
>  		struct i915_pml4 *pml4 = &ppgtt->pml4;
>  		struct i915_page_directory_pointer *pdp;
>  
> -		gen8_for_each_pml4e(pdp, pml4, start, length, templ4, pml4e) {
> +		gen8_for_each_pml4e(pdp, pml4, start, length, pml4e) {
>  			if (!test_bit(pml4e, pml4->used_pml4es))
>  				continue;
>  
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 877c32c..b448ad8 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -455,32 +455,29 @@ static inline uint32_t gen6_pde_index(uint32_t addr)
>   * between from start until start + length. On gen8+ it simply iterates
>   * over every page directory entry in a page directory.
>   */
> -#define gen8_for_each_pde(pt, pd, start, length, temp, iter)		\
> -	for (iter = gen8_pde_index(start); \
> -	     length > 0 && iter < I915_PDES ? \
> -			(pt = (pd)->page_table[iter]), 1 : 0; \
> -	     iter++,				\
> -	     temp = ALIGN(start+1, 1 << GEN8_PDE_SHIFT) - start,	\
> -	     temp = min(temp, length),					\
> -	     start += temp, length -= temp)
> -
> -#define gen8_for_each_pdpe(pd, pdp, start, length, temp, iter)	\
> -	for (iter = gen8_pdpe_index(start); \
> -	     length > 0 && (iter < I915_PDPES_PER_PDP(dev)) ? \
> -			(pd = (pdp)->page_directory[iter]), 1 : 0; \
> -	     iter++,				\
> -	     temp = ALIGN(start+1, 1 << GEN8_PDPE_SHIFT) - start,	\
> -	     temp = min(temp, length),					\
> -	     start += temp, length -= temp)
> -
> -#define gen8_for_each_pml4e(pdp, pml4, start, length, temp, iter)	\
> -	for (iter = gen8_pml4e_index(start);	\
> -	     length > 0 && iter < GEN8_PML4ES_PER_PML4 ? \
> -			(pdp = (pml4)->pdps[iter]), 1 : 0; \
> -	     iter++,				\
> -	     temp = ALIGN(start+1, 1ULL << GEN8_PML4E_SHIFT) - start,	\
> -	     temp = min(temp, length),					\
> -	     start += temp, length -= temp)
> +#define gen8_for_each_pde(pt, pd, start, length, iter)			\
> +	for (iter = gen8_pde_index(start);				\
> +	     length > 0 && iter < I915_PDES &&				\
> +		(pt = (pd)->page_table[iter], true);			\
> +	     ({ u64 temp = ALIGN(start+1, 1 << GEN8_PDE_SHIFT);		\
> +		    temp = min(temp - start, length);			\
> +		    start += temp, length -= temp; }), ++iter)
> +
> +#define gen8_for_each_pdpe(pd, pdp, start, length, iter)		\
> +	for (iter = gen8_pdpe_index(start);				\
> +	     length > 0 && iter < I915_PDPES_PER_PDP(dev) &&		\
> +		(pd = (pdp)->page_directory[iter], true);		\
> +	     ({ u64 temp = ALIGN(start+1, 1 << GEN8_PDPE_SHIFT);	\
> +		    temp = min(temp - start, length);			\
> +		    start += temp, length -= temp; }), ++iter)
> +
> +#define gen8_for_each_pml4e(pdp, pml4, start, length, iter)		\
> +	for (iter = gen8_pml4e_index(start);				\
> +	     length > 0 && iter < GEN8_PML4ES_PER_PML4 &&		\
> +		(pdp = (pml4)->pdps[iter], true);			\
> +	     ({ u64 temp = ALIGN(start+1, 1ULL << GEN8_PML4E_SHIFT);	\
> +		    temp = min(temp - start, length);			\
> +		    start += temp, length -= temp; }), ++iter)
>  
>  static inline uint32_t gen8_pte_index(uint64_t address)
>  {
> -- 
> 1.9.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the Intel-gfx mailing list