[PATCH 1/4] drm/mm: add "best_match" to drm_mm_insert_node()

Daniel Vetter daniel at ffwll.ch
Thu Jul 25 07:15:10 PDT 2013


On Thu, Jul 25, 2013 at 03:55:59PM +0200, David Herrmann wrote:
> Add a "best_match" argument similar to the drm_mm_search_*() helpers so we
> can convert TTM to use them in follow up patches. We can also inline the
> non-generic helpers and move them into the header to allow compile-time
> optimizations.
> 
> Signed-off-by: David Herrmann <dh.herrmann at gmail.com>
> ---
>  drivers/gpu/drm/drm_mm.c          | 23 ++++-------------------
>  drivers/gpu/drm/drm_vma_manager.c |  4 ++--
>  drivers/gpu/drm/i915/i915_gem.c   |  3 ++-
>  drivers/gpu/drm/sis/sis_mm.c      |  4 ++--
>  drivers/gpu/drm/via/via_mm.c      |  4 ++--
>  include/drm/drm_mm.h              | 38 ++++++++++++++++++++++++++------------
>  6 files changed, 38 insertions(+), 38 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
> index fe304f9..5aad736 100644
> --- a/drivers/gpu/drm/drm_mm.c
> +++ b/drivers/gpu/drm/drm_mm.c
> @@ -212,12 +212,12 @@ EXPORT_SYMBOL(drm_mm_get_block_generic);
>   */
>  int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
>  			       unsigned long size, unsigned alignment,
> -			       unsigned long color)
> +			       unsigned long color, bool best_match)

Hm, we have a patch in the queue to add a top-down allocator mode, see:

http://www.mail-archive.com/dri-devel@lists.freedesktop.org/msg40556.html

So if we go to the trouble of changing all callers I'd vote for a unsinged
int flags parameter and #define DRM_MM_BEST_MATCH (1 << 0)

Then we could add the top-down flag without another tree-wide change.

Note that the above patch needs to be rebased onto your series here anyway
since it still tries to cope with GFP_ATOMIC allocations and the
preallocation dance. So imo it's best if your series here goes in first.

Otherwise this looks good.
-Daniel

>  {
>  	struct drm_mm_node *hole_node;
>  
>  	hole_node = drm_mm_search_free_generic(mm, size, alignment,
> -					       color, 0);
> +					       color, best_match);
>  	if (!hole_node)
>  		return -ENOSPC;
>  
> @@ -226,13 +226,6 @@ int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
>  }
>  EXPORT_SYMBOL(drm_mm_insert_node_generic);
>  
> -int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
> -		       unsigned long size, unsigned alignment)
> -{
> -	return drm_mm_insert_node_generic(mm, node, size, alignment, 0);
> -}
> -EXPORT_SYMBOL(drm_mm_insert_node);
> -
>  static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
>  				       struct drm_mm_node *node,
>  				       unsigned long size, unsigned alignment,
> @@ -313,13 +306,13 @@ EXPORT_SYMBOL(drm_mm_get_block_range_generic);
>   */
>  int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *node,
>  					unsigned long size, unsigned alignment, unsigned long color,
> -					unsigned long start, unsigned long end)
> +					unsigned long start, unsigned long end, bool best_match)
>  {
>  	struct drm_mm_node *hole_node;
>  
>  	hole_node = drm_mm_search_free_in_range_generic(mm,
>  							size, alignment, color,
> -							start, end, 0);
> +							start, end, best_match);
>  	if (!hole_node)
>  		return -ENOSPC;
>  
> @@ -330,14 +323,6 @@ int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *n
>  }
>  EXPORT_SYMBOL(drm_mm_insert_node_in_range_generic);
>  
> -int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
> -				unsigned long size, unsigned alignment,
> -				unsigned long start, unsigned long end)
> -{
> -	return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, 0, start, end);
> -}
> -EXPORT_SYMBOL(drm_mm_insert_node_in_range);
> -
>  /**
>   * Remove a memory node from the allocator.
>   */
> diff --git a/drivers/gpu/drm/drm_vma_manager.c b/drivers/gpu/drm/drm_vma_manager.c
> index b966cea..4285b38 100644
> --- a/drivers/gpu/drm/drm_vma_manager.c
> +++ b/drivers/gpu/drm/drm_vma_manager.c
> @@ -241,8 +241,8 @@ int drm_vma_offset_add(struct drm_vma_offset_manager *mgr,
>  		goto out_unlock;
>  	}
>  
> -	ret = drm_mm_insert_node_generic(&mgr->vm_addr_space_mm,
> -					 &node->vm_node, pages, 0, 0);
> +	ret = drm_mm_insert_node(&mgr->vm_addr_space_mm, &node->vm_node,
> +				 pages, 0, false);
>  	if (ret)
>  		goto out_unlock;
>  
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 8673a00..6667322 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3092,7 +3092,8 @@ search_free:
>  	ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space,
>  						  &obj->gtt_space,
>  						  size, alignment,
> -						  obj->cache_level, 0, gtt_max);
> +						  obj->cache_level, 0, gtt_max,
> +						  false);
>  	if (ret) {
>  		ret = i915_gem_evict_something(dev, size, alignment,
>  					       obj->cache_level,
> diff --git a/drivers/gpu/drm/sis/sis_mm.c b/drivers/gpu/drm/sis/sis_mm.c
> index 9a43d98..85da1a4 100644
> --- a/drivers/gpu/drm/sis/sis_mm.c
> +++ b/drivers/gpu/drm/sis/sis_mm.c
> @@ -109,7 +109,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
>  	if (pool == AGP_TYPE) {
>  		retval = drm_mm_insert_node(&dev_priv->agp_mm,
>  					    &item->mm_node,
> -					    mem->size, 0);
> +					    mem->size, 0, false);
>  		offset = item->mm_node.start;
>  	} else {
>  #if defined(CONFIG_FB_SIS) || defined(CONFIG_FB_SIS_MODULE)
> @@ -121,7 +121,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
>  #else
>  		retval = drm_mm_insert_node(&dev_priv->vram_mm,
>  					    &item->mm_node,
> -					    mem->size, 0);
> +					    mem->size, 0, false);
>  		offset = item->mm_node.start;
>  #endif
>  	}
> diff --git a/drivers/gpu/drm/via/via_mm.c b/drivers/gpu/drm/via/via_mm.c
> index 0ab93ff..10b962e 100644
> --- a/drivers/gpu/drm/via/via_mm.c
> +++ b/drivers/gpu/drm/via/via_mm.c
> @@ -140,11 +140,11 @@ int via_mem_alloc(struct drm_device *dev, void *data,
>  	if (mem->type == VIA_MEM_AGP)
>  		retval = drm_mm_insert_node(&dev_priv->agp_mm,
>  					    &item->mm_node,
> -					    tmpSize, 0);
> +					    tmpSize, 0, false);
>  	else
>  		retval = drm_mm_insert_node(&dev_priv->vram_mm,
>  					    &item->mm_node,
> -					    tmpSize, 0);
> +					    tmpSize, 0, false);
>  	if (retval)
>  		goto fail_alloc;
>  
> diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
> index b87d05e..a30c9aa 100644
> --- a/include/drm/drm_mm.h
> +++ b/include/drm/drm_mm.h
> @@ -186,28 +186,42 @@ static inline struct drm_mm_node *drm_mm_get_block_atomic_range(
>  						start, end, 1);
>  }
>  
> -extern int drm_mm_insert_node(struct drm_mm *mm,
> -			      struct drm_mm_node *node,
> -			      unsigned long size,
> -			      unsigned alignment);
> -extern int drm_mm_insert_node_in_range(struct drm_mm *mm,
> -				       struct drm_mm_node *node,
> -				       unsigned long size,
> -				       unsigned alignment,
> -				       unsigned long start,
> -				       unsigned long end);
>  extern int drm_mm_insert_node_generic(struct drm_mm *mm,
>  				      struct drm_mm_node *node,
>  				      unsigned long size,
>  				      unsigned alignment,
> -				      unsigned long color);
> +				      unsigned long color,
> +				      bool best_match);
> +static inline int drm_mm_insert_node(struct drm_mm *mm,
> +				     struct drm_mm_node *node,
> +				     unsigned long size,
> +				     unsigned alignment,
> +				     bool best_match)
> +{
> +	return drm_mm_insert_node_generic(mm, node, size, alignment, 0,
> +					  best_match);
> +}
> +
>  extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
>  				       struct drm_mm_node *node,
>  				       unsigned long size,
>  				       unsigned alignment,
>  				       unsigned long color,
>  				       unsigned long start,
> -				       unsigned long end);
> +				       unsigned long end,
> +				       bool best_match);
> +static inline int drm_mm_insert_node_in_range(struct drm_mm *mm,
> +					      struct drm_mm_node *node,
> +					      unsigned long size,
> +					      unsigned alignment,
> +					      unsigned long start,
> +					      unsigned long end,
> +					      bool best_match)
> +{
> +	return drm_mm_insert_node_in_range_generic(mm, node, size, alignment,
> +						   0, start, end, best_match);
> +}
> +
>  extern void drm_mm_put_block(struct drm_mm_node *cur);
>  extern void drm_mm_remove_node(struct drm_mm_node *node);
>  extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new);
> -- 
> 1.8.3.3
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list