From: Fengguang Wu <wfg@mail.ustc.edu.cn>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org,
Nick Piggin <nickpiggin@yahoo.com.au>,
Rusty Russell <rusty@rustcorp.com.au>
Subject: [PATCH 8/8] basic support of interleaved reads
Date: Sat, 21 Jul 2007 11:57:41 +0800 [thread overview]
Message-ID: <384990325.22666@ustc.edu.cn> (raw)
Message-ID: <20070721035852.104255316@mail.ustc.edu.cn> (raw)
In-Reply-To: 20070721035733.951838089@mail.ustc.edu.cn
[-- Attachment #1: readahead-interleaved-reads.patch --]
[-- Type: text/plain, Size: 3320 bytes --]
This is a simplified version of the pagecache context based readahead.
It handles the case of multiple threads reading on the same fd and invalidating
each others' readahead state. It does the trick by scanning the pagecache and
recovering the current read stream's readahead status.
The algorithm works in a opportunistic way, in that it do not try to detect
interleaved reads _actively_, which requires a probe into the page cache(which
means a little more overheads for random reads). It only tries to handle a
previously started sequential readahead whose state was overwritten by
another concurrent stream, and it can do this job pretty well.
Negative and positive examples(or what you can expect from it):
1) it cannot detect and serve perfect request-by-request interleaved reads
right:
time stream 1 stream 2
0 1
1 1001
2 2
3 1002
4 3
5 1003
6 4
7 1004
8 5
9 1005
Here no single readahead will be carried out.
2) However, if it's two concurrent reads by two threads, the chance of the
initial sequential readahead be started is huge. Once the first sequential
readahead is started for a stream, this patch will ensure that the readahead
window continues to rampup and won't be disturbed by other streams.
time stream 1 stream 2
0 1
1 2
2 1001
3 3
4 1002
5 1003
6 4
7 5
8 1004
9 6
10 1005
11 7
12 1006
13 1007
Here steam 1 will start a readahead at page 2, and stream 2 will start its
first readahead at page 1003. From then on the two streams will be served right.
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Fengguang Wu <wfg@mail.ustc.edu.cn>
---
mm/readahead.c | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
--- linux-2.6.22-git15.orig/mm/readahead.c
+++ linux-2.6.22-git15/mm/readahead.c
@@ -371,6 +371,29 @@ ondemand_readahead(struct address_space
}
/*
+ * Hit a marked page without valid readahead state.
+ * E.g. interleaved reads.
+ * Query the pagecache for async_size, which normally equals to
+ * readahead size. Ramp it up and use it as the new readahead size.
+ */
+ if (hit_readahead_marker) {
+ pgoff_t start;
+
+ read_lock_irq(&mapping->tree_lock);
+ start = radix_tree_scan_hole(&mapping->page_tree, offset, max+1);
+ read_unlock_irq(&mapping->tree_lock);
+
+ if (!start || start - offset > max)
+ return 0;
+
+ ra->start = start;
+ ra->size = start - offset; /* old async_size */
+ ra->size = get_next_ra_size(ra, max);
+ ra->async_size = ra->size;
+ goto readit;
+ }
+
+ /*
* It may be one of
* - first read on start of file
* - sequential cache miss
@@ -381,16 +404,6 @@ ondemand_readahead(struct address_space
ra->size = get_init_ra_size(req_size, max);
ra->async_size = ra->size > req_size ? ra->size - req_size : ra->size;
- /*
- * Hit on a marked page without valid readahead state.
- * E.g. interleaved reads.
- * Not knowing its readahead pos/size, bet on the minimal possible one.
- */
- if (hit_readahead_marker) {
- ra->start++;
- ra->size = get_next_ra_size(ra, max);
- }
-
readit:
return ra_submit(ra, mapping, filp);
}
--
prev parent reply other threads:[~2007-07-21 3:59 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20070721035733.951838089@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 0/8] readahead cleanups and interleaved readahead take 2 Fengguang Wu
[not found] ` <20070721035850.977231489@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 1/8] compacting file_ra_state Fengguang Wu
[not found] ` <20070721040644.GA9750@mail.ustc.edu.cn>
2007-07-21 4:06 ` Fengguang Wu
2007-07-21 4:27 ` Linus Torvalds
[not found] ` <20070721042939.GA28875@mail.ustc.edu.cn>
2007-07-21 4:29 ` Fengguang Wu
2007-07-21 5:57 ` Andi Kleen
2007-07-21 6:03 ` Andrew Morton
2007-07-21 6:13 ` Linus Torvalds
2007-07-21 6:17 ` Andi Kleen
[not found] ` <20070721035851.185553787@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 2/8] mmap read-around simplification Fengguang Wu
[not found] ` <20070721035851.321030363@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 3/8] combine file_ra_state.prev_index/prev_offset into prev_pos Fengguang Wu
[not found] ` <20070721035851.461364420@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 4/8] trivial filemap.c cleanups Fengguang Wu
[not found] ` <20070721035851.638623804@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 5/8] remove several readahead macros Fengguang Wu
[not found] ` <20070721035851.791763729@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 6/8] remove the limit max_sectors_kb imposed on max_readahead_kb Fengguang Wu
[not found] ` <20070721035851.946351617@mail.ustc.edu.cn>
2007-07-21 3:57 ` [PATCH 7/8] introduce radix_tree_scan_hole() Fengguang Wu
[not found] ` <20070721035852.104255316@mail.ustc.edu.cn>
2007-07-21 3:57 ` Fengguang Wu [this message]
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=384990325.22666@ustc.edu.cn \
--to=wfg@mail.ustc.edu.cn \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nickpiggin@yahoo.com.au \
--cc=rusty@rustcorp.com.au \
--cc=torvalds@linux-foundation.org \
/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