From: Andrew Morton <akpm@zip.com.au>
To: Linus Torvalds <torvalds@transmeta.com>
Cc: lkml <linux-kernel@vger.kernel.org>
Subject: [patch 26/27] reduce lock contention in try_to_free_buffers()
Date: Thu, 04 Jul 2002 16:55:25 -0700 [thread overview]
Message-ID: <3D24E06D.8B7C1FCA@zip.com.au> (raw)
The blockdev mapping's private_lock is fairly contended. The buffer
LRU cache fixed a lot of that, but under page replacement load,
try_to_free_buffers is still showing up.
Moving the freeing of buffer_heads outside the lock reduces contention
in there by 30%.
buffer.c | 24 +++++++++++++++++++-----
1 files changed, 19 insertions(+), 5 deletions(-)
--- 2.5.24/fs/buffer.c~ttfb_contention Thu Jul 4 16:17:34 2002
+++ 2.5.24-akpm/fs/buffer.c Thu Jul 4 16:17:34 2002
@@ -2472,7 +2472,8 @@ static inline int buffer_busy(struct buf
(bh->b_state & ((1 << BH_Dirty) | (1 << BH_Lock)));
}
-static /*inline*/ int drop_buffers(struct page *page)
+static inline int
+drop_buffers(struct page *page, struct buffer_head **buffers_to_free)
{
struct buffer_head *head = page_buffers(page);
struct buffer_head *bh;
@@ -2496,9 +2497,9 @@ static /*inline*/ int drop_buffers(struc
if (!list_empty(&bh->b_assoc_buffers))
__remove_assoc_queue(bh);
- free_buffer_head(bh);
bh = next;
} while (bh != head);
+ *buffers_to_free = head;
__clear_page_buffers(page);
return 1;
failed:
@@ -2508,17 +2509,20 @@ failed:
int try_to_free_buffers(struct page *page)
{
struct address_space * const mapping = page->mapping;
+ struct buffer_head *buffers_to_free = NULL;
int ret = 0;
BUG_ON(!PageLocked(page));
if (PageWriteback(page))
return 0;
- if (mapping == NULL) /* swapped-in anon page */
- return drop_buffers(page);
+ if (mapping == NULL) { /* swapped-in anon page */
+ ret = drop_buffers(page, &buffers_to_free);
+ goto out;
+ }
spin_lock(&mapping->private_lock);
- ret = drop_buffers(page);
+ ret = drop_buffers(page, &buffers_to_free);
if (ret && !PageSwapCache(page)) {
/*
* If the filesystem writes its buffers by hand (eg ext3)
@@ -2531,6 +2535,16 @@ int try_to_free_buffers(struct page *pag
ClearPageDirty(page);
}
spin_unlock(&mapping->private_lock);
+out:
+ if (buffers_to_free) {
+ struct buffer_head *bh = buffers_to_free;
+
+ do {
+ struct buffer_head *next = bh->b_this_page;
+ free_buffer_head(bh);
+ bh = next;
+ } while (bh != buffers_to_free);
+ }
return ret;
}
EXPORT_SYMBOL(try_to_free_buffers);
-
reply other threads:[~2002-07-04 23:50 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3D24E06D.8B7C1FCA@zip.com.au \
--to=akpm@zip.com.au \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@transmeta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox