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 at 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

Reply via email to