From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wu Fengguang Subject: Re: [PATCH 2/3] DEBUGFS: Add per cpu counters Date: Tue, 6 Dec 2011 19:44:38 +0800 Message-ID: <20111206114438.GA17186@localhost> References: <1322851407-17182-1-git-send-email-andi@firstfloor.org> <1322851407-17182-3-git-send-email-andi@firstfloor.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: "greg@kroah.com" , "linux-kernel@vger.kernel.org" , "linux-fsdevel@vger.kernel.org" , Andi Kleen To: Andi Kleen Return-path: Content-Disposition: inline In-Reply-To: <1322851407-17182-3-git-send-email-andi@firstfloor.org> Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org On Sat, Dec 03, 2011 at 02:43:26AM +0800, Andi Kleen wrote: > From: Andi Kleen > > Add a simple way to export per cpu counters in debugfs. > > This is done using a section, so that they can be declared using > a simple macro with minimal typing. > > OPEN: modules are not supported yet. > > Signed-off-by: Andi Kleen > --- > fs/debugfs/Makefile | 2 +- > fs/debugfs/counter.c | 73 +++++++++++++++++++++++++++++++++++++ > include/asm-generic/vmlinux.lds.h | 6 +++ > include/linux/debugfs.h | 27 ++++++++++++++ > 4 files changed, 107 insertions(+), 1 deletions(-) > create mode 100644 fs/debugfs/counter.c > > diff --git a/fs/debugfs/Makefile b/fs/debugfs/Makefile > index 840c456..21be8d3 100644 > --- a/fs/debugfs/Makefile > +++ b/fs/debugfs/Makefile > @@ -1,4 +1,4 @@ > -debugfs-objs := inode.o file.o > +debugfs-objs := inode.o file.o counter.o > > obj-$(CONFIG_DEBUG_FS) += debugfs.o > > diff --git a/fs/debugfs/counter.c b/fs/debugfs/counter.c > new file mode 100644 > index 0000000..2372faf > --- /dev/null > +++ b/fs/debugfs/counter.c > @@ -0,0 +1,73 @@ > +#include > +#include > +#include > +#include > + > +/* OPEN: implement module support */ Yeah, I think the module support would benefit my case as well. To support module users, init_counters() will be exported with the __start___debugfs/__stop___debugfs hard coding removed. Then I'll be call it from the readahead initilization code: DEFINE_PER_CPU(unsigned long[RA_PATTERN_MAX][RA_ACCOUNT_MAX], ra_counter); struct debugfs_counter ra_pcpu_counter[RA_PATTERN_MAX][RA_ACCOUNT_MAX]; // init ra_pcpu_counter in a loop for each pattern init_counters(ra_pcpu_counter[pattern], ra_pcpu_counter[pattern+1]); Does this usage sound reasonable? > +extern struct debugfs_counter __start___debugfs[], __stop___debugfs[]; > + > +static unsigned sum_counter(unsigned __percpu *counter) > +{ > + int cpu; > + unsigned sum = 0; > + > + for_each_online_cpu (cpu) > + sum += per_cpu(*counter, cpu); > + return sum; > +} > + > +static int > +dump_counters(struct seq_file *m, > + struct debugfs_counter *cnt, struct debugfs_counter *stop, > + char *fn) > +{ > + int n = 0; > + for (; cnt < stop; cnt++) > + if (fn[0] == cnt->fn[0] && !strcmp(cnt->fn, fn)) > + n += seq_printf(m, "%s: %u\n", > + cnt->name, sum_counter(cnt->ptr)); > + return n; > +} > + > +static int show_debugfs_counter(struct seq_file *m, void *arg) > +{ > + int n; > + n = dump_counters(m, __start___debugfs, __stop___debugfs, m->private); That hard coded __start___debugfs/__stop___debugfs is OK for POC, and will need to be improved to work with multiple users in kernel. Thanks, Fengguang