From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH] drm/mm: Fix search for smallest hole satisfying constraints Date: Tue, 18 Mar 2014 11:01:30 +0100 Message-ID: <20140318100130.GB30571@phenom.ffwll.local> References: <1395104294-28066-1-git-send-email-michel@daenzer.net> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: Received: from mail-ee0-f54.google.com (mail-ee0-f54.google.com [74.125.83.54]) by gabe.freedesktop.org (Postfix) with ESMTP id 24A8F6EC5C for ; Tue, 18 Mar 2014 03:01:35 -0700 (PDT) Received: by mail-ee0-f54.google.com with SMTP id d49so5112615eek.41 for ; Tue, 18 Mar 2014 03:01:34 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1395104294-28066-1-git-send-email-michel@daenzer.net> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Michel =?iso-8859-1?Q?D=E4nzer?= Cc: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On Tue, Mar 18, 2014 at 09:58:14AM +0900, Michel D=E4nzer wrote: > From: Michel D=E4nzer > = > 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" > Signed-off-by: Michel D=E4nzer 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 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_generi= c(const struct drm_mm *mm, > best =3D NULL; > best_size =3D ~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 =3D hole_start; > + unsigned long adj_end =3D hole_end; > + > if (mm->color_adjust) { > mm->color_adjust(entry, color, &adj_start, &adj_end); > if (adj_end <=3D 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 =3D entry; > - best_size =3D entry->size; > + best_size =3D hole_end - hole_start; > } > } > = > @@ -341,14 +344,14 @@ static struct drm_mm_node *drm_mm_search_free_in_ra= nge_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_ran= ge_generic(const struct drm_ > best =3D NULL; > best_size =3D ~0UL; > = > - drm_mm_for_each_hole(entry, mm, adj_start, adj_end) { > - if (adj_start < start) > - adj_start =3D start; > - if (adj_end > end) > - adj_end =3D end; > + drm_mm_for_each_hole(entry, mm, hole_start, hole_end) { > + unsigned long adj_start =3D max(hole_start, range_start); > + unsigned long adj_end =3D 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_rang= e_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 =3D entry; > - best_size =3D entry->size; > + best_size =3D hole_end - hole_start; > } > } > = > -- = > 1.9.0 > = > = > _______________________________________________ > dri-devel mailing list > dri-devel@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