Re: [PATCH 5/7] lib: rework bitmap_parse()

From: Andrew Morton
Date: Thu May 23 2019 - 22:54:10 EST


On Thu, 9 May 2019 19:26:33 -0700 Yury Norov <yury.norov@xxxxxxxxx> wrote:

> Hi Andy,
>
> Thanks for thorough review.
>
> On Wed, May 08, 2019 at 11:46:32AM +0300, Andy Shevchenko wrote:
> > On Tue, Apr 30, 2019 at 06:06:34PM -0700, Yury Norov wrote:
> > > bitmap_parse() is ineffective and full of opaque variables and opencoded
> > > parts. It leads to hard understanding and usage of it. This rework
> > > includes:
> > > - remove bitmap_shift_left() call from the cycle. Now it makes the
> > > complexity of the algorithm as O(nbits^2). In the suggested approach
> > > the input string is parsed in reverse direction, so no shifts needed;
> > > - relax requirement on a single comma and no white spaces between chunks.
> > > It is considered useful in scripting, and it aligns with
> > > bitmap_parselist();
> > > - split bitmap_parse() to small readable helpers;
> > > - make an explicit calculation of the end of input line at the
> > > beginning, so users of the bitmap_parse() won't bother doing this.
> >
> > > +static inline bool in_str(const char *start, const char *ptr)
> > > +{
> > > + return start <= ptr;
> > > +}
> > > +
> >
> > The explicit use of the conditional is better.
> >
> > --
> > With Best Regards,
> > Andy Shevchenko
>
> I still think that is_str() is more verbose, but it's minor issue
> anyways, so I obey. Below is the patch that removes the function.
> It's up to Andrew finally, either apply it or not.

I agree with Andy - open-coding the comparisons makes it easier to
understand the varoius in_str() callsites, IMO.

> @@ -653,7 +648,7 @@ int bitmap_parse(const char *start, unsigned int buflen,
> u32 *bitmap = (u32 *)maskp;
> int unset_bit;
>
> - while (in_str(start, (end = bitmap_find_region_reverse(start, end)))) {
> + while (start <= (end = bitmap_find_region_reverse(start, end))) {

This statement hurts my little brain. Can it be broken into easier to digest
chunks?

> if (!chunks--)
> return -EOVERFLOW;
>