public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Wu Fengguang <wfg@mail.ustc.edu.cn>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org, Wu Fengguang <wfg@mail.ustc.edu.cn>
Subject: [PATCH 15/33] readahead: state based method - routines
Date: Wed, 24 May 2006 19:13:01 +0800	[thread overview]
Message-ID: <348469543.10865@ustc.edu.cn> (raw)
Message-ID: <20060524111904.683513683@localhost.localdomain> (raw)
In-Reply-To: 20060524111246.420010595@localhost.localdomain

[-- Attachment #1: readahead-method-stateful-routines.patch --]
[-- Type: text/plain, Size: 5765 bytes --]

Define some helpers on struct file_ra_state.

Signed-off-by: Wu Fengguang <wfg@mail.ustc.edu.cn>
---

 mm/readahead.c |  188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 186 insertions(+), 2 deletions(-)

--- linux-2.6.17-rc4-mm3.orig/mm/readahead.c
+++ linux-2.6.17-rc4-mm3/mm/readahead.c
@@ -854,6 +854,190 @@ static unsigned long node_readahead_agin
 }
 
 /*
+ * Some helpers for querying/building a read-ahead request.
+ *
+ * Diagram for some variable names used frequently:
+ *
+ *                                   |<------- la_size ------>|
+ *                  +-----------------------------------------+
+ *                  |                #                        |
+ *                  +-----------------------------------------+
+ *      ra_index -->|<---------------- ra_size -------------->|
+ *
+ */
+
+static enum ra_class ra_class_new(struct file_ra_state *ra)
+{
+	return ra->flags & RA_CLASS_MASK;
+}
+
+static inline enum ra_class ra_class_old(struct file_ra_state *ra)
+{
+	return (ra->flags >> RA_CLASS_SHIFT) & RA_CLASS_MASK;
+}
+
+static unsigned long ra_readahead_size(struct file_ra_state *ra)
+{
+	return ra->readahead_index - ra->ra_index;
+}
+
+static unsigned long ra_lookahead_size(struct file_ra_state *ra)
+{
+	return ra->readahead_index - ra->lookahead_index;
+}
+
+static unsigned long ra_invoke_interval(struct file_ra_state *ra)
+{
+	return ra->lookahead_index - ra->la_index;
+}
+
+/*
+ * The 64bit cache_hits stores three accumulated values and a counter value.
+ * MSB                                                                   LSB
+ * 3333333333333333 : 2222222222222222 : 1111111111111111 : 0000000000000000
+ */
+static int ra_cache_hit(struct file_ra_state *ra, int nr)
+{
+	return (ra->cache_hits >> (nr * 16)) & 0xFFFF;
+}
+
+/*
+ * Conceptual code:
+ * ra_cache_hit(ra, 1) += ra_cache_hit(ra, 0);
+ * ra_cache_hit(ra, 0) = 0;
+ */
+static void ra_addup_cache_hit(struct file_ra_state *ra)
+{
+	int n;
+
+	n = ra_cache_hit(ra, 0);
+	ra->cache_hits -= n;
+	n <<= 16;
+	ra->cache_hits += n;
+}
+
+/*
+ * The read-ahead is deemed success if cache-hit-rate >= 1/readahead_hit_rate.
+ */
+static int ra_cache_hit_ok(struct file_ra_state *ra)
+{
+	return ra_cache_hit(ra, 0) * readahead_hit_rate >=
+					(ra->lookahead_index - ra->la_index);
+}
+
+/*
+ * Check if @index falls in the @ra request.
+ */
+static int ra_has_index(struct file_ra_state *ra, pgoff_t index)
+{
+	if (index < ra->la_index || index >= ra->readahead_index)
+		return 0;
+
+	if (index >= ra->ra_index)
+		return 1;
+	else
+		return -1;
+}
+
+/*
+ * Which method is issuing this read-ahead?
+ */
+static void ra_set_class(struct file_ra_state *ra,
+				enum ra_class ra_class)
+{
+	unsigned long flags_mask;
+	unsigned long flags;
+	unsigned long old_ra_class;
+
+	flags_mask = ~(RA_CLASS_MASK | (RA_CLASS_MASK << RA_CLASS_SHIFT));
+	flags = ra->flags & flags_mask;
+
+	old_ra_class = ra_class_new(ra) << RA_CLASS_SHIFT;
+
+	ra->flags = flags | old_ra_class | ra_class;
+
+	ra_addup_cache_hit(ra);
+	if (ra_class != RA_CLASS_STATE)
+		ra->cache_hits <<= 16;
+
+	ra->age = node_readahead_aging();
+}
+
+/*
+ * Where is the old read-ahead and look-ahead?
+ */
+static void ra_set_index(struct file_ra_state *ra,
+				pgoff_t la_index, pgoff_t ra_index)
+{
+	ra->la_index = la_index;
+	ra->ra_index = ra_index;
+}
+
+/*
+ * Where is the new read-ahead and look-ahead?
+ */
+static void ra_set_size(struct file_ra_state *ra,
+				unsigned long ra_size, unsigned long la_size)
+{
+	/* Disable look-ahead for loopback file. */
+	if (unlikely(ra->flags & RA_FLAG_NO_LOOKAHEAD))
+		la_size = 0;
+
+	ra->readahead_index = ra->ra_index + ra_size;
+	ra->lookahead_index = ra->readahead_index - la_size;
+}
+
+/*
+ * Submit IO for the read-ahead request in file_ra_state.
+ */
+static int ra_dispatch(struct file_ra_state *ra,
+			struct address_space *mapping, struct file *filp)
+{
+	enum ra_class ra_class = ra_class_new(ra);
+	unsigned long ra_size = ra_readahead_size(ra);
+	unsigned long la_size = ra_lookahead_size(ra);
+	pgoff_t eof_index = PAGES_BYTE(i_size_read(mapping->host)) + 1;
+	int actual;
+
+	if (unlikely(ra->ra_index >= eof_index))
+		return 0;
+
+	/* Snap to EOF. */
+	if (ra->readahead_index + ra_size / 2 > eof_index) {
+		if (ra_class == RA_CLASS_CONTEXT_AGGRESSIVE &&
+				eof_index > ra->lookahead_index + 1)
+			la_size = eof_index - ra->lookahead_index;
+		else
+			la_size = 0;
+		ra_size = eof_index - ra->ra_index;
+		ra_set_size(ra, ra_size, la_size);
+		ra->flags |= RA_FLAG_EOF;
+	}
+
+	actual = __do_page_cache_readahead(mapping, filp,
+					ra->ra_index, ra_size, la_size);
+
+#ifdef CONFIG_DEBUG_READAHEAD
+	if (ra->flags & RA_FLAG_MMAP)
+		ra_account(ra, RA_EVENT_READAHEAD_MMAP, actual);
+	if (ra->readahead_index == eof_index)
+		ra_account(ra, RA_EVENT_READAHEAD_EOF, actual);
+	if (la_size)
+		ra_account(ra, RA_EVENT_LOOKAHEAD, la_size);
+	if (ra_size > actual)
+		ra_account(ra, RA_EVENT_IO_CACHE_HIT, ra_size - actual);
+	ra_account(ra, RA_EVENT_READAHEAD, actual);
+
+	dprintk("readahead-%s(ino=%lu, index=%lu, ra=%lu+%lu-%lu) = %d\n",
+			ra_class_name[ra_class],
+			mapping->host->i_ino, ra->la_index,
+			ra->ra_index, ra_size, la_size, actual);
+#endif /* CONFIG_DEBUG_READAHEAD */
+
+	return actual;
+}
+
+/*
  * ra_min is mainly determined by the size of cache memory. Reasonable?
  *
  * Table of concrete numbers for 4KB page size:
@@ -925,10 +1109,10 @@ static void ra_account(struct file_ra_st
 		return;
 
 	if (e == RA_EVENT_READAHEAD_HIT && pages < 0) {
-		c = (ra->flags >> RA_CLASS_SHIFT) & RA_CLASS_MASK;
+		c = ra_class_old(ra);
 		pages = -pages;
 	} else if (ra)
-		c = ra->flags & RA_CLASS_MASK;
+		c = ra_class_new(ra);
 	else
 		c = RA_CLASS_NONE;
 

--

  parent reply	other threads:[~2006-05-24 11:22 UTC|newest]

Thread overview: 107+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20060524111246.420010595@localhost.localdomain>
2006-05-24 11:12 ` [PATCH 00/33] Adaptive read-ahead V12 Wu Fengguang
2006-05-25 15:44   ` Andrew Morton
2006-05-25 19:26     ` Michael Stone
2006-05-25 19:40     ` David Lang
2006-05-25 22:01       ` Andrew Morton
2006-05-25 20:28         ` David Lang
2006-05-26  0:48         ` Michael Stone
     [not found]     ` <20060526011939.GA6220@mail.ustc.edu.cn>
2006-05-26  1:19       ` Wu Fengguang
2006-05-26  2:10     ` Jon Smirl
2006-05-26  3:14       ` Nick Piggin
2006-05-26 14:00     ` Andi Kleen
2006-05-26 16:25       ` Andrew Morton
2006-05-26 23:54       ` Folkert van Heusden
2006-05-27  0:00         ` Con Kolivas
2006-05-27  0:08           ` Con Kolivas
2006-05-28 22:20             ` Diego Calleja
2006-05-28 22:31               ` kernel
     [not found]                 ` <20060529030445.GB5994@mail.ustc.edu.cn>
2006-05-29  3:04                   ` Wu Fengguang
     [not found] ` <20060524111857.983845462@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 02/33] radixtree: look-aside cache Wu Fengguang
     [not found] ` <20060524111858.357709745@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 03/33] radixtree: hole scanning functions Wu Fengguang
2006-05-25 16:19     ` Andrew Morton
     [not found]       ` <20060526070416.GB5135@mail.ustc.edu.cn>
2006-05-26  7:04         ` Wu Fengguang
     [not found]       ` <20060526110559.GA14398@mail.ustc.edu.cn>
2006-05-26 11:05         ` Wu Fengguang
2006-05-26 16:19           ` Andrew Morton
     [not found] ` <20060524111858.869793445@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 04/33] readahead: page flag PG_readahead Wu Fengguang
2006-05-25 16:23     ` Andrew Morton
     [not found]       ` <20060526070646.GC5135@mail.ustc.edu.cn>
2006-05-26  7:06         ` Wu Fengguang
2006-05-24 12:27   ` Peter Zijlstra
     [not found]     ` <20060524123740.GA16304@mail.ustc.edu.cn>
2006-05-24 12:37       ` Wu Fengguang
2006-05-24 12:48       ` Peter Zijlstra
     [not found] ` <20060524111859.540640819@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 05/33] readahead: refactor do_generic_mapping_read() Wu Fengguang
     [not found] ` <20060524111859.909928820@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 06/33] readahead: refactor __do_page_cache_readahead() Wu Fengguang
2006-05-25 16:30     ` Andrew Morton
2006-05-25 22:33       ` Paul Mackerras
2006-05-25 22:40         ` Andrew Morton
     [not found]       ` <20060526071339.GE5135@mail.ustc.edu.cn>
2006-05-26  7:13         ` Wu Fengguang
     [not found] ` <20060524111900.419314658@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 07/33] readahead: insert cond_resched() calls Wu Fengguang
     [not found] ` <20060524111900.970898174@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 08/33] readahead: common macros Wu Fengguang
2006-05-25  5:56     ` Nick Piggin
     [not found]       ` <20060525104117.GE4996@mail.ustc.edu.cn>
2006-05-25 10:41         ` Wu Fengguang
2006-05-26  3:33           ` Nick Piggin
     [not found]             ` <20060526065906.GA5135@mail.ustc.edu.cn>
2006-05-26  6:59               ` Wu Fengguang
     [not found]       ` <20060525134224.GJ4996@mail.ustc.edu.cn>
2006-05-25 13:42         ` Wu Fengguang
2006-05-25 14:38           ` Andrew Morton
2006-05-25 16:33     ` Andrew Morton
     [not found] ` <20060524111901.581603095@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 09/33] readahead: events accounting Wu Fengguang
2006-05-25 16:36     ` Andrew Morton
     [not found]       ` <20060526070943.GD5135@mail.ustc.edu.cn>
2006-05-26  7:09         ` Wu Fengguang
     [not found]       ` <20060527132002.GA4814@mail.ustc.edu.cn>
2006-05-27 13:20         ` Wu Fengguang
2006-05-29  8:19           ` Martin Peschke
     [not found] ` <20060524111901.976888971@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 10/33] readahead: support functions Wu Fengguang
2006-05-25  5:13     ` Nick Piggin
     [not found]       ` <20060525111318.GH4996@mail.ustc.edu.cn>
2006-05-25 11:13         ` Wu Fengguang
2006-05-25 16:48     ` Andrew Morton
     [not found]       ` <20060526073114.GH5135@mail.ustc.edu.cn>
2006-05-26  7:31         ` Wu Fengguang
     [not found] ` <20060524111902.491708692@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 11/33] readahead: sysctl parameters Wu Fengguang
2006-05-25  4:50     ` [PATCH 12/33] readahead: min/max sizes Nick Piggin
     [not found]       ` <20060525121206.GI4996@mail.ustc.edu.cn>
2006-05-25 12:12         ` Wu Fengguang
     [not found] ` <20060524111903.510268987@localhost.localdomain>
2006-05-24 11:12   ` [PATCH 13/33] readahead: state based method - aging accounting Wu Fengguang
2006-05-26 17:04     ` Andrew Morton
     [not found]       ` <20060527062234.GB4991@mail.ustc.edu.cn>
2006-05-27  6:22         ` Wu Fengguang
2006-05-27  7:00           ` Andrew Morton
     [not found]             ` <20060527072201.GA5284@mail.ustc.edu.cn>
2006-05-27  7:22               ` Wu Fengguang
     [not found] ` <20060524111904.019763011@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 14/33] readahead: state based method - data structure Wu Fengguang
2006-05-25  6:03     ` Nick Piggin
     [not found]       ` <20060525104353.GF4996@mail.ustc.edu.cn>
2006-05-25 10:43         ` Wu Fengguang
2006-05-26 17:05     ` Andrew Morton
     [not found]       ` <20060527070248.GD4991@mail.ustc.edu.cn>
2006-05-27  7:02         ` Wu Fengguang
     [not found]       ` <20060527082758.GF4991@mail.ustc.edu.cn>
2006-05-27  8:27         ` Wu Fengguang
     [not found] ` <20060524111904.683513683@localhost.localdomain>
2006-05-24 11:13   ` Wu Fengguang [this message]
2006-05-26 17:15     ` [PATCH 15/33] readahead: state based method - routines Andrew Morton
     [not found]       ` <20060527020616.GA7418@mail.ustc.edu.cn>
2006-05-27  2:06         ` Wu Fengguang
     [not found] ` <20060524111906.245276338@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 18/33] readahead: initial method - guiding sizes Wu Fengguang
     [not found] ` <20060524111906.588647885@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 19/33] readahead: initial method - thrashing guard size Wu Fengguang
     [not found] ` <20060524111907.134685550@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 20/33] readahead: initial method - expected read size Wu Fengguang
2006-05-25  5:34     ` [PATCH 22/33] readahead: initial method Nick Piggin
     [not found]       ` <20060525085957.GC4996@mail.ustc.edu.cn>
2006-05-25  8:59         ` Wu Fengguang
2006-05-26 17:29     ` [PATCH 20/33] readahead: initial method - expected read size Andrew Morton
     [not found]       ` <20060527063826.GC4991@mail.ustc.edu.cn>
2006-05-27  6:38         ` Wu Fengguang
     [not found] ` <20060524111908.569533741@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 23/33] readahead: backward prefetching method Wu Fengguang
2006-05-26 17:37     ` Nate Diller
2006-05-26 19:22       ` Nathan Scott
     [not found]         ` <20060528123006.GC6478@mail.ustc.edu.cn>
2006-05-28 12:30           ` Wu Fengguang
     [not found] ` <20060524111909.147416866@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 24/33] readahead: seeking reads method Wu Fengguang
     [not found] ` <20060524111909.635589701@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 25/33] readahead: thrashing recovery method Wu Fengguang
     [not found] ` <20060524111910.207894375@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 26/33] readahead: call scheme Wu Fengguang
     [not found] ` <20060524111910.544274094@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 27/33] readahead: laptop mode Wu Fengguang
2006-05-26 17:38     ` Andrew Morton
     [not found] ` <20060524111911.607080495@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 29/33] readahead: nfsd case Wu Fengguang
     [not found] ` <20060524111912.156646847@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 30/33] readahead: turn on by default Wu Fengguang
     [not found] ` <20060524111912.485160282@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 31/33] readahead: debug radix tree new functions Wu Fengguang
     [not found] ` <20060524111912.967392912@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 32/33] readahead: debug traces showing accessed file names Wu Fengguang
     [not found] ` <20060524111913.603476893@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 33/33] readahead: debug traces showing read patterns Wu Fengguang
     [not found] ` <20060524111905.586110688@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 17/33] readahead: context based method Wu Fengguang
2006-05-25  5:26     ` Nick Piggin
     [not found]       ` <20060525080308.GB4996@mail.ustc.edu.cn>
2006-05-25  8:03         ` Wu Fengguang
2006-05-26 17:23     ` Andrew Morton
     [not found]       ` <20060527021252.GB7418@mail.ustc.edu.cn>
2006-05-27  2:12         ` Wu Fengguang
2006-05-26 17:27     ` Andrew Morton
     [not found]       ` <20060527080443.GE4991@mail.ustc.edu.cn>
2006-05-27  8:04         ` Wu Fengguang
2006-05-24 12:37   ` Peter Zijlstra
     [not found]     ` <20060524133353.GA16508@mail.ustc.edu.cn>
2006-05-24 13:33       ` Wu Fengguang
2006-05-24 15:53       ` Peter Zijlstra
     [not found]         ` <20060525012556.GA6111@mail.ustc.edu.cn>
2006-05-25  1:25           ` Wu Fengguang
     [not found] ` <20060524111911.032100160@localhost.localdomain>
2006-05-24 11:13   ` [PATCH 28/33] readahead: loop case Wu Fengguang
2006-05-24 14:01   ` Limin Wang
     [not found]     ` <20060525154846.GA6907@mail.ustc.edu.cn>
2006-05-25 15:48       ` wfg

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=348469543.10865@ustc.edu.cn \
    --to=wfg@mail.ustc.edu.cn \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.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