forked from luck/tmp_suning_uos_patched
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
|
@ -1097,14 +1097,12 @@ void bitmap_daemon_work(struct bitmap *bitmap)
|
|||
}
|
||||
bitmap->allclean = 1;
|
||||
|
||||
spin_lock_irqsave(&bitmap->lock, flags);
|
||||
for (j = 0; j < bitmap->chunks; j++) {
|
||||
bitmap_counter_t *bmc;
|
||||
spin_lock_irqsave(&bitmap->lock, flags);
|
||||
if (!bitmap->filemap) {
|
||||
if (!bitmap->filemap)
|
||||
/* error or shutdown */
|
||||
spin_unlock_irqrestore(&bitmap->lock, flags);
|
||||
break;
|
||||
}
|
||||
|
||||
page = filemap_get_page(bitmap, j);
|
||||
|
||||
|
@ -1121,6 +1119,8 @@ void bitmap_daemon_work(struct bitmap *bitmap)
|
|||
write_page(bitmap, page, 0);
|
||||
bitmap->allclean = 0;
|
||||
}
|
||||
spin_lock_irqsave(&bitmap->lock, flags);
|
||||
j |= (PAGE_BITS - 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1181,9 +1181,10 @@ void bitmap_daemon_work(struct bitmap *bitmap)
|
|||
ext2_clear_bit(file_page_offset(j), paddr);
|
||||
kunmap_atomic(paddr, KM_USER0);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&bitmap->lock, flags);
|
||||
} else
|
||||
j |= PAGE_COUNTER_MASK;
|
||||
}
|
||||
spin_unlock_irqrestore(&bitmap->lock, flags);
|
||||
|
||||
/* now sync the final page */
|
||||
if (lastpage != NULL) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user