Messages in this thread | | | Subject | Re: [patch] fs: scale vfsmount refcount (was Re: rcu-walk and dcache scaling tree update and status) | From | Eric Dumazet <> | Date | Mon, 13 Dec 2010 08:25:13 +0100 |
| |
Le lundi 13 décembre 2010 à 13:42 +1100, Nick Piggin a écrit : > + */ > +static inline void add_mnt_count(struct vfsmount *mnt, int n)
maybe name it __add_mnt_count() (should be called with preempt off)
> +{ > +#ifdef CONFIG_SMP > + (*per_cpu_ptr(mnt->mnt_count, smp_processor_id())) += n;
__this_cpu_add(mnt->mnt_count, n);
> +#else > + mnt->mnt_count += n; > +#endif > +}
and define a preempt safe version :
static inline void __add_mnt_count(struct vfsmount *mnt, int n) { #ifdef CONFIG_SMP __this_cpu_add(mnt->mnt_count, n); #else mnt->mnt_count += n; #endif }
static inline void add_mnt_count(struct vfsmount *mnt, int n) { #ifdef CONFIG_SMP this_cpu_add(mnt->mnt_count, n); #else preempt_disable(); mnt->mnt_count += n; preempt_enable(); #endif }
> + > +static inline void set_mnt_count(struct vfsmount *mnt, int n) > +{ > +#ifdef CONFIG_SMP
> + preempt_disable(); > + (*per_cpu_ptr(mnt->mnt_count, smp_processor_id())) = n; > + preempt_enable();
last 3 lines can be replaced by :
this_cpu_write(mnt->mnt_count, n);
> +#else > + mnt->mnt_count = n; > +#endif > +} > +
> #ifdef CONFIG_SMP > int __percpu *mnt_writers; > + int __percpu *mnt_count; > #else > int mnt_writers; > + int mnt_count; > #endif
You could use a struct and one per cpu allocation to use one cache line for both objects :
struct mnt_counters { int writers; int count; };
...
#ifdef CONFIG_SMP struct mnt_counters __percpu *mnt_counters; #else struct mnt_counters mnt_counters; #endif
This would use one pointer instead of two in SMP
-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |