From: Mingming Cao <cmm@us.ibm.com>
To: linux-ext4@vger.kernel.org
Subject: [RFC][PATCH 6/6] delalloc ENOSPC: improve percpu counter accounting accurate
Date: Sun, 01 Jun 2008 16:36:25 -0700 [thread overview]
Message-ID: <1212363385.4368.69.camel@localhost.localdomain> (raw)
percpu counter: update center counter when sum per-cpu counter
From: Mingming cao <cmm@us.ibm.com>
Delayed allocation need to check free blocks at every write time.
percpu_counter_read_positive() is not quit accurate
but using percpu_counter_sum_positive() for every write
frequently is quite expensive.
This patch added a new function to update center counter when
sum up per-cpu counters, to increase the accurate rate
for next percpu_counter_read()(which reads only the center counter
and require less calling expensive percpu_counter_sum().(in
ext4_has_free_blocks)
Signed-off-by: Mingming cao <cmm@us.ibm.com>
---
fs/ext4/balloc.c | 2 +-
include/linux/percpu_counter.h | 12 +++++++++---
lib/percpu_counter.c | 7 ++++++-
3 files changed, 16 insertions(+), 5 deletions(-)
Index: linux-2.6.26-rc4/include/linux/percpu_counter.h
===================================================================
--- linux-2.6.26-rc4.orig/include/linux/percpu_counter.h 2008-06-01 15:33:09.000000000 -0700
+++ linux-2.6.26-rc4/include/linux/percpu_counter.h 2008-06-01 15:33:14.000000000 -0700
@@ -35,7 +35,7 @@ int percpu_counter_init_irq(struct percp
void percpu_counter_destroy(struct percpu_counter *fbc);
void percpu_counter_set(struct percpu_counter *fbc, s64 amount);
void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch);
-s64 __percpu_counter_sum(struct percpu_counter *fbc);
+s64 __percpu_counter_sum(struct percpu_counter *fbc, int set);
static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount)
{
@@ -44,13 +44,19 @@ static inline void percpu_counter_add(st
static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc)
{
- s64 ret = __percpu_counter_sum(fbc);
+ s64 ret = __percpu_counter_sum(fbc, 0);
return ret < 0 ? 0 : ret;
}
+static inline s64 percpu_counter_sum_and_set(struct percpu_counter *fbc)
+{
+ return __percpu_counter_sum(fbc, 1);
+}
+
+
static inline s64 percpu_counter_sum(struct percpu_counter *fbc)
{
- return __percpu_counter_sum(fbc);
+ return __percpu_counter_sum(fbc, 0);
}
static inline s64 percpu_counter_read(struct percpu_counter *fbc)
Index: linux-2.6.26-rc4/lib/percpu_counter.c
===================================================================
--- linux-2.6.26-rc4.orig/lib/percpu_counter.c 2008-06-01 15:33:09.000000000 -0700
+++ linux-2.6.26-rc4/lib/percpu_counter.c 2008-06-01 15:33:14.000000000 -0700
@@ -52,7 +52,7 @@ EXPORT_SYMBOL(__percpu_counter_add);
* Add up all the per-cpu counts, return the result. This is a more accurate
* but much slower version of percpu_counter_read_positive()
*/
-s64 __percpu_counter_sum(struct percpu_counter *fbc)
+s64 __percpu_counter_sum(struct percpu_counter *fbc, int set)
{
s64 ret;
int cpu;
@@ -62,7 +62,12 @@ s64 __percpu_counter_sum(struct percpu_c
for_each_online_cpu(cpu) {
s32 *pcount = per_cpu_ptr(fbc->counters, cpu);
ret += *pcount;
+ if (set)
+ *pcount = 0;
}
+ if (set)
+ fbc->count = ret;
+
spin_unlock(&fbc->lock);
return ret;
}
Index: linux-2.6.26-rc4/fs/ext4/balloc.c
===================================================================
--- linux-2.6.26-rc4.orig/fs/ext4/balloc.c 2008-06-01 15:33:36.000000000 -0700
+++ linux-2.6.26-rc4/fs/ext4/balloc.c 2008-06-01 15:34:28.000000000 -0700
@@ -1626,7 +1626,7 @@ ext4_fsblk_t ext4_has_free_blocks(struct
if (free_blocks - root_blocks < FBC_BATCH)
free_blocks =
- percpu_counter_sum_positive(&sbi->s_freeblocks_counter);
+ percpu_counter_sum_positive_set(&sbi->s_freeblocks_counter);
if (free_blocks - root_blocks < nblocks )
return free_blocks -root_blocks;
return nblocks;
next reply other threads:[~2008-06-01 23:36 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-01 23:36 Mingming Cao [this message]
2008-06-02 0:19 ` [RFC][PATCH 6/6] delalloc ENOSPC: improve percpu counter accounting accurate Akira Fujita
2008-06-02 2:30 ` Mingming Cao
2008-06-02 2:45 ` Akira Fujita
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=1212363385.4368.69.camel@localhost.localdomain \
--to=cmm@us.ibm.com \
--cc=linux-ext4@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.