mark_buffer_dirty_inode() speedup
PATCH 7/19 mark_buffer_dirty_inode() speedup
buffer_insert_list() is showing up on Anton's graphs. It'll be via ext2's mark_buffer_dirty_inode() against indirect blocks. If the buffer is already on an inode queue, we know that it is on the correct inode's queue so we don't need to re-add it.
fs/buffer.c renamed from fs/buffer.c~mark_buffer_dirty_inode-speedup +13 -5
@@ -856,8 +856,9 @@ void mark_buffer_dirty_inode(struct buffif (mapping->assoc_mapping != buffer_mapping)BUG (); } -buffer_insert_list (&buffer_mapping->private_lock, - bh, &mapping->private_list); +if (list_empty (&bh->b_assoc_buffers)) +buffer_insert_list (&buffer_mapping->private_lock, + bh, &mapping->private_list); }EXPORT_SYMBOL (mark_buffer_dirty_inode);
@@ -1243,10 +1244,17 @@ void __brelse(struct buffer_head * buf)* bforget() is like brelse(), except it discards any * potentially dirty data. */ -void __bforget (struct buffer_head * buf) +void __bforget (struct buffer_head *bh) { -clear_buffer_dirty (buf); -__brelse (buf); +clear_buffer_dirty (bh); +if (!list_empty (&bh->b_assoc_buffers)) { +struct address_space *buffer_mapping = bh->b_page->mapping; + +spin_lock (&buffer_mapping->private_lock); +list_del_init (&bh->b_assoc_buffers); +spin_unlock (&buffer_mapping->private_lock); + } +__brelse (bh); }/**
-