Commit be512691 authored by NeilBrown's avatar NeilBrown

md: bitmap: improve bitmap maintenance code.

The code for checking which bits in the bitmap can be cleared
has 2 problems:
 1/ it repeatedly takes and drops a spinlock, where it would make
    more sense to just hold on to it most of the time.
 2/ it doesn't make use of some opportunities to skip large sections
    of the bitmap

This patch fixes those.  It will only affect CPU consumption, not
correctness.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 2b69c839
...@@ -1097,14 +1097,12 @@ void bitmap_daemon_work(struct bitmap *bitmap) ...@@ -1097,14 +1097,12 @@ void bitmap_daemon_work(struct bitmap *bitmap)
} }
bitmap->allclean = 1; bitmap->allclean = 1;
spin_lock_irqsave(&bitmap->lock, flags);
for (j = 0; j < bitmap->chunks; j++) { for (j = 0; j < bitmap->chunks; j++) {
bitmap_counter_t *bmc; bitmap_counter_t *bmc;
spin_lock_irqsave(&bitmap->lock, flags); if (!bitmap->filemap)
if (!bitmap->filemap) {
/* error or shutdown */ /* error or shutdown */
spin_unlock_irqrestore(&bitmap->lock, flags);
break; break;
}
page = filemap_get_page(bitmap, j); page = filemap_get_page(bitmap, j);
...@@ -1121,6 +1119,8 @@ void bitmap_daemon_work(struct bitmap *bitmap) ...@@ -1121,6 +1119,8 @@ void bitmap_daemon_work(struct bitmap *bitmap)
write_page(bitmap, page, 0); write_page(bitmap, page, 0);
bitmap->allclean = 0; bitmap->allclean = 0;
} }
spin_lock_irqsave(&bitmap->lock, flags);
j |= (PAGE_BITS - 1);
continue; continue;
} }
...@@ -1181,9 +1181,10 @@ void bitmap_daemon_work(struct bitmap *bitmap) ...@@ -1181,9 +1181,10 @@ void bitmap_daemon_work(struct bitmap *bitmap)
ext2_clear_bit(file_page_offset(j), paddr); ext2_clear_bit(file_page_offset(j), paddr);
kunmap_atomic(paddr, KM_USER0); kunmap_atomic(paddr, KM_USER0);
} }
} } else
spin_unlock_irqrestore(&bitmap->lock, flags); j |= PAGE_COUNTER_MASK;
} }
spin_unlock_irqrestore(&bitmap->lock, flags);
/* now sync the final page */ /* now sync the final page */
if (lastpage != NULL) { if (lastpage != NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment