Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1547251 > unrolled thread

[PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

Started byJaewon Kim <jaewon31.kim@samsung.com>
First post2016-12-26 05:20 +0100
Last post2016-12-29 03:20 +0100
Articles 8 — 3 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size Jaewon Kim <jaewon31.kim@samsung.com> - 2016-12-26 05:20 +0100
    Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size Michal Nazarewicz <mina86@mina86.com> - 2016-12-26 22:20 +0100
      Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size Jaewon Kim <jaewon31.kim@samsung.com> - 2016-12-27 05:20 +0100
    Re: [PATCH] lib: bitmap: introduce  bitmap_find_next_zero_area_and_size Michal Hocko <mhocko@kernel.org> - 2016-12-27 11:10 +0100
      Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size Jaewon Kim <jaewon31.kim@samsung.com> - 2016-12-28 05:50 +0100
        Re: [PATCH] lib: bitmap: introduce  bitmap_find_next_zero_area_and_size Michal Hocko <mhocko@kernel.org> - 2016-12-28 09:40 +0100
        Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size Michal Nazarewicz <mina86@mina86.com> - 2016-12-28 15:20 +0100
          Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size Jaewon Kim <jaewon31.kim@samsung.com> - 2016-12-29 03:20 +0100

#1547251 — [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

FromJaewon Kim <jaewon31.kim@samsung.com>
Date2016-12-26 05:20 +0100
Subject[PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size
Message-ID<sSuVr-82Y-3@gated-at.bofh.it>
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 <jaewon31.kim@samsung.com>
---
 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

[toc] | [next] | [standalone]


#1547396

FromMichal Nazarewicz <mina86@mina86.com>
Date2016-12-26 22:20 +0100
Message-ID<sSKQx-1Ad-7@gated-at.bofh.it>
In reply to#1547251
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 <jaewon31.kim@samsung.com>
> ---
>  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»

[toc] | [prev] | [next] | [standalone]


#1547489

FromJaewon Kim <jaewon31.kim@samsung.com>
Date2016-12-27 05:20 +0100
Message-ID<sSRoZ-5Fn-3@gated-at.bofh.it>
In reply to#1547396

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 <jaewon31.kim@samsung.com>
>> ---
>>  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
>>

[toc] | [prev] | [next] | [standalone]


#1547539 — Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

FromMichal Hocko <mhocko@kernel.org>
Date2016-12-27 11:10 +0100
SubjectRe: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size
Message-ID<sSWRH-FY-5@gated-at.bofh.it>
In reply to#1547251
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 <jaewon31.kim@samsung.com>
> ---
>  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 majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

-- 
Michal Hocko
SUSE Labs

[toc] | [prev] | [next] | [standalone]


#1547830

FromJaewon Kim <jaewon31.kim@samsung.com>
Date2016-12-28 05:50 +0100
Message-ID<sTelz-3km-3@gated-at.bofh.it>
In reply to#1547539

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 <jaewon31.kim@samsung.com>
>> ---
>>  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 majordomo@kvack.org.  For more info on Linux MM,
>> see: http://www.linux-mm.org/ .
>> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

[toc] | [prev] | [next] | [standalone]


#1547877 — Re: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size

FromMichal Hocko <mhocko@kernel.org>
Date2016-12-28 09:40 +0100
SubjectRe: [PATCH] lib: bitmap: introduce bitmap_find_next_zero_area_and_size
Message-ID<sThWa-5Hm-17@gated-at.bofh.it>
In reply to#1547830
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

[toc] | [prev] | [next] | [standalone]


#1547965

FromMichal Nazarewicz <mina86@mina86.com>
Date2016-12-28 15:20 +0100
Message-ID<sTnfb-PF-1@gated-at.bofh.it>
In reply to#1547830
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 <jaewon31.kim@samsung.com>

The code itself is good, so

Acked-by: Michal Nazarewicz <mina86@mina86.com>

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 majordomo@kvack.org.  For more info on Linux MM,
>>> see: http://www.linux-mm.org/ .
>>> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
>

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

[toc] | [prev] | [next] | [standalone]


#1548049

FromJaewon Kim <jaewon31.kim@samsung.com>
Date2016-12-29 03:20 +0100
Message-ID<sTytX-k0-1@gated-at.bofh.it>
In reply to#1547965
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 <jaewon31.kim@samsung.com>
> The code itself is good, so
>
> Acked-by: Michal Nazarewicz <mina86@mina86.com>
>
> 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 majordomo@kvack.org.  For more info on Linux MM,
>>>> see: http://www.linux-mm.org/ .
>>>> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web