mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-28 20:02:17 +00:00
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:
parent
2b69c83924
commit
be51269103
1 changed files with 7 additions and 6 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue