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: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2009-05-26 09:41:17 +10:00
parent 2b69c83924
commit be51269103

View file

@ -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)
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)
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
j |= PAGE_COUNTER_MASK;
} }
spin_unlock_irqrestore(&bitmap->lock, flags); spin_unlock_irqrestore(&bitmap->lock, flags);
}
/* now sync the final page */ /* now sync the final page */
if (lastpage != NULL) { if (lastpage != NULL) {