From: Wu Fengguang <fengguang.wu@intel.com>
To: Dave Chinner <david@fromorbit.com>
Cc: Jan Kara <jack@suse.cz>,
Andrew Morton <akpm@linux-foundation.org>,
Andi Kleen <andi@firstfloor.org>, Ingo Molnar <mingo@elte.hu>,
Jens Axboe <axboe@kernel.dk>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Rik van Riel <riel@redhat.com>,
Linux Memory Management List <linux-mm@kvack.org>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 6/9] readahead: add /debug/readahead/stats
Date: Fri, 23 Dec 2011 11:33:20 +0800 [thread overview]
Message-ID: <20111223033320.GA21390@localhost> (raw)
In-Reply-To: <20111221040656.GB23662@dastard>
On Wed, Dec 21, 2011 at 12:06:56PM +0800, Dave Chinner wrote:
> On Wed, Dec 21, 2011 at 09:29:36AM +0800, Wu Fengguang wrote:
> > On Tue, Dec 20, 2011 at 12:32:41AM +0800, Jan Kara wrote:
> > > On Wed 14-12-11 14:36:25, Wu Fengguang wrote:
> > > > > This looks all inherently racy (which doesn't matter much as you suggest)
> > > > > so I just wanted to suggest that if you used per-cpu counters you'd get
> > > > > race-free and faster code at the cost of larger data structures and using
> > > > > percpu_counter_add() instead of ++ (which doesn't seem like a big
> > > > > complication to me).
> > > >
> > > > OK, here is the incremental patch to use per-cpu counters :)
> > > Thanks! This looks better. I just thought you would use per-cpu counters
> > > as defined in include/linux/percpu_counter.h and are used e.g. by bdi
> > > stats. This is more standard for statistics in the kernel than using
> > > per-cpu variables directly.
> >
> > Ah yes, I overlooked that facility! However the percpu_counter's
> > ability to maintain and quickly retrieve the global value seems
> > unnecessary feature/overheads for readahead stats, because here we
> > only need to sum up the global value when the user requests it. If
> > switching to percpu_counter, I'm afraid every readahead(1MB) event
> > will lead to the update of percpu_counter global value (grabbing the
> > spinlock) due to 1MB > some small batch size. This actually performs
> > worse than the plain global array of values in the v1 patch.
>
> So use a custom batch size so that typical increments don't require
> locking for every add. The bdi stat counters are an example of this
> sort of setup to reduce lock contention on typical IO workloads as
> concurrency increases.
>
> All these stats have is a requirement for a different batch size to
> avoid frequent lock grabs. The stats don't have to update the global
> counter very often (only to prvent overflow!) so you count get away
> with a batch size in the order of 2^30 without any issues....
>
> We have a general per-cpu counter infrastructure - we should be
> using it and improving it and not reinventing it a different way
> every time we need a per-cpu counter.
OK, let's try using percpu_counter, with a huge batch size.
It actually adds both code size and runtime overheads slightly.
Are you sure you like this incremental patch?
Thanks,
Fengguang
---
mm/readahead.c | 74 ++++++++++++++++++++++++++---------------------
1 file changed, 41 insertions(+), 33 deletions(-)
--- linux-next.orig/mm/readahead.c 2011-12-23 10:04:32.000000000 +0800
+++ linux-next/mm/readahead.c 2011-12-23 11:18:35.000000000 +0800
@@ -61,7 +61,18 @@ enum ra_account {
RA_ACCOUNT_MAX,
};
-static DEFINE_PER_CPU(unsigned long[RA_PATTERN_ALL][RA_ACCOUNT_MAX], ra_stat);
+#define RA_STAT_BATCH (INT_MAX / 2)
+static struct percpu_counter ra_stat[RA_PATTERN_ALL][RA_ACCOUNT_MAX];
+
+static inline void add_ra_stat(int i, int j, s64 amount)
+{
+ __percpu_counter_add(&ra_stat[i][j], amount, RA_STAT_BATCH);
+}
+
+static inline void inc_ra_stat(int i, int j)
+{
+ add_ra_stat(i, j, 1);
+}
static void readahead_stats(struct address_space *mapping,
pgoff_t offset,
@@ -76,62 +87,54 @@ static void readahead_stats(struct addre
{
pgoff_t eof = ((i_size_read(mapping->host)-1) >> PAGE_CACHE_SHIFT) + 1;
- preempt_disable();
-
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_COUNT]);
- __this_cpu_add(ra_stat[pattern][RA_ACCOUNT_SIZE], size);
- __this_cpu_add(ra_stat[pattern][RA_ACCOUNT_ASYNC_SIZE], async_size);
- __this_cpu_add(ra_stat[pattern][RA_ACCOUNT_ACTUAL], actual);
+ inc_ra_stat(pattern, RA_ACCOUNT_COUNT);
+ add_ra_stat(pattern, RA_ACCOUNT_SIZE, size);
+ add_ra_stat(pattern, RA_ACCOUNT_ASYNC_SIZE, async_size);
+ add_ra_stat(pattern, RA_ACCOUNT_ACTUAL, actual);
if (start + size >= eof)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_EOF]);
+ inc_ra_stat(pattern, RA_ACCOUNT_EOF);
if (actual < size)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_CACHE_HIT]);
+ inc_ra_stat(pattern, RA_ACCOUNT_CACHE_HIT);
if (actual) {
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_IOCOUNT]);
+ inc_ra_stat(pattern, RA_ACCOUNT_IOCOUNT);
if (start <= offset && offset < start + size)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_SYNC]);
+ inc_ra_stat(pattern, RA_ACCOUNT_SYNC);
if (for_mmap)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_MMAP]);
+ inc_ra_stat(pattern, RA_ACCOUNT_MMAP);
if (for_metadata)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_METADATA]);
+ inc_ra_stat(pattern, RA_ACCOUNT_METADATA);
}
-
- preempt_enable();
}
static void ra_stats_clear(void)
{
- int cpu;
int i, j;
- for_each_online_cpu(cpu)
- for (i = 0; i < RA_PATTERN_ALL; i++)
- for (j = 0; j < RA_ACCOUNT_MAX; j++)
- per_cpu(ra_stat[i][j], cpu) = 0;
+ for (i = 0; i < RA_PATTERN_ALL; i++)
+ for (j = 0; j < RA_ACCOUNT_MAX; j++)
+ percpu_counter_set(&ra_stat[i][j], 0);
}
-static void ra_stats_sum(unsigned long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX])
+static void ra_stats_sum(long long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX])
{
- int cpu;
int i, j;
- for_each_online_cpu(cpu)
- for (i = 0; i < RA_PATTERN_ALL; i++)
- for (j = 0; j < RA_ACCOUNT_MAX; j++) {
- unsigned long n = per_cpu(ra_stat[i][j], cpu);
- ra_stats[i][j] += n;
- ra_stats[RA_PATTERN_ALL][j] += n;
- }
+ for (i = 0; i < RA_PATTERN_ALL; i++)
+ for (j = 0; j < RA_ACCOUNT_MAX; j++) {
+ s64 n = percpu_counter_sum(&ra_stat[i][j]);
+ ra_stats[i][j] += n;
+ ra_stats[RA_PATTERN_ALL][j] += n;
+ }
}
static int readahead_stats_show(struct seq_file *s, void *_)
{
- unsigned long i;
- unsigned long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX];
+ long long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX];
+ int i;
seq_printf(s,
"%-10s %10s %10s %10s %10s %10s %10s %10s %10s %10s %10s\n",
@@ -153,8 +156,8 @@ static int readahead_stats_show(struct s
if (iocount == 0)
iocount = 1;
- seq_printf(s, "%-10s %10lu %10lu %10lu %10lu %10lu "
- "%10lu %10lu %10lu %10lu %10lu\n",
+ seq_printf(s, "%-10s %10lld %10lld %10lld %10lld %10lld "
+ "%10lld %10lld %10lld %10lld %10lld\n",
ra_pattern_names[i].name,
ra_stats[i][RA_ACCOUNT_COUNT],
ra_stats[i][RA_ACCOUNT_EOF],
@@ -196,6 +199,7 @@ static int __init readahead_create_debug
{
struct dentry *root;
struct dentry *entry;
+ int i, j;
root = debugfs_create_dir("readahead", NULL);
if (!root)
@@ -211,6 +215,10 @@ static int __init readahead_create_debug
if (!entry)
goto out;
+ for (i = 0; i < RA_PATTERN_ALL; i++)
+ for (j = 0; j < RA_ACCOUNT_MAX; j++)
+ percpu_counter_init(&ra_stat[i][j], 0);
+
return 0;
out:
printk(KERN_ERR "readahead: failed to create debugfs entries\n");
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Wu Fengguang <fengguang.wu@intel.com>
To: Dave Chinner <david@fromorbit.com>
Cc: Jan Kara <jack@suse.cz>,
Andrew Morton <akpm@linux-foundation.org>,
Andi Kleen <andi@firstfloor.org>, Ingo Molnar <mingo@elte.hu>,
Jens Axboe <axboe@kernel.dk>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Rik van Riel <riel@redhat.com>,
Linux Memory Management List <linux-mm@kvack.org>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 6/9] readahead: add /debug/readahead/stats
Date: Fri, 23 Dec 2011 11:33:20 +0800 [thread overview]
Message-ID: <20111223033320.GA21390@localhost> (raw)
In-Reply-To: <20111221040656.GB23662@dastard>
On Wed, Dec 21, 2011 at 12:06:56PM +0800, Dave Chinner wrote:
> On Wed, Dec 21, 2011 at 09:29:36AM +0800, Wu Fengguang wrote:
> > On Tue, Dec 20, 2011 at 12:32:41AM +0800, Jan Kara wrote:
> > > On Wed 14-12-11 14:36:25, Wu Fengguang wrote:
> > > > > This looks all inherently racy (which doesn't matter much as you suggest)
> > > > > so I just wanted to suggest that if you used per-cpu counters you'd get
> > > > > race-free and faster code at the cost of larger data structures and using
> > > > > percpu_counter_add() instead of ++ (which doesn't seem like a big
> > > > > complication to me).
> > > >
> > > > OK, here is the incremental patch to use per-cpu counters :)
> > > Thanks! This looks better. I just thought you would use per-cpu counters
> > > as defined in include/linux/percpu_counter.h and are used e.g. by bdi
> > > stats. This is more standard for statistics in the kernel than using
> > > per-cpu variables directly.
> >
> > Ah yes, I overlooked that facility! However the percpu_counter's
> > ability to maintain and quickly retrieve the global value seems
> > unnecessary feature/overheads for readahead stats, because here we
> > only need to sum up the global value when the user requests it. If
> > switching to percpu_counter, I'm afraid every readahead(1MB) event
> > will lead to the update of percpu_counter global value (grabbing the
> > spinlock) due to 1MB > some small batch size. This actually performs
> > worse than the plain global array of values in the v1 patch.
>
> So use a custom batch size so that typical increments don't require
> locking for every add. The bdi stat counters are an example of this
> sort of setup to reduce lock contention on typical IO workloads as
> concurrency increases.
>
> All these stats have is a requirement for a different batch size to
> avoid frequent lock grabs. The stats don't have to update the global
> counter very often (only to prvent overflow!) so you count get away
> with a batch size in the order of 2^30 without any issues....
>
> We have a general per-cpu counter infrastructure - we should be
> using it and improving it and not reinventing it a different way
> every time we need a per-cpu counter.
OK, let's try using percpu_counter, with a huge batch size.
It actually adds both code size and runtime overheads slightly.
Are you sure you like this incremental patch?
Thanks,
Fengguang
---
mm/readahead.c | 74 ++++++++++++++++++++++++++---------------------
1 file changed, 41 insertions(+), 33 deletions(-)
--- linux-next.orig/mm/readahead.c 2011-12-23 10:04:32.000000000 +0800
+++ linux-next/mm/readahead.c 2011-12-23 11:18:35.000000000 +0800
@@ -61,7 +61,18 @@ enum ra_account {
RA_ACCOUNT_MAX,
};
-static DEFINE_PER_CPU(unsigned long[RA_PATTERN_ALL][RA_ACCOUNT_MAX], ra_stat);
+#define RA_STAT_BATCH (INT_MAX / 2)
+static struct percpu_counter ra_stat[RA_PATTERN_ALL][RA_ACCOUNT_MAX];
+
+static inline void add_ra_stat(int i, int j, s64 amount)
+{
+ __percpu_counter_add(&ra_stat[i][j], amount, RA_STAT_BATCH);
+}
+
+static inline void inc_ra_stat(int i, int j)
+{
+ add_ra_stat(i, j, 1);
+}
static void readahead_stats(struct address_space *mapping,
pgoff_t offset,
@@ -76,62 +87,54 @@ static void readahead_stats(struct addre
{
pgoff_t eof = ((i_size_read(mapping->host)-1) >> PAGE_CACHE_SHIFT) + 1;
- preempt_disable();
-
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_COUNT]);
- __this_cpu_add(ra_stat[pattern][RA_ACCOUNT_SIZE], size);
- __this_cpu_add(ra_stat[pattern][RA_ACCOUNT_ASYNC_SIZE], async_size);
- __this_cpu_add(ra_stat[pattern][RA_ACCOUNT_ACTUAL], actual);
+ inc_ra_stat(pattern, RA_ACCOUNT_COUNT);
+ add_ra_stat(pattern, RA_ACCOUNT_SIZE, size);
+ add_ra_stat(pattern, RA_ACCOUNT_ASYNC_SIZE, async_size);
+ add_ra_stat(pattern, RA_ACCOUNT_ACTUAL, actual);
if (start + size >= eof)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_EOF]);
+ inc_ra_stat(pattern, RA_ACCOUNT_EOF);
if (actual < size)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_CACHE_HIT]);
+ inc_ra_stat(pattern, RA_ACCOUNT_CACHE_HIT);
if (actual) {
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_IOCOUNT]);
+ inc_ra_stat(pattern, RA_ACCOUNT_IOCOUNT);
if (start <= offset && offset < start + size)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_SYNC]);
+ inc_ra_stat(pattern, RA_ACCOUNT_SYNC);
if (for_mmap)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_MMAP]);
+ inc_ra_stat(pattern, RA_ACCOUNT_MMAP);
if (for_metadata)
- __this_cpu_inc(ra_stat[pattern][RA_ACCOUNT_METADATA]);
+ inc_ra_stat(pattern, RA_ACCOUNT_METADATA);
}
-
- preempt_enable();
}
static void ra_stats_clear(void)
{
- int cpu;
int i, j;
- for_each_online_cpu(cpu)
- for (i = 0; i < RA_PATTERN_ALL; i++)
- for (j = 0; j < RA_ACCOUNT_MAX; j++)
- per_cpu(ra_stat[i][j], cpu) = 0;
+ for (i = 0; i < RA_PATTERN_ALL; i++)
+ for (j = 0; j < RA_ACCOUNT_MAX; j++)
+ percpu_counter_set(&ra_stat[i][j], 0);
}
-static void ra_stats_sum(unsigned long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX])
+static void ra_stats_sum(long long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX])
{
- int cpu;
int i, j;
- for_each_online_cpu(cpu)
- for (i = 0; i < RA_PATTERN_ALL; i++)
- for (j = 0; j < RA_ACCOUNT_MAX; j++) {
- unsigned long n = per_cpu(ra_stat[i][j], cpu);
- ra_stats[i][j] += n;
- ra_stats[RA_PATTERN_ALL][j] += n;
- }
+ for (i = 0; i < RA_PATTERN_ALL; i++)
+ for (j = 0; j < RA_ACCOUNT_MAX; j++) {
+ s64 n = percpu_counter_sum(&ra_stat[i][j]);
+ ra_stats[i][j] += n;
+ ra_stats[RA_PATTERN_ALL][j] += n;
+ }
}
static int readahead_stats_show(struct seq_file *s, void *_)
{
- unsigned long i;
- unsigned long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX];
+ long long ra_stats[RA_PATTERN_MAX][RA_ACCOUNT_MAX];
+ int i;
seq_printf(s,
"%-10s %10s %10s %10s %10s %10s %10s %10s %10s %10s %10s\n",
@@ -153,8 +156,8 @@ static int readahead_stats_show(struct s
if (iocount == 0)
iocount = 1;
- seq_printf(s, "%-10s %10lu %10lu %10lu %10lu %10lu "
- "%10lu %10lu %10lu %10lu %10lu\n",
+ seq_printf(s, "%-10s %10lld %10lld %10lld %10lld %10lld "
+ "%10lld %10lld %10lld %10lld %10lld\n",
ra_pattern_names[i].name,
ra_stats[i][RA_ACCOUNT_COUNT],
ra_stats[i][RA_ACCOUNT_EOF],
@@ -196,6 +199,7 @@ static int __init readahead_create_debug
{
struct dentry *root;
struct dentry *entry;
+ int i, j;
root = debugfs_create_dir("readahead", NULL);
if (!root)
@@ -211,6 +215,10 @@ static int __init readahead_create_debug
if (!entry)
goto out;
+ for (i = 0; i < RA_PATTERN_ALL; i++)
+ for (j = 0; j < RA_ACCOUNT_MAX; j++)
+ percpu_counter_init(&ra_stat[i][j], 0);
+
return 0;
out:
printk(KERN_ERR "readahead: failed to create debugfs entries\n");
next prev parent reply other threads:[~2011-12-23 3:33 UTC|newest]
Thread overview: 107+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-29 13:09 [PATCH 0/9] readahead stats/tracing, backwards prefetching and more (v2) Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` [PATCH 1/9] block: limit default readahead size for small devices Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` [PATCH 2/9] readahead: snap readahead request to EOF Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 14:29 ` Jan Kara
2011-11-29 14:29 ` Jan Kara
2011-11-30 1:06 ` Wu Fengguang
2011-11-30 1:06 ` Wu Fengguang
2011-11-30 11:37 ` Jan Kara
2011-11-30 11:37 ` Jan Kara
2011-11-30 12:06 ` Wu Fengguang
2011-11-30 12:06 ` Wu Fengguang
2011-11-29 13:09 ` [PATCH 3/9] readahead: record readahead patterns Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 14:40 ` Jan Kara
2011-11-29 14:40 ` Jan Kara
2011-11-29 17:57 ` Andi Kleen
2011-11-29 17:57 ` Andi Kleen
2011-11-30 1:18 ` Wu Fengguang
2011-11-30 1:18 ` Wu Fengguang
2011-12-15 8:55 ` [PATCH] proc: show readahead state in fdinfo Wu Fengguang
2011-12-15 8:55 ` Wu Fengguang
2011-12-15 9:49 ` Ingo Molnar
2011-12-15 9:49 ` Ingo Molnar
2011-11-29 13:09 ` [PATCH 4/9] readahead: tag mmap page fault call sites Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 14:41 ` Jan Kara
2011-11-29 14:41 ` Jan Kara
2011-11-29 13:09 ` [PATCH 5/9] readahead: tag metadata " Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 14:45 ` Jan Kara
2011-11-29 14:45 ` Jan Kara
2011-11-29 13:09 ` [PATCH 6/9] readahead: add /debug/readahead/stats Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 15:21 ` Jan Kara
2011-11-29 15:21 ` Jan Kara
2011-11-30 0:44 ` Wu Fengguang
2011-11-30 0:44 ` Wu Fengguang
2011-12-14 6:36 ` Wu Fengguang
2011-12-14 6:36 ` Wu Fengguang
2011-12-19 16:32 ` Jan Kara
2011-12-19 16:32 ` Jan Kara
2011-12-21 1:29 ` Wu Fengguang
2011-12-21 1:29 ` Wu Fengguang
2011-12-21 4:06 ` Dave Chinner
2011-12-21 4:06 ` Dave Chinner
2011-12-23 3:33 ` Wu Fengguang [this message]
2011-12-23 3:33 ` Wu Fengguang
2011-12-23 11:16 ` Jan Kara
2011-12-23 11:16 ` Jan Kara
2011-11-29 13:09 ` [PATCH 7/9] readahead: add vfs/readahead tracing event Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 15:22 ` Jan Kara
2011-11-29 15:22 ` Jan Kara
2011-11-30 0:42 ` Wu Fengguang
2011-11-30 0:42 ` Wu Fengguang
2011-11-30 11:44 ` Jan Kara
2011-11-30 11:44 ` Jan Kara
2011-11-30 12:06 ` Wu Fengguang
2011-11-30 12:06 ` Wu Fengguang
2011-12-06 15:30 ` Christoph Hellwig
2011-12-06 15:30 ` Christoph Hellwig
2011-12-07 9:18 ` Wu Fengguang
2011-12-07 9:18 ` Wu Fengguang
2011-12-08 9:03 ` [PATCH] writeback: show writeback reason with __print_symbolic Wu Fengguang
2011-12-08 9:03 ` Wu Fengguang
2011-11-29 13:09 ` [PATCH 8/9] readahead: basic support for backwards prefetching Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 15:35 ` Jan Kara
2011-11-29 15:35 ` Jan Kara
2011-11-29 16:37 ` Pádraig Brady
2011-11-29 16:37 ` Pádraig Brady
2011-11-29 16:37 ` Pádraig Brady
2011-11-30 0:24 ` Wu Fengguang
2011-11-30 0:24 ` Wu Fengguang
2011-11-30 0:24 ` Wu Fengguang
2011-11-30 0:37 ` Wu Fengguang
2011-11-30 0:37 ` Wu Fengguang
2011-11-30 11:21 ` Jan Kara
2011-11-30 11:21 ` Jan Kara
2011-11-29 13:09 ` [PATCH 9/9] readahead: dont do start-of-file readahead after lseek() Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
2011-11-29 13:09 ` Wu Fengguang
-- strict thread matches above, loose matches on Subject: below --
2012-01-27 3:05 [PATCH 0/9] readahead stats/tracing, backwards prefetching and more (v4) Wu Fengguang
2012-01-27 3:05 ` [PATCH 6/9] readahead: add /debug/readahead/stats Wu Fengguang
2012-01-27 3:05 ` Wu Fengguang
2012-01-27 3:05 ` Wu Fengguang
2012-01-27 16:21 ` Christoph Lameter
2012-01-27 16:21 ` Christoph Lameter
2012-01-27 20:15 ` Andrew Morton
2012-01-27 20:15 ` Andrew Morton
2012-01-29 5:07 ` Wu Fengguang
2012-01-29 5:07 ` Wu Fengguang
2012-01-30 4:02 ` Dave Chinner
2012-01-30 4:02 ` Dave Chinner
2012-02-11 4:31 [PATCH 0/9] readahead stats/tracing, backwards prefetching and more (v5) Wu Fengguang
2012-02-11 4:31 ` [PATCH 6/9] readahead: add /debug/readahead/stats Wu Fengguang
2012-02-11 4:31 ` Wu Fengguang
2012-02-11 4:31 ` 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=20111223033320.GA21390@localhost \
--to=fengguang.wu@intel.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=axboe@kernel.dk \
--cc=david@fromorbit.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mingo@elte.hu \
--cc=riel@redhat.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 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.