mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 1/2] swsusp: simplify memory_bm_find_bit()
@ 2008-07-05 11:10 Akinobu Mita
  2008-07-05 11:11 ` [PATCH 2/2] swsusp: simplify memory bitmap Akinobu Mita
  2008-07-07 12:43 ` [PATCH 1/2] swsusp: simplify memory_bm_find_bit() Rafael J. Wysocki
  0 siblings, 2 replies; 5+ messages in thread
From: Akinobu Mita @ 2008-07-05 11:10 UTC (permalink / raw)
  To: linux-kernel; +Cc: Pavel Machek, Rafael J. Wysocki, linux-pm

The bit obtained by the function memory_bm_find_bit() is represented
by addr and bit_nr. The callers of memory_bm_find_bit() just use addr
and bit_nr as the arguments of set_bit/clear_bit/test_bit.

This patch simplifies the representation of the obtained bit without
using BM_BITS_PER_CHUNK.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Pavel Machek <pavel@suse.cz>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: linux-pm@lists.linux-foundation.org
---
 kernel/power/snapshot.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Index: 2.6-git/kernel/power/snapshot.c
===================================================================
--- 2.6-git.orig/kernel/power/snapshot.c
+++ 2.6-git/kernel/power/snapshot.c
@@ -478,8 +478,8 @@ static int memory_bm_find_bit(struct mem
 	}
 	zone_bm->cur_block = bb;
 	pfn -= bb->start_pfn;
-	*bit_nr = pfn % BM_BITS_PER_CHUNK;
-	*addr = bb->data + pfn / BM_BITS_PER_CHUNK;
+	*bit_nr = pfn;
+	*addr = bb->data;
 	return 0;
 }
 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/2] swsusp: simplify memory bitmap
  2008-07-05 11:10 [PATCH 1/2] swsusp: simplify memory_bm_find_bit() Akinobu Mita
@ 2008-07-05 11:11 ` Akinobu Mita
  2008-07-07 12:49   ` Rafael J. Wysocki
  2008-07-07 12:43 ` [PATCH 1/2] swsusp: simplify memory_bm_find_bit() Rafael J. Wysocki
  1 sibling, 1 reply; 5+ messages in thread
From: Akinobu Mita @ 2008-07-05 11:11 UTC (permalink / raw)
  To: linux-kernel; +Cc: Pavel Machek, Rafael J. Wysocki, linux-pm

This patch simplifies the memory bitmap manipulations.

- remove the member size in struct bm_block

It is not necessary for struct bm_block to have the number of bit chunks
that can be calculated by using end_pfn and start_pfn.

- use find_next_bit() for memory_bm_next_pfn

No need to invent the bitmap library only for the memory bitmap.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Pavel Machek <pavel@suse.cz>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: linux-pm@lists.linux-foundation.org
---
 kernel/power/snapshot.c |   84 ++++++++++--------------------------------------
 1 file changed, 19 insertions(+), 65 deletions(-)

Index: 2.6-git/kernel/power/snapshot.c
===================================================================
--- 2.6-git.orig/kernel/power/snapshot.c
+++ 2.6-git/kernel/power/snapshot.c
@@ -205,8 +205,7 @@ static void chain_free(struct chain_allo
  *	objects.  The main list's elements are of type struct zone_bitmap
  *	and each of them corresonds to one zone.  For each zone bitmap
  *	object there is a list of objects of type struct bm_block that
- *	represent each blocks of bit chunks in which information is
- *	stored.
+ *	represent each blocks of bitmap in which information is stored.
  *
  *	struct memory_bitmap contains a pointer to the main list of zone
  *	bitmap objects, a struct bm_position used for browsing the bitmap,
@@ -224,26 +223,27 @@ static void chain_free(struct chain_allo
  *	pfns that correspond to the start and end of the represented zone.
  *
  *	struct bm_block contains a pointer to the memory page in which
- *	information is stored (in the form of a block of bit chunks
- *	of type unsigned long each).  It also contains the pfns that
- *	correspond to the start and end of the represented memory area and
- *	the number of bit chunks in the block.
+ *	information is stored (in the form of a block of bitmap)
+ *	It also contains the pfns that correspond to the start and end of
+ *	the represented memory area.
  */
 
 #define BM_END_OF_MAP	(~0UL)
 
-#define BM_CHUNKS_PER_BLOCK	(PAGE_SIZE / sizeof(long))
-#define BM_BITS_PER_CHUNK	(sizeof(long) << 3)
 #define BM_BITS_PER_BLOCK	(PAGE_SIZE << 3)
 
 struct bm_block {
 	struct bm_block *next;		/* next element of the list */
 	unsigned long start_pfn;	/* pfn represented by the first bit */
 	unsigned long end_pfn;	/* pfn represented by the last bit plus 1 */
-	unsigned int size;	/* number of bit chunks */
-	unsigned long *data;	/* chunks of bits representing pages */
+	unsigned long *data;	/* bitmap representing pages */
 };
 
+static inline unsigned long bm_block_bits(struct bm_block *bb)
+{
+	return bb->end_pfn - bb->start_pfn;
+}
+
 struct zone_bitmap {
 	struct zone_bitmap *next;	/* next element of the list */
 	unsigned long start_pfn;	/* minimal pfn in this zone */
@@ -257,7 +257,6 @@ struct zone_bitmap {
 struct bm_position {
 	struct zone_bitmap *zone_bm;
 	struct bm_block *block;
-	int chunk;
 	int bit;
 };
 
@@ -272,12 +271,6 @@ struct memory_bitmap {
 
 /* Functions that operate on memory bitmaps */
 
-static inline void memory_bm_reset_chunk(struct memory_bitmap *bm)
-{
-	bm->cur.chunk = 0;
-	bm->cur.bit = -1;
-}
-
 static void memory_bm_position_reset(struct memory_bitmap *bm)
 {
 	struct zone_bitmap *zone_bm;
@@ -285,7 +278,7 @@ static void memory_bm_position_reset(str
 	zone_bm = bm->zone_bm_list;
 	bm->cur.zone_bm = zone_bm;
 	bm->cur.block = zone_bm->bm_blocks;
-	memory_bm_reset_chunk(bm);
+	bm->cur.bit = 0;
 }
 
 static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free);
@@ -394,12 +387,10 @@ memory_bm_create(struct memory_bitmap *b
 			bb->start_pfn = pfn;
 			if (nr >= BM_BITS_PER_BLOCK) {
 				pfn += BM_BITS_PER_BLOCK;
-				bb->size = BM_CHUNKS_PER_BLOCK;
 				nr -= BM_BITS_PER_BLOCK;
 			} else {
 				/* This is executed only once in the loop */
 				pfn += nr;
-				bb->size = DIV_ROUND_UP(nr, BM_BITS_PER_CHUNK);
 			}
 			bb->end_pfn = pfn;
 			bb = bb->next;
@@ -528,36 +519,6 @@ static int memory_bm_test_bit(struct mem
 	return test_bit(bit, addr);
 }
 
-/* Two auxiliary functions for memory_bm_next_pfn */
-
-/* Find the first set bit in the given chunk, if there is one */
-
-static inline int next_bit_in_chunk(int bit, unsigned long *chunk_p)
-{
-	bit++;
-	while (bit < BM_BITS_PER_CHUNK) {
-		if (test_bit(bit, chunk_p))
-			return bit;
-
-		bit++;
-	}
-	return -1;
-}
-
-/* Find a chunk containing some bits set in given block of bits */
-
-static inline int next_chunk_in_block(int n, struct bm_block *bb)
-{
-	n++;
-	while (n < bb->size) {
-		if (bb->data[n])
-			return n;
-
-		n++;
-	}
-	return -1;
-}
-
 /**
  *	memory_bm_next_pfn - find the pfn that corresponds to the next set bit
  *	in the bitmap @bm.  If the pfn cannot be found, BM_END_OF_MAP is
@@ -571,40 +532,33 @@ static unsigned long memory_bm_next_pfn(
 {
 	struct zone_bitmap *zone_bm;
 	struct bm_block *bb;
-	int chunk;
 	int bit;
 
 	do {
 		bb = bm->cur.block;
 		do {
-			chunk = bm->cur.chunk;
 			bit = bm->cur.bit;
-			do {
-				bit = next_bit_in_chunk(bit, bb->data + chunk);
-				if (bit >= 0)
-					goto Return_pfn;
-
-				chunk = next_chunk_in_block(chunk, bb);
-				bit = -1;
-			} while (chunk >= 0);
+			bit = find_next_bit(bb->data, bm_block_bits(bb), bit);
+			if (bit < bm_block_bits(bb))
+				goto Return_pfn;
+
 			bb = bb->next;
 			bm->cur.block = bb;
-			memory_bm_reset_chunk(bm);
+			bm->cur.bit = 0;
 		} while (bb);
 		zone_bm = bm->cur.zone_bm->next;
 		if (zone_bm) {
 			bm->cur.zone_bm = zone_bm;
 			bm->cur.block = zone_bm->bm_blocks;
-			memory_bm_reset_chunk(bm);
+			bm->cur.bit = 0;
 		}
 	} while (zone_bm);
 	memory_bm_position_reset(bm);
 	return BM_END_OF_MAP;
 
  Return_pfn:
-	bm->cur.chunk = chunk;
-	bm->cur.bit = bit;
-	return bb->start_pfn + chunk * BM_BITS_PER_CHUNK + bit;
+	bm->cur.bit = bit + 1;
+	return bb->start_pfn + bit;
 }
 
 /**

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] swsusp: simplify memory_bm_find_bit()
  2008-07-05 11:10 [PATCH 1/2] swsusp: simplify memory_bm_find_bit() Akinobu Mita
  2008-07-05 11:11 ` [PATCH 2/2] swsusp: simplify memory bitmap Akinobu Mita
@ 2008-07-07 12:43 ` Rafael J. Wysocki
  1 sibling, 0 replies; 5+ messages in thread
From: Rafael J. Wysocki @ 2008-07-07 12:43 UTC (permalink / raw)
  To: Akinobu Mita; +Cc: linux-kernel, Pavel Machek, linux-pm

On Saturday, 5 of July 2008, Akinobu Mita wrote:
> The bit obtained by the function memory_bm_find_bit() is represented
> by addr and bit_nr. The callers of memory_bm_find_bit() just use addr
> and bit_nr as the arguments of set_bit/clear_bit/test_bit.
> 
> This patch simplifies the representation of the obtained bit without
> using BM_BITS_PER_CHUNK.
> 
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> Cc: Pavel Machek <pavel@suse.cz>
> Cc: Rafael J. Wysocki <rjw@sisk.pl>
> Cc: linux-pm@lists.linux-foundation.org
> ---
>  kernel/power/snapshot.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> Index: 2.6-git/kernel/power/snapshot.c
> ===================================================================
> --- 2.6-git.orig/kernel/power/snapshot.c
> +++ 2.6-git/kernel/power/snapshot.c
> @@ -478,8 +478,8 @@ static int memory_bm_find_bit(struct mem
>  	}
>  	zone_bm->cur_block = bb;
>  	pfn -= bb->start_pfn;
> -	*bit_nr = pfn % BM_BITS_PER_CHUNK;
> -	*addr = bb->data + pfn / BM_BITS_PER_CHUNK;
> +	*bit_nr = pfn;
> +	*addr = bb->data;
>  	return 0;
>  }

Hm, I think it's better to fold that into patch 2/2.

Thanks,
Rafael

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] swsusp: simplify memory bitmap
  2008-07-05 11:11 ` [PATCH 2/2] swsusp: simplify memory bitmap Akinobu Mita
@ 2008-07-07 12:49   ` Rafael J. Wysocki
  2008-07-07 13:26     ` Akinobu Mita
  0 siblings, 1 reply; 5+ messages in thread
From: Rafael J. Wysocki @ 2008-07-07 12:49 UTC (permalink / raw)
  To: Akinobu Mita; +Cc: linux-kernel, Pavel Machek, linux-pm

On Saturday, 5 of July 2008, Akinobu Mita wrote:
> This patch simplifies the memory bitmap manipulations.
> 
> - remove the member size in struct bm_block
> 
> It is not necessary for struct bm_block to have the number of bit chunks
> that can be calculated by using end_pfn and start_pfn.
> 
> - use find_next_bit() for memory_bm_next_pfn
> 
> No need to invent the bitmap library only for the memory bitmap.

Thanks for doing this change, it looks OK.

I haven't have the time to test it yet, but once it's been tested, I'll push
it to Andrew for merging.  I'll fold patch 1/2 into this one.

Thanks,
Rafael


> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> Cc: Pavel Machek <pavel@suse.cz>
> Cc: Rafael J. Wysocki <rjw@sisk.pl>
> Cc: linux-pm@lists.linux-foundation.org
> ---
>  kernel/power/snapshot.c |   84 ++++++++++--------------------------------------
>  1 file changed, 19 insertions(+), 65 deletions(-)
> 
> Index: 2.6-git/kernel/power/snapshot.c
> ===================================================================
> --- 2.6-git.orig/kernel/power/snapshot.c
> +++ 2.6-git/kernel/power/snapshot.c
> @@ -205,8 +205,7 @@ static void chain_free(struct chain_allo
>   *	objects.  The main list's elements are of type struct zone_bitmap
>   *	and each of them corresonds to one zone.  For each zone bitmap
>   *	object there is a list of objects of type struct bm_block that
> - *	represent each blocks of bit chunks in which information is
> - *	stored.
> + *	represent each blocks of bitmap in which information is stored.
>   *
>   *	struct memory_bitmap contains a pointer to the main list of zone
>   *	bitmap objects, a struct bm_position used for browsing the bitmap,
> @@ -224,26 +223,27 @@ static void chain_free(struct chain_allo
>   *	pfns that correspond to the start and end of the represented zone.
>   *
>   *	struct bm_block contains a pointer to the memory page in which
> - *	information is stored (in the form of a block of bit chunks
> - *	of type unsigned long each).  It also contains the pfns that
> - *	correspond to the start and end of the represented memory area and
> - *	the number of bit chunks in the block.
> + *	information is stored (in the form of a block of bitmap)
> + *	It also contains the pfns that correspond to the start and end of
> + *	the represented memory area.
>   */
>  
>  #define BM_END_OF_MAP	(~0UL)
>  
> -#define BM_CHUNKS_PER_BLOCK	(PAGE_SIZE / sizeof(long))
> -#define BM_BITS_PER_CHUNK	(sizeof(long) << 3)
>  #define BM_BITS_PER_BLOCK	(PAGE_SIZE << 3)
>  
>  struct bm_block {
>  	struct bm_block *next;		/* next element of the list */
>  	unsigned long start_pfn;	/* pfn represented by the first bit */
>  	unsigned long end_pfn;	/* pfn represented by the last bit plus 1 */
> -	unsigned int size;	/* number of bit chunks */
> -	unsigned long *data;	/* chunks of bits representing pages */
> +	unsigned long *data;	/* bitmap representing pages */
>  };
>  
> +static inline unsigned long bm_block_bits(struct bm_block *bb)
> +{
> +	return bb->end_pfn - bb->start_pfn;
> +}
> +
>  struct zone_bitmap {
>  	struct zone_bitmap *next;	/* next element of the list */
>  	unsigned long start_pfn;	/* minimal pfn in this zone */
> @@ -257,7 +257,6 @@ struct zone_bitmap {
>  struct bm_position {
>  	struct zone_bitmap *zone_bm;
>  	struct bm_block *block;
> -	int chunk;
>  	int bit;
>  };
>  
> @@ -272,12 +271,6 @@ struct memory_bitmap {
>  
>  /* Functions that operate on memory bitmaps */
>  
> -static inline void memory_bm_reset_chunk(struct memory_bitmap *bm)
> -{
> -	bm->cur.chunk = 0;
> -	bm->cur.bit = -1;
> -}
> -
>  static void memory_bm_position_reset(struct memory_bitmap *bm)
>  {
>  	struct zone_bitmap *zone_bm;
> @@ -285,7 +278,7 @@ static void memory_bm_position_reset(str
>  	zone_bm = bm->zone_bm_list;
>  	bm->cur.zone_bm = zone_bm;
>  	bm->cur.block = zone_bm->bm_blocks;
> -	memory_bm_reset_chunk(bm);
> +	bm->cur.bit = 0;
>  }
>  
>  static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free);
> @@ -394,12 +387,10 @@ memory_bm_create(struct memory_bitmap *b
>  			bb->start_pfn = pfn;
>  			if (nr >= BM_BITS_PER_BLOCK) {
>  				pfn += BM_BITS_PER_BLOCK;
> -				bb->size = BM_CHUNKS_PER_BLOCK;
>  				nr -= BM_BITS_PER_BLOCK;
>  			} else {
>  				/* This is executed only once in the loop */
>  				pfn += nr;
> -				bb->size = DIV_ROUND_UP(nr, BM_BITS_PER_CHUNK);
>  			}
>  			bb->end_pfn = pfn;
>  			bb = bb->next;
> @@ -528,36 +519,6 @@ static int memory_bm_test_bit(struct mem
>  	return test_bit(bit, addr);
>  }
>  
> -/* Two auxiliary functions for memory_bm_next_pfn */
> -
> -/* Find the first set bit in the given chunk, if there is one */
> -
> -static inline int next_bit_in_chunk(int bit, unsigned long *chunk_p)
> -{
> -	bit++;
> -	while (bit < BM_BITS_PER_CHUNK) {
> -		if (test_bit(bit, chunk_p))
> -			return bit;
> -
> -		bit++;
> -	}
> -	return -1;
> -}
> -
> -/* Find a chunk containing some bits set in given block of bits */
> -
> -static inline int next_chunk_in_block(int n, struct bm_block *bb)
> -{
> -	n++;
> -	while (n < bb->size) {
> -		if (bb->data[n])
> -			return n;
> -
> -		n++;
> -	}
> -	return -1;
> -}
> -
>  /**
>   *	memory_bm_next_pfn - find the pfn that corresponds to the next set bit
>   *	in the bitmap @bm.  If the pfn cannot be found, BM_END_OF_MAP is
> @@ -571,40 +532,33 @@ static unsigned long memory_bm_next_pfn(
>  {
>  	struct zone_bitmap *zone_bm;
>  	struct bm_block *bb;
> -	int chunk;
>  	int bit;
>  
>  	do {
>  		bb = bm->cur.block;
>  		do {
> -			chunk = bm->cur.chunk;
>  			bit = bm->cur.bit;
> -			do {
> -				bit = next_bit_in_chunk(bit, bb->data + chunk);
> -				if (bit >= 0)
> -					goto Return_pfn;
> -
> -				chunk = next_chunk_in_block(chunk, bb);
> -				bit = -1;
> -			} while (chunk >= 0);
> +			bit = find_next_bit(bb->data, bm_block_bits(bb), bit);
> +			if (bit < bm_block_bits(bb))
> +				goto Return_pfn;
> +
>  			bb = bb->next;
>  			bm->cur.block = bb;
> -			memory_bm_reset_chunk(bm);
> +			bm->cur.bit = 0;
>  		} while (bb);
>  		zone_bm = bm->cur.zone_bm->next;
>  		if (zone_bm) {
>  			bm->cur.zone_bm = zone_bm;
>  			bm->cur.block = zone_bm->bm_blocks;
> -			memory_bm_reset_chunk(bm);
> +			bm->cur.bit = 0;
>  		}
>  	} while (zone_bm);
>  	memory_bm_position_reset(bm);
>  	return BM_END_OF_MAP;
>  
>   Return_pfn:
> -	bm->cur.chunk = chunk;
> -	bm->cur.bit = bit;
> -	return bb->start_pfn + chunk * BM_BITS_PER_CHUNK + bit;
> +	bm->cur.bit = bit + 1;
> +	return bb->start_pfn + bit;
>  }
>  
>  /**
> 
> 



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] swsusp: simplify memory bitmap
  2008-07-07 12:49   ` Rafael J. Wysocki
@ 2008-07-07 13:26     ` Akinobu Mita
  0 siblings, 0 replies; 5+ messages in thread
From: Akinobu Mita @ 2008-07-07 13:26 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: linux-kernel, Pavel Machek, linux-pm

2008/7/7 Rafael J. Wysocki <rjw@sisk.pl>:
> On Saturday, 5 of July 2008, Akinobu Mita wrote:
>> This patch simplifies the memory bitmap manipulations.
>>
>> - remove the member size in struct bm_block
>>
>> It is not necessary for struct bm_block to have the number of bit chunks
>> that can be calculated by using end_pfn and start_pfn.
>>
>> - use find_next_bit() for memory_bm_next_pfn
>>
>> No need to invent the bitmap library only for the memory bitmap.
>
> Thanks for doing this change, it looks OK.
>
> I haven't have the time to test it yet, but once it's been tested, I'll push
> it to Andrew for merging.  I'll fold patch 1/2 into this one.

Thanks. I have only tested it on an x86_64 box.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-07-07 13:26 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-07-05 11:10 [PATCH 1/2] swsusp: simplify memory_bm_find_bit() Akinobu Mita
2008-07-05 11:11 ` [PATCH 2/2] swsusp: simplify memory bitmap Akinobu Mita
2008-07-07 12:49   ` Rafael J. Wysocki
2008-07-07 13:26     ` Akinobu Mita
2008-07-07 12:43 ` [PATCH 1/2] swsusp: simplify memory_bm_find_bit() Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®