All of lore.kernel.org
 help / color / mirror / Atom feed
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;




             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.