lkml.org 
[lkml]   [2010]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [patch 44/52] fs: icache per-CPU sb inode lists and locks
    On Wed, Jun 30, 2010 at 07:26:41PM +1000, Dave Chinner wrote:
    > On Thu, Jun 24, 2010 at 01:02:56PM +1000, npiggin@suse.de wrote:
    > > Signed-off-by: Nick Piggin <npiggin@suse.de>
    > .....
    > > @@ -2194,6 +2198,58 @@ static inline void insert_inode_hash(str
    > >
    > > extern void file_sb_list_add(struct file *f, struct super_block *sb);
    > > extern void file_sb_list_del(struct file *f);
    > > +#ifdef CONFIG_SMP
    > > +
    > > +/*
    > > + * These macros iterate all inodes on all CPUs for a given superblock.
    > > + * rcu_read_lock must be held.
    > > + */
    > > +#define do_inode_list_for_each_entry_rcu(__sb, __inode) \
    > > +{ \
    > > + int i; \
    > > + for_each_possible_cpu(i) { \
    > > + struct list_head *list; \
    > > + list = per_cpu_ptr((__sb)->s_inodes, i); \
    > > + list_for_each_entry_rcu((__inode), list, i_sb_list)
    > > +
    > > +#define while_inode_list_for_each_entry_rcu \
    > > + } \
    > > +}
    > > +
    > > +#define do_inode_list_for_each_entry_safe(__sb, __inode, __tmp) \
    > > +{ \
    > > + int i; \
    > > + for_each_possible_cpu(i) { \
    > > + struct list_head *list; \
    > > + list = per_cpu_ptr((__sb)->s_inodes, i); \
    > > + list_for_each_entry_safe((__inode), (__tmp), list, i_sb_list)
    > > +
    > > +#define while_inode_list_for_each_entry_safe \
    > > + } \
    > > +}
    > > +
    > > +#else
    > > +
    > > +#define do_inode_list_for_each_entry_rcu(__sb, __inode) \
    > > +{ \
    > > + struct list_head *list; \
    > > + list = &(sb)->s_inodes; \
    > > + list_for_each_entry_rcu((__inode), list, i_sb_list)
    > > +
    > > +#define while_inode_list_for_each_entry_rcu \
    > > +}
    > > +
    > > +#define do_inode_list_for_each_entry_safe(__sb, __inode, __tmp) \
    > > +{ \
    > > + struct list_head *list; \
    > > + list = &(sb)->s_inodes; \
    > > + list_for_each_entry_rcu((__inode), (__tmp), list, i_sb_list)
    > > +
    > > +#define while_inode_list_for_each_entry_safe \
    > > +}
    >
    > 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.



    \
     
     \ /
      Last update: 2010-06-30 16:35    [W:0.024 / U:64.232 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site