On Wed, Mar 16, 2016 at 02:23:21PM +0100, Rafael J. Wysocki wrote: > On Wed, Mar 16, 2016 at 2:10 PM, Peter Zijlstra <pet...@infradead.org> wrote: > > (this would of course require we allocate struct update_util_data with > > the proper alignment thingies etc..)
> > diff --git a/include/linux/sched.h b/include/linux/sched.h > > index ba49c9efd0b2..d34d75c5cc93 100644 > > --- a/include/linux/sched.h > > +++ b/include/linux/sched.h > > @@ -3236,8 +3236,10 @@ static inline unsigned long rlimit_max(unsigned int > > limit) > > > > #ifdef CONFIG_CPU_FREQ > > struct update_util_data { > > - void (*func)(struct update_util_data *data, > > - u64 time, unsigned long util, unsigned long max); > > + unsigned long *cfs_util_avg; > > + unsigned long *cfs_util_max; > > + > > + void (*func)(struct update_util_data *data, u64 time); > > }; we should add: ____cacheline_aligned here > How do we ensure proper alignment? Depends on the allocator; not all of them respect the struct alignment attribute. kernel/sched/cpufreq.c:DEFINE_PER_CPU(struct update_util_data *, cpufreq_update_util_data); That one could use: DEFINE_PER_CPU_ALIGNED() instead as would this one: drivers/cpufreq/cpufreq_governor.c:static DEFINE_PER_CPU(struct cpu_dbs_info, cpu_dbs); Because when you cacheline align dbs_info, its update_util_data member will also get the correct alignment because of the structure attribute.