Re: [patch 44/52] fs: icache per-CPU sb inode lists and locks

Nick Piggin
2010-07-01T08:00:53Z

On Thu, Jul 01, 2010 at 01:12:00PM +1000, Dave Chinner wrote:
> On Wed, Jun 30, 2010 at 10:08:50PM +1000, Nick Piggin wrote:
> > > I can't say that I'm a great fan of hiding loop context in defines
> > > like this. It reminds far too much of how parts of Irix slowly
> > > ossified because they ended up mess of complex, fragile macros that
> > > nobody fully understood...
> >
> > It's not perfect. I think it is a lot better than open coding
> > (which I tried before) because that really muddies up the intention
> > of the loop body.
>
> Something like this doesn't seem particularly bad:
>
> static inline struct list_head *
> inode_get_sb_list(struct super_block *sb, int *i)
> {
> int cpu;
>
> cpu = cpumask_next(i, cpu_possible_mask);
> if (cpu >= nr_cpu_ids)
> return NULL;
> *i = cpu;
> #ifdef CONFIG_SMP
> return per_cpu_ptr(sb->s_inodes, cpu);
> #else
> return &sb->s_inodes;
> #endif
> }
>
> and:
>
> struct list_head *list;
> int i;
> ....
> i = -1;
> while ((list = inode_get_sb_list(sb, &i))) {
> list_for_each_entry_rcu(inode, tmp, list, i_sb_list) {
> .....
> }
> }
>
> I'd much prefer this to hiding the outer loop in macros...

I don't see it as an improvement. A macro called
inode_sb_list_for_each_entry is rather obvious and idiomatic as to what
it does. You don't need to look at the implementation if you just need
to walk the inode sb list.