All of lore.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
2006-05-24 11:12 [PATCH 00/33] Adaptive read-ahead V12 Wu Fengguang
2006-05-24 11:12 ` 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
2006-05-26  1:19     ` Wu Fengguang
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
2006-05-29  3:04                 ` Wu Fengguang
2006-05-29  3:04                   ` Wu Fengguang
2006-05-24 11:12 ` [PATCH 02/33] radixtree: look-aside cache Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-24 11:12 ` [PATCH 03/33] radixtree: hole scanning functions Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-25 16:19     ` Andrew Morton
2006-05-26  7:04       ` Wu Fengguang
2006-05-26  7:04         ` Wu Fengguang
2006-05-26 11:05       ` Wu Fengguang
2006-05-26 11:05         ` Wu Fengguang
2006-05-26 16:19           ` Andrew Morton
2006-05-24 11:12 ` [PATCH 04/33] readahead: page flag PG_readahead Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-25 16:23     ` Andrew Morton
2006-05-26  7:06       ` Wu Fengguang
2006-05-26  7:06         ` Wu Fengguang
2006-05-24 12:27   ` Peter Zijlstra
2006-05-24 12:37     ` Wu Fengguang
2006-05-24 12:37       ` Wu Fengguang
2006-05-24 12:48       ` Peter Zijlstra
2006-05-24 11:12 ` [PATCH 05/33] readahead: refactor do_generic_mapping_read() Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-24 11:12 ` [PATCH 06/33] readahead: refactor __do_page_cache_readahead() Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-25 16:30     ` Andrew Morton
2006-05-25 22:33       ` Paul Mackerras
2006-05-25 22:40         ` Andrew Morton
2006-05-26  7:13       ` Wu Fengguang
2006-05-26  7:13         ` Wu Fengguang
2006-05-24 11:12 ` [PATCH 07/33] readahead: insert cond_resched() calls Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-24 11:12 ` [PATCH 08/33] readahead: common macros Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-25  5:56     ` Nick Piggin
2006-05-25 10:41       ` Wu Fengguang
2006-05-25 10:41         ` Wu Fengguang
2006-05-26  3:33           ` Nick Piggin
2006-05-26  6:59             ` Wu Fengguang
2006-05-26  6:59               ` Wu Fengguang
2006-05-25 13:42       ` Wu Fengguang
2006-05-25 13:42         ` Wu Fengguang
2006-05-25 14:38           ` Andrew Morton
2006-05-25 16:33     ` Andrew Morton
2006-05-24 11:12 ` [PATCH 09/33] readahead: events accounting Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-25 16:36     ` Andrew Morton
2006-05-26  7:09       ` Wu Fengguang
2006-05-26  7:09         ` Wu Fengguang
2006-05-27 13:20       ` Wu Fengguang
2006-05-27 13:20         ` Wu Fengguang
2006-05-29  8:19           ` Martin Peschke
2006-05-24 11:12 ` [PATCH 10/33] readahead: support functions Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-25  5:13     ` Nick Piggin
2006-05-25 11:13       ` Wu Fengguang
2006-05-25 11:13         ` Wu Fengguang
2006-05-25 16:48     ` Andrew Morton
2006-05-26  7:31       ` Wu Fengguang
2006-05-26  7:31         ` Wu Fengguang
2006-05-24 11:12 ` [PATCH 11/33] readahead: sysctl parameters Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-25  4:50     ` [PATCH 12/33] readahead: min/max sizes Nick Piggin
2006-05-25 12:12       ` Wu Fengguang
2006-05-25 12:12         ` Wu Fengguang
2006-05-24 11:12 ` [PATCH 13/33] readahead: state based method - aging accounting Wu Fengguang
2006-05-24 11:12   ` Wu Fengguang
2006-05-26 17:04     ` Andrew Morton
2006-05-27  6:22       ` Wu Fengguang
2006-05-27  6:22         ` Wu Fengguang
2006-05-27  7:00           ` Andrew Morton
2006-05-27  7:22             ` Wu Fengguang
2006-05-27  7:22               ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 14/33] readahead: state based method - data structure Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-25  6:03     ` Nick Piggin
2006-05-25 10:43       ` Wu Fengguang
2006-05-25 10:43         ` Wu Fengguang
2006-05-26 17:05     ` Andrew Morton
2006-05-27  7:02       ` Wu Fengguang
2006-05-27  7:02         ` Wu Fengguang
2006-05-27  8:27       ` Wu Fengguang
2006-05-27  8:27         ` Wu Fengguang
2006-05-24 11:13 ` Wu Fengguang [this message]
2006-05-24 11:13   ` [PATCH 15/33] readahead: state based method - routines Wu Fengguang
2006-05-26 17:15     ` Andrew Morton
2006-05-27  2:06       ` Wu Fengguang
2006-05-27  2:06         ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 17/33] readahead: context based method Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-25  5:26     ` Nick Piggin
2006-05-25  8:03       ` Wu Fengguang
2006-05-25  8:03         ` Wu Fengguang
2006-05-26 17:23     ` Andrew Morton
2006-05-27  2:12       ` Wu Fengguang
2006-05-27  2:12         ` Wu Fengguang
2006-05-26 17:27     ` Andrew Morton
2006-05-27  8:04       ` Wu Fengguang
2006-05-27  8:04         ` Wu Fengguang
2006-05-24 12:37   ` Peter Zijlstra
2006-05-24 13:33     ` Wu Fengguang
2006-05-24 13:33       ` Wu Fengguang
2006-05-24 15:53       ` Peter Zijlstra
2006-05-25  1:25         ` Wu Fengguang
2006-05-25  1:25           ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 18/33] readahead: initial method - guiding sizes Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 19/33] readahead: initial method - thrashing guard size Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 20/33] readahead: initial method - expected read size Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-25  5:34     ` [PATCH 22/33] readahead: initial method Nick Piggin
2006-05-25  8:59       ` Wu Fengguang
2006-05-25  8:59         ` Wu Fengguang
2006-05-26 17:29     ` [PATCH 20/33] readahead: initial method - expected read size Andrew Morton
2006-05-27  6:38       ` Wu Fengguang
2006-05-27  6:38         ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 23/33] readahead: backward prefetching method Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-26 17:37     ` Nate Diller
2006-05-26 19:22       ` Nathan Scott
2006-05-28 12:30         ` Wu Fengguang
2006-05-28 12:30           ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 24/33] readahead: seeking reads method Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 25/33] readahead: thrashing recovery method Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 26/33] readahead: call scheme Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 27/33] readahead: laptop mode Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-26 17:38     ` Andrew Morton
2006-05-24 11:13 ` [PATCH 28/33] readahead: loop case Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 14:01   ` Limin Wang
2006-05-25 15:48     ` wfg
2006-05-25 15:48       ` wfg
2006-05-24 11:13 ` [PATCH 29/33] readahead: nfsd case Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 30/33] readahead: turn on by default Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 31/33] readahead: debug radix tree new functions Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 32/33] readahead: debug traces showing accessed file names Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang
2006-05-24 11:13 ` [PATCH 33/33] readahead: debug traces showing read patterns Wu Fengguang
2006-05-24 11:13   ` Wu Fengguang

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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.