2016-12-26 04:18:14

by Jaewon Kim

[permalink] [raw]
Subject: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

There was no bitmap API which returns both next zero index and size of zeros
from that index.

This is helpful to look fragmentation. This is an test code to look size of zeros.
Test result is '10+9+994=>1013 found of total: 1024'

unsigned long search_idx, found_idx, nr_found_tot;
unsigned long bitmap_max;
unsigned int nr_found;
unsigned long *bitmap;

search_idx = nr_found_tot = 0;
bitmap_max = 1024;
bitmap = kzalloc(BITS_TO_LONGS(bitmap_max) * sizeof(long),
GFP_KERNEL);

/* test bitmap_set offset, count */
bitmap_set(bitmap, 10, 1);
bitmap_set(bitmap, 20, 10);

for (;;) {
found_idx = bitmap_find_next_zero_area_and_size(bitmap,
bitmap_max, search_idx, &nr_found);
if (found_idx >= bitmap_max)
break;
if (nr_found_tot == 0)
printk("%u", nr_found);
else
printk("+%u", nr_found);
nr_found_tot += nr_found;
search_idx = found_idx + nr_found;
}
printk("=>%lu found of total: %lu\n", nr_found_tot, bitmap_max);

Signed-off-by: Jaewon Kim <[email protected]>
---
include/linux/bitmap.h | 6 ++++++
lib/bitmap.c | 25 +++++++++++++++++++++++++
2 files changed, 31 insertions(+)

diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
index 3b77588..b724a6c 100644
--- a/include/linux/bitmap.h
+++ b/include/linux/bitmap.h
@@ -46,6 +46,7 @@
* bitmap_clear(dst, pos, nbits) Clear specified bit area
* bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
* bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
+ * bitmap_find_next_zero_area_and_size(buf, len, pos, n, mask) Find bit free area and its size
* bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
* bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
* bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
@@ -123,6 +124,11 @@ extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
unsigned long align_mask,
unsigned long align_offset);

+extern unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
+ unsigned long size,
+ unsigned long start,
+ unsigned int *nr);
+
/**
* bitmap_find_next_zero_area - find a contiguous aligned zero area
* @map: The address to base the search on
diff --git a/lib/bitmap.c b/lib/bitmap.c
index 0b66f0e..d02817c 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -332,6 +332,31 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
}
EXPORT_SYMBOL(bitmap_find_next_zero_area_off);

+/**
+ * bitmap_find_next_zero_area_and_size - find a contiguous aligned zero area
+ * @map: The address to base the search on
+ * @size: The bitmap size in bits
+ * @start: The bitnumber to start searching at
+ * @nr: The number of zeroed bits we've found
+ */
+unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
+ unsigned long size,
+ unsigned long start,
+ unsigned int *nr)
+{
+ unsigned long index, i;
+
+ *nr = 0;
+ index = find_next_zero_bit(map, size, start);
+
+ if (index >= size)
+ return index;
+ i = find_next_bit(map, size, index);
+ *nr = i - index;
+ return index;
+}
+EXPORT_SYMBOL(bitmap_find_next_zero_area_and_size);
+
/*
* Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
* second version by Paul Jackson, third by Joe Korty.
--
1.9.1


2016-12-26 21:18:55

by Michal Nazarewicz

[permalink] [raw]
Subject: Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

On Mon, Dec 26 2016, Jaewon Kim wrote:
> There was no bitmap API which returns both next zero index and size of zeros
> from that index.

Is it really needed? Does it noticeably simplifies callers? Why can’t
caller get the size by themselves if they need it?

>
> This is helpful to look fragmentation. This is an test code to look size of zeros.
> Test result is '10+9+994=>1013 found of total: 1024'
>
> unsigned long search_idx, found_idx, nr_found_tot;
> unsigned long bitmap_max;
> unsigned int nr_found;
> unsigned long *bitmap;
>
> search_idx = nr_found_tot = 0;
> bitmap_max = 1024;
> bitmap = kzalloc(BITS_TO_LONGS(bitmap_max) * sizeof(long),
> GFP_KERNEL);
>
> /* test bitmap_set offset, count */
> bitmap_set(bitmap, 10, 1);
> bitmap_set(bitmap, 20, 10);
>
> for (;;) {
> found_idx = bitmap_find_next_zero_area_and_size(bitmap,
> bitmap_max, search_idx, &nr_found);
> if (found_idx >= bitmap_max)
> break;
> if (nr_found_tot == 0)
> printk("%u", nr_found);
> else
> printk("+%u", nr_found);
> nr_found_tot += nr_found;
> search_idx = found_idx + nr_found;
> }
> printk("=>%lu found of total: %lu\n", nr_found_tot, bitmap_max);
>
> Signed-off-by: Jaewon Kim <[email protected]>
> ---
> include/linux/bitmap.h | 6 ++++++
> lib/bitmap.c | 25 +++++++++++++++++++++++++
> 2 files changed, 31 insertions(+)
>
> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
> index 3b77588..b724a6c 100644
> --- a/include/linux/bitmap.h
> +++ b/include/linux/bitmap.h
> @@ -46,6 +46,7 @@
> * bitmap_clear(dst, pos, nbits) Clear specified bit area
> * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
> * bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
> + * bitmap_find_next_zero_area_and_size(buf, len, pos, n, mask) Find bit free area and its size
> * bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
> * bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
> * bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
> @@ -123,6 +124,11 @@ extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
> unsigned long align_mask,
> unsigned long align_offset);
>
> +extern unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
> + unsigned long size,
> + unsigned long start,
> + unsigned int *nr);
> +
> /**
> * bitmap_find_next_zero_area - find a contiguous aligned zero area
> * @map: The address to base the search on
> diff --git a/lib/bitmap.c b/lib/bitmap.c
> index 0b66f0e..d02817c 100644
> --- a/lib/bitmap.c
> +++ b/lib/bitmap.c
> @@ -332,6 +332,31 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
> }
> EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
>
> +/**
> + * bitmap_find_next_zero_area_and_size - find a contiguous aligned zero area
> + * @map: The address to base the search on
> + * @size: The bitmap size in bits
> + * @start: The bitnumber to start searching at
> + * @nr: The number of zeroed bits we've found
> + */
> +unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
> + unsigned long size,
> + unsigned long start,
> + unsigned int *nr)
> +{
> + unsigned long index, i;
> +
> + *nr = 0;
> + index = find_next_zero_bit(map, size, start);
> +
> + if (index >= size)
> + return index;
> + i = find_next_bit(map, size, index);
> + *nr = i - index;
> + return index;
> +}
> +EXPORT_SYMBOL(bitmap_find_next_zero_area_and_size);
> +
> /*
> * Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
> * second version by Paul Jackson, third by Joe Korty.
> --
> 1.9.1
>

--
Best regards
ミハウ “????????????????86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»

2016-12-27 04:13:44

by Jaewon Kim

[permalink] [raw]
Subject: Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size



On 2016년 12월 27일 06:09, Michal Nazarewicz wrote:
> On Mon, Dec 26 2016, Jaewon Kim wrote:
>> There was no bitmap API which returns both next zero index and size of zeros
>> from that index.
> Is it really needed? Does it noticeably simplifies callers? Why can’t
> caller get the size by themselves if they need it?
Hi thank you for your comment.
As some other functions, this is a helper function to use easily.
Without this patch, we can get the size by using two bitmap functions.
>> This is helpful to look fragmentation. This is an test code to look size of zeros.
>> Test result is '10+9+994=>1013 found of total: 1024'
>>
>> unsigned long search_idx, found_idx, nr_found_tot;
>> unsigned long bitmap_max;
>> unsigned int nr_found;
>> unsigned long *bitmap;
>>
>> search_idx = nr_found_tot = 0;
>> bitmap_max = 1024;
>> bitmap = kzalloc(BITS_TO_LONGS(bitmap_max) * sizeof(long),
>> GFP_KERNEL);
>>
>> /* test bitmap_set offset, count */
>> bitmap_set(bitmap, 10, 1);
>> bitmap_set(bitmap, 20, 10);
>>
>> for (;;) {
>> found_idx = bitmap_find_next_zero_area_and_size(bitmap,
>> bitmap_max, search_idx, &nr_found);
>> if (found_idx >= bitmap_max)
>> break;
>> if (nr_found_tot == 0)
>> printk("%u", nr_found);
>> else
>> printk("+%u", nr_found);
>> nr_found_tot += nr_found;
>> search_idx = found_idx + nr_found;
>> }
>> printk("=>%lu found of total: %lu\n", nr_found_tot, bitmap_max);
>>
>> Signed-off-by: Jaewon Kim <[email protected]>
>> ---
>> include/linux/bitmap.h | 6 ++++++
>> lib/bitmap.c | 25 +++++++++++++++++++++++++
>> 2 files changed, 31 insertions(+)
>>
>> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
>> index 3b77588..b724a6c 100644
>> --- a/include/linux/bitmap.h
>> +++ b/include/linux/bitmap.h
>> @@ -46,6 +46,7 @@
>> * bitmap_clear(dst, pos, nbits) Clear specified bit area
>> * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
>> * bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
>> + * bitmap_find_next_zero_area_and_size(buf, len, pos, n, mask) Find bit free area and its size
>> * bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
>> * bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
>> * bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
>> @@ -123,6 +124,11 @@ extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>> unsigned long align_mask,
>> unsigned long align_offset);
>>
>> +extern unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>> + unsigned long size,
>> + unsigned long start,
>> + unsigned int *nr);
>> +
>> /**
>> * bitmap_find_next_zero_area - find a contiguous aligned zero area
>> * @map: The address to base the search on
>> diff --git a/lib/bitmap.c b/lib/bitmap.c
>> index 0b66f0e..d02817c 100644
>> --- a/lib/bitmap.c
>> +++ b/lib/bitmap.c
>> @@ -332,6 +332,31 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>> }
>> EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
>>
>> +/**
>> + * bitmap_find_next_zero_area_and_size - find a contiguous aligned zero area
>> + * @map: The address to base the search on
>> + * @size: The bitmap size in bits
>> + * @start: The bitnumber to start searching at
>> + * @nr: The number of zeroed bits we've found
>> + */
>> +unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>> + unsigned long size,
>> + unsigned long start,
>> + unsigned int *nr)
>> +{
>> + unsigned long index, i;
>> +
>> + *nr = 0;
>> + index = find_next_zero_bit(map, size, start);
>> +
>> + if (index >= size)
>> + return index;
>> + i = find_next_bit(map, size, index);
>> + *nr = i - index;
>> + return index;
>> +}
>> +EXPORT_SYMBOL(bitmap_find_next_zero_area_and_size);
>> +
>> /*
>> * Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
>> * second version by Paul Jackson, third by Joe Korty.
>> --
>> 1.9.1
>>

2016-12-27 10:05:49

by Michal Hocko

[permalink] [raw]
Subject: Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

On Mon 26-12-16 13:18:11, Jaewon Kim wrote:
> There was no bitmap API which returns both next zero index and size of zeros
> from that index.
>
> This is helpful to look fragmentation. This is an test code to look size of zeros.
> Test result is '10+9+994=>1013 found of total: 1024'
>
> unsigned long search_idx, found_idx, nr_found_tot;
> unsigned long bitmap_max;
> unsigned int nr_found;
> unsigned long *bitmap;
>
> search_idx = nr_found_tot = 0;
> bitmap_max = 1024;
> bitmap = kzalloc(BITS_TO_LONGS(bitmap_max) * sizeof(long),
> GFP_KERNEL);
>
> /* test bitmap_set offset, count */
> bitmap_set(bitmap, 10, 1);
> bitmap_set(bitmap, 20, 10);
>
> for (;;) {
> found_idx = bitmap_find_next_zero_area_and_size(bitmap,
> bitmap_max, search_idx, &nr_found);
> if (found_idx >= bitmap_max)
> break;
> if (nr_found_tot == 0)
> printk("%u", nr_found);
> else
> printk("+%u", nr_found);
> nr_found_tot += nr_found;
> search_idx = found_idx + nr_found;
> }
> printk("=>%lu found of total: %lu\n", nr_found_tot, bitmap_max);

Who is going to use this function? I do not see any caller introduced by
this patch.

> Signed-off-by: Jaewon Kim <[email protected]>
> ---
> include/linux/bitmap.h | 6 ++++++
> lib/bitmap.c | 25 +++++++++++++++++++++++++
> 2 files changed, 31 insertions(+)
>
> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
> index 3b77588..b724a6c 100644
> --- a/include/linux/bitmap.h
> +++ b/include/linux/bitmap.h
> @@ -46,6 +46,7 @@
> * bitmap_clear(dst, pos, nbits) Clear specified bit area
> * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
> * bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
> + * bitmap_find_next_zero_area_and_size(buf, len, pos, n, mask) Find bit free area and its size
> * bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
> * bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
> * bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
> @@ -123,6 +124,11 @@ extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
> unsigned long align_mask,
> unsigned long align_offset);
>
> +extern unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
> + unsigned long size,
> + unsigned long start,
> + unsigned int *nr);
> +
> /**
> * bitmap_find_next_zero_area - find a contiguous aligned zero area
> * @map: The address to base the search on
> diff --git a/lib/bitmap.c b/lib/bitmap.c
> index 0b66f0e..d02817c 100644
> --- a/lib/bitmap.c
> +++ b/lib/bitmap.c
> @@ -332,6 +332,31 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
> }
> EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
>
> +/**
> + * bitmap_find_next_zero_area_and_size - find a contiguous aligned zero area
> + * @map: The address to base the search on
> + * @size: The bitmap size in bits
> + * @start: The bitnumber to start searching at
> + * @nr: The number of zeroed bits we've found
> + */
> +unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
> + unsigned long size,
> + unsigned long start,
> + unsigned int *nr)
> +{
> + unsigned long index, i;
> +
> + *nr = 0;
> + index = find_next_zero_bit(map, size, start);
> +
> + if (index >= size)
> + return index;
> + i = find_next_bit(map, size, index);
> + *nr = i - index;
> + return index;
> +}
> +EXPORT_SYMBOL(bitmap_find_next_zero_area_and_size);
> +
> /*
> * Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
> * second version by Paul Jackson, third by Joe Korty.
> --
> 1.9.1
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to [email protected]. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

--
Michal Hocko
SUSE Labs

2016-12-28 04:40:48

by Jaewon Kim

[permalink] [raw]
Subject: Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size



On 2016년 12월 27일 19:05, Michal Hocko wrote:
> On Mon 26-12-16 13:18:11, Jaewon Kim wrote:
>> There was no bitmap API which returns both next zero index and size of zeros
>> from that index.
>>
>> This is helpful to look fragmentation. This is an test code to look size of zeros.
>> Test result is '10+9+994=>1013 found of total: 1024'
>>
>> unsigned long search_idx, found_idx, nr_found_tot;
>> unsigned long bitmap_max;
>> unsigned int nr_found;
>> unsigned long *bitmap;
>>
>> search_idx = nr_found_tot = 0;
>> bitmap_max = 1024;
>> bitmap = kzalloc(BITS_TO_LONGS(bitmap_max) * sizeof(long),
>> GFP_KERNEL);
>>
>> /* test bitmap_set offset, count */
>> bitmap_set(bitmap, 10, 1);
>> bitmap_set(bitmap, 20, 10);
>>
>> for (;;) {
>> found_idx = bitmap_find_next_zero_area_and_size(bitmap,
>> bitmap_max, search_idx, &nr_found);
>> if (found_idx >= bitmap_max)
>> break;
>> if (nr_found_tot == 0)
>> printk("%u", nr_found);
>> else
>> printk("+%u", nr_found);
>> nr_found_tot += nr_found;
>> search_idx = found_idx + nr_found;
>> }
>> printk("=>%lu found of total: %lu\n", nr_found_tot, bitmap_max);
> Who is going to use this function? I do not see any caller introduced by
> this patch.
Hi
I did not add caller in this patch.
I am using the patch in cma_alloc function like below to show available page status.
+ printk("number of available pages: ");
+ start = 0;
+ for (;;) {
+ bitmap_no = bitmap_find_next_zero_area_and_size(cma->bitmap,
+ cma->count, start, &nr);
+ if (bitmap_no >= cma->count)
+ break;
+ if (nr_total == 0)
+ printk("%u", nr);
+ else
+ printk("+%u", nr);
+ nr_total += nr;
+ start = bitmap_no + nr;
+ }
+ printk("=>%u pages, total: %lu pages\n", nr_total, cma->count);
>
>> Signed-off-by: Jaewon Kim <[email protected]>
>> ---
>> include/linux/bitmap.h | 6 ++++++
>> lib/bitmap.c | 25 +++++++++++++++++++++++++
>> 2 files changed, 31 insertions(+)
>>
>> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
>> index 3b77588..b724a6c 100644
>> --- a/include/linux/bitmap.h
>> +++ b/include/linux/bitmap.h
>> @@ -46,6 +46,7 @@
>> * bitmap_clear(dst, pos, nbits) Clear specified bit area
>> * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
>> * bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
>> + * bitmap_find_next_zero_area_and_size(buf, len, pos, n, mask) Find bit free area and its size
>> * bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
>> * bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
>> * bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
>> @@ -123,6 +124,11 @@ extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>> unsigned long align_mask,
>> unsigned long align_offset);
>>
>> +extern unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>> + unsigned long size,
>> + unsigned long start,
>> + unsigned int *nr);
>> +
>> /**
>> * bitmap_find_next_zero_area - find a contiguous aligned zero area
>> * @map: The address to base the search on
>> diff --git a/lib/bitmap.c b/lib/bitmap.c
>> index 0b66f0e..d02817c 100644
>> --- a/lib/bitmap.c
>> +++ b/lib/bitmap.c
>> @@ -332,6 +332,31 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>> }
>> EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
>>
>> +/**
>> + * bitmap_find_next_zero_area_and_size - find a contiguous aligned zero area
>> + * @map: The address to base the search on
>> + * @size: The bitmap size in bits
>> + * @start: The bitnumber to start searching at
>> + * @nr: The number of zeroed bits we've found
>> + */
>> +unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>> + unsigned long size,
>> + unsigned long start,
>> + unsigned int *nr)
>> +{
>> + unsigned long index, i;
>> +
>> + *nr = 0;
>> + index = find_next_zero_bit(map, size, start);
>> +
>> + if (index >= size)
>> + return index;
>> + i = find_next_bit(map, size, index);
>> + *nr = i - index;
>> + return index;
>> +}
>> +EXPORT_SYMBOL(bitmap_find_next_zero_area_and_size);
>> +
>> /*
>> * Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
>> * second version by Paul Jackson, third by Joe Korty.
>> --
>> 1.9.1
>>
>> --
>> To unsubscribe, send a message with 'unsubscribe linux-mm' in
>> the body to [email protected]. For more info on Linux MM,
>> see: http://www.linux-mm.org/ .
>> Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

2016-12-28 08:32:18

by Michal Hocko

[permalink] [raw]
Subject: Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

On Wed 28-12-16 13:41:24, Jaewon Kim wrote:
>
>
> On 2016년 12월 27일 19:05, Michal Hocko wrote:
[...]
> > Who is going to use this function? I do not see any caller introduced by
> > this patch.
>
> Hi
> I did not add caller in this patch.

it is preferable to add the caller(s) in the same patch to see the
benefit of the new helper.
--
Michal Hocko
SUSE Labs

2016-12-28 14:14:24

by Michal Nazarewicz

[permalink] [raw]
Subject: Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

On Wed, Dec 28 2016, Jaewon Kim wrote:
> I did not add caller in this patch.
> I am using the patch in cma_alloc function like below to show
> available page status.
>
> + printk("number of available pages: ");
> + start = 0;
> + for (;;) {
> + bitmap_no = bitmap_find_next_zero_area_and_size(cma->bitmap,
> + cma->count, start, &nr);
> + if (bitmap_no >= cma->count)
> + break;
> + if (nr_total == 0)
> + printk("%u", nr);
> + else
> + printk("+%u", nr);
> + nr_total += nr;
> + start = bitmap_no + nr;
> + }
> + printk("=>%u pages, total: %lu pages\n", nr_total, cma->count);

I would be happier should you find other existing places where this
function can be used. With just one caller, I’m not convinced it is
worth it.

>>> Signed-off-by: Jaewon Kim <[email protected]>

The code itself is good, so

Acked-by: Michal Nazarewicz <[email protected]>

and I’ll leave deciding whether it improves the kernel overall to
maintainers. ;)

>>> ---
>>> include/linux/bitmap.h | 6 ++++++
>>> lib/bitmap.c | 25 +++++++++++++++++++++++++
>>> 2 files changed, 31 insertions(+)
>>>
>>> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
>>> index 3b77588..b724a6c 100644
>>> --- a/include/linux/bitmap.h
>>> +++ b/include/linux/bitmap.h
>>> @@ -46,6 +46,7 @@
>>> * bitmap_clear(dst, pos, nbits) Clear specified bit area
>>> * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
>>> * bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
>>> + * bitmap_find_next_zero_area_and_size(buf, len, pos, n, mask) Find bit free area and its size
>>> * bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
>>> * bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
>>> * bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
>>> @@ -123,6 +124,11 @@ extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>>> unsigned long align_mask,
>>> unsigned long align_offset);
>>>
>>> +extern unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>>> + unsigned long size,
>>> + unsigned long start,
>>> + unsigned int *nr);
>>> +
>>> /**
>>> * bitmap_find_next_zero_area - find a contiguous aligned zero area
>>> * @map: The address to base the search on
>>> diff --git a/lib/bitmap.c b/lib/bitmap.c
>>> index 0b66f0e..d02817c 100644
>>> --- a/lib/bitmap.c
>>> +++ b/lib/bitmap.c
>>> @@ -332,6 +332,31 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>>> }
>>> EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
>>>
>>> +/**
>>> + * bitmap_find_next_zero_area_and_size - find a contiguous aligned zero area
>>> + * @map: The address to base the search on
>>> + * @size: The bitmap size in bits
>>> + * @start: The bitnumber to start searching at
>>> + * @nr: The number of zeroed bits we've found
>>> + */
>>> +unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>>> + unsigned long size,
>>> + unsigned long start,
>>> + unsigned int *nr)
>>> +{
>>> + unsigned long index, i;
>>> +
>>> + *nr = 0;
>>> + index = find_next_zero_bit(map, size, start);
>>> +
>>> + if (index >= size)
>>> + return index;

I would remove this check. find_next_bit handles situation when index
== size and without this early return, *nr is always set.

>>> + i = find_next_bit(map, size, index);
>>> + *nr = i - index;
>>> + return index;
>>> +}
>>> +EXPORT_SYMBOL(bitmap_find_next_zero_area_and_size);
>>> +
>>> /*
>>> * Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
>>> * second version by Paul Jackson, third by Joe Korty.
>>> --
>>> 1.9.1
>>>
>>> --
>>> To unsubscribe, send a message with 'unsubscribe linux-mm' in
>>> the body to [email protected]. For more info on Linux MM,
>>> see: http://www.linux-mm.org/ .
>>> Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
>

--
Best regards
ミハウ “????????????????86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»

2016-12-29 02:12:32

by Jaewon Kim

[permalink] [raw]
Subject: Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

Hello Mical Hocko and Michal Nazarewicz

Thank you for your comment.
I agree with you on that the new bitmap API may not be used widely yet.
Let me give up the bitmap API and resend another patch regarding CMA allocation failure.

Thank you.

On 2016년 12월 28일 23:14, Michal Nazarewicz wrote:
> On Wed, Dec 28 2016, Jaewon Kim wrote:
>> I did not add caller in this patch.
>> I am using the patch in cma_alloc function like below to show
>> available page status.
>>
>> + printk("number of available pages: ");
>> + start = 0;
>> + for (;;) {
>> + bitmap_no = bitmap_find_next_zero_area_and_size(cma->bitmap,
>> + cma->count, start, &nr);
>> + if (bitmap_no >= cma->count)
>> + break;
>> + if (nr_total == 0)
>> + printk("%u", nr);
>> + else
>> + printk("+%u", nr);
>> + nr_total += nr;
>> + start = bitmap_no + nr;
>> + }
>> + printk("=>%u pages, total: %lu pages\n", nr_total, cma->count);
> I would be happier should you find other existing places where this
> function can be used. With just one caller, I’m not convinced it is
> worth it.
>
>>>> Signed-off-by: Jaewon Kim <[email protected]>
> The code itself is good, so
>
> Acked-by: Michal Nazarewicz <[email protected]>
>
> and I’ll leave deciding whether it improves the kernel overall to
> maintainers. ;)
>
>>>> ---
>>>> include/linux/bitmap.h | 6 ++++++
>>>> lib/bitmap.c | 25 +++++++++++++++++++++++++
>>>> 2 files changed, 31 insertions(+)
>>>>
>>>> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
>>>> index 3b77588..b724a6c 100644
>>>> --- a/include/linux/bitmap.h
>>>> +++ b/include/linux/bitmap.h
>>>> @@ -46,6 +46,7 @@
>>>> * bitmap_clear(dst, pos, nbits) Clear specified bit area
>>>> * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
>>>> * bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
>>>> + * bitmap_find_next_zero_area_and_size(buf, len, pos, n, mask) Find bit free area and its size
>>>> * bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
>>>> * bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
>>>> * bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src)
>>>> @@ -123,6 +124,11 @@ extern unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>>>> unsigned long align_mask,
>>>> unsigned long align_offset);
>>>>
>>>> +extern unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>>>> + unsigned long size,
>>>> + unsigned long start,
>>>> + unsigned int *nr);
>>>> +
>>>> /**
>>>> * bitmap_find_next_zero_area - find a contiguous aligned zero area
>>>> * @map: The address to base the search on
>>>> diff --git a/lib/bitmap.c b/lib/bitmap.c
>>>> index 0b66f0e..d02817c 100644
>>>> --- a/lib/bitmap.c
>>>> +++ b/lib/bitmap.c
>>>> @@ -332,6 +332,31 @@ unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
>>>> }
>>>> EXPORT_SYMBOL(bitmap_find_next_zero_area_off);
>>>>
>>>> +/**
>>>> + * bitmap_find_next_zero_area_and_size - find a contiguous aligned zero area
>>>> + * @map: The address to base the search on
>>>> + * @size: The bitmap size in bits
>>>> + * @start: The bitnumber to start searching at
>>>> + * @nr: The number of zeroed bits we've found
>>>> + */
>>>> +unsigned long bitmap_find_next_zero_area_and_size(unsigned long *map,
>>>> + unsigned long size,
>>>> + unsigned long start,
>>>> + unsigned int *nr)
>>>> +{
>>>> + unsigned long index, i;
>>>> +
>>>> + *nr = 0;
>>>> + index = find_next_zero_bit(map, size, start);
>>>> +
>>>> + if (index >= size)
>>>> + return index;
> I would remove this check. find_next_bit handles situation when index
> == size and without this early return, *nr is always set.
>
>>>> + i = find_next_bit(map, size, index);
>>>> + *nr = i - index;
>>>> + return index;
>>>> +}
>>>> +EXPORT_SYMBOL(bitmap_find_next_zero_area_and_size);
>>>> +
>>>> /*
>>>> * Bitmap printing & parsing functions: first version by Nadia Yvette Chambers,
>>>> * second version by Paul Jackson, third by Joe Korty.
>>>> --
>>>> 1.9.1
>>>>
>>>> --
>>>> To unsubscribe, send a message with 'unsubscribe linux-mm' in
>>>> the body to [email protected]. For more info on Linux MM,
>>>> see: http://www.linux-mm.org/ .
>>>> Don't email: <a href=mailto:"[email protected]"> [email protected] </a>