[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