* [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 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
* 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
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®