1
0
Fork 0

fs: Convert writeback to XArray

A couple of short loops.

Signed-off-by: Matthew Wilcox <willy@infradead.org>
hifive-unleashed-5.1
Matthew Wilcox 2017-12-04 10:46:23 -05:00
parent ec82e1c1c8
commit 04edf02cdd
1 changed files with 9 additions and 16 deletions

View File

@ -339,9 +339,9 @@ static void inode_switch_wbs_work_fn(struct work_struct *work)
struct address_space *mapping = inode->i_mapping; struct address_space *mapping = inode->i_mapping;
struct bdi_writeback *old_wb = inode->i_wb; struct bdi_writeback *old_wb = inode->i_wb;
struct bdi_writeback *new_wb = isw->new_wb; struct bdi_writeback *new_wb = isw->new_wb;
struct radix_tree_iter iter; XA_STATE(xas, &mapping->i_pages, 0);
struct page *page;
bool switched = false; bool switched = false;
void **slot;
/* /*
* By the time control reaches here, RCU grace period has passed * By the time control reaches here, RCU grace period has passed
@ -375,25 +375,18 @@ static void inode_switch_wbs_work_fn(struct work_struct *work)
* to possibly dirty pages while PAGECACHE_TAG_WRITEBACK points to * to possibly dirty pages while PAGECACHE_TAG_WRITEBACK points to
* pages actually under writeback. * pages actually under writeback.
*/ */
radix_tree_for_each_tagged(slot, &mapping->i_pages, &iter, 0, xas_for_each_marked(&xas, page, ULONG_MAX, PAGECACHE_TAG_DIRTY) {
PAGECACHE_TAG_DIRTY) { if (PageDirty(page)) {
struct page *page = radix_tree_deref_slot_protected(slot,
&mapping->i_pages.xa_lock);
if (likely(page) && PageDirty(page)) {
dec_wb_stat(old_wb, WB_RECLAIMABLE); dec_wb_stat(old_wb, WB_RECLAIMABLE);
inc_wb_stat(new_wb, WB_RECLAIMABLE); inc_wb_stat(new_wb, WB_RECLAIMABLE);
} }
} }
radix_tree_for_each_tagged(slot, &mapping->i_pages, &iter, 0, xas_set(&xas, 0);
PAGECACHE_TAG_WRITEBACK) { xas_for_each_marked(&xas, page, ULONG_MAX, PAGECACHE_TAG_WRITEBACK) {
struct page *page = radix_tree_deref_slot_protected(slot, WARN_ON_ONCE(!PageWriteback(page));
&mapping->i_pages.xa_lock); dec_wb_stat(old_wb, WB_WRITEBACK);
if (likely(page)) { inc_wb_stat(new_wb, WB_WRITEBACK);
WARN_ON_ONCE(!PageWriteback(page));
dec_wb_stat(old_wb, WB_WRITEBACK);
inc_wb_stat(new_wb, WB_WRITEBACK);
}
} }
wb_get(new_wb); wb_get(new_wb);