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@xxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx/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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel