[PATCH] drm/mm: Fix search for smallest hole satisfying constraints
Daniel Vetter
daniel at ffwll.ch
Tue Mar 18 03:01:30 PDT 2014
On Tue, Mar 18, 2014 at 09:58:14AM +0900, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> entry->size is the size of the node, not the size of the hole after it.
> So the code would actually find the hole which can satisfy the
> constraints and which is preceded by the smallest node, not the smallest
> hole satisfying the constraints.
>
> Reported-by: "Huang, FrankR" <FrankR.Huang at amd.com>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
But drm-next just gained my kerneldoc patch for drm_mm, so can you please
respin your patch and update the docs too? While at it ... could you
perhaps smash a bit of kerneldoc on top of enum drm_mm_search_flags, I
seem to have missed it. With that this is
Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
Thanks, Daniel
> ---
> drivers/gpu/drm/drm_mm.c | 33 +++++++++++++++++----------------
> 1 file changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
> index af93cc5..5d921e5 100644
> --- a/drivers/gpu/drm/drm_mm.c
> +++ b/drivers/gpu/drm/drm_mm.c
> @@ -306,8 +306,8 @@ static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
> {
> struct drm_mm_node *entry;
> struct drm_mm_node *best;
> - unsigned long adj_start;
> - unsigned long adj_end;
> + unsigned long hole_start;
> + unsigned long hole_end;
> unsigned long best_size;
>
> BUG_ON(mm->scanned_blocks);
> @@ -315,7 +315,10 @@ static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
> best = NULL;
> best_size = ~0UL;
>
> - drm_mm_for_each_hole(entry, mm, adj_start, adj_end) {
> + drm_mm_for_each_hole(entry, mm, hole_start, hole_end) {
> + unsigned long adj_start = hole_start;
> + unsigned long adj_end = hole_end;
> +
> if (mm->color_adjust) {
> mm->color_adjust(entry, color, &adj_start, &adj_end);
> if (adj_end <= adj_start)
> @@ -328,9 +331,9 @@ static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
> if (!(flags & DRM_MM_SEARCH_BEST))
> return entry;
>
> - if (entry->size < best_size) {
> + if ((hole_end - hole_start) < best_size) {
> best = entry;
> - best_size = entry->size;
> + best_size = hole_end - hole_start;
> }
> }
>
> @@ -341,14 +344,14 @@ static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_
> unsigned long size,
> unsigned alignment,
> unsigned long color,
> - unsigned long start,
> - unsigned long end,
> + unsigned long range_start,
> + unsigned long range_end,
> enum drm_mm_search_flags flags)
> {
> struct drm_mm_node *entry;
> struct drm_mm_node *best;
> - unsigned long adj_start;
> - unsigned long adj_end;
> + unsigned long hole_start;
> + unsigned long hole_end;
> unsigned long best_size;
>
> BUG_ON(mm->scanned_blocks);
> @@ -356,11 +359,9 @@ static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_
> best = NULL;
> best_size = ~0UL;
>
> - drm_mm_for_each_hole(entry, mm, adj_start, adj_end) {
> - if (adj_start < start)
> - adj_start = start;
> - if (adj_end > end)
> - adj_end = end;
> + drm_mm_for_each_hole(entry, mm, hole_start, hole_end) {
> + unsigned long adj_start = max(hole_start, range_start);
> + unsigned long adj_end = min(hole_end, range_end);
>
> if (mm->color_adjust) {
> mm->color_adjust(entry, color, &adj_start, &adj_end);
> @@ -374,9 +375,9 @@ static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_
> if (!(flags & DRM_MM_SEARCH_BEST))
> return entry;
>
> - if (entry->size < best_size) {
> + if ((hole_end - hole_start) < best_size) {
> best = entry;
> - best_size = entry->size;
> + best_size = hole_end - hole_start;
> }
> }
>
> --
> 1.9.0
>
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the dri-devel
mailing list