On Wed, Oct 24, 2012 at 9:25 PM, Andre Oppermann <an...@freebsd.org> wrote: > On 24.10.2012 21:06, Attilio Rao wrote: >> >> On Wed, Oct 24, 2012 at 8:00 PM, Jim Harris <jim.har...@gmail.com> wrote: >>> >>> On Wed, Oct 24, 2012 at 11:43 AM, John Baldwin <j...@freebsd.org> wrote: >>>> >>>> On Wednesday, October 24, 2012 2:36:41 pm Jim Harris wrote: >>>>> >>>>> Author: jimharris >>>>> Date: Wed Oct 24 18:36:41 2012 >>>>> New Revision: 242014 >>>>> URL: http://svn.freebsd.org/changeset/base/242014 >>>>> >>>>> Log: >>>>> Pad tdq_lock to avoid false sharing with tdq_load and tdq_cpu_idle. >>>>> >>>>> This enables CPU searches (which read tdq_load) to operate >>>>> independently >>>>> of any contention on the spinlock. Some scheduler-intensive >>>>> workloads >>>>> running on an 8C single-socket SNB Xeon show considerable >>>>> improvement with >>>>> this change (2-3% perf improvement, 5-6% decrease in CPU util). >>>>> >>>>> Sponsored by: Intel >>>>> Reviewed by: jeff >>>>> >>>>> Modified: >>>>> head/sys/kern/sched_ule.c >>>>> >>>>> Modified: head/sys/kern/sched_ule.c >>>>> >>>> >>>> ============================================================================== >>>>> >>>>> --- head/sys/kern/sched_ule.c Wed Oct 24 18:33:44 2012 (r242013) >>>>> +++ head/sys/kern/sched_ule.c Wed Oct 24 18:36:41 2012 (r242014) >>>>> @@ -223,8 +223,13 @@ static int sched_idlespinthresh = -1; >>>>> * locking in sched_pickcpu(); >>>>> */ >>>>> struct tdq { >>>>> - /* Ordered to improve efficiency of cpu_search() and switch(). */ >>>>> + /* >>>>> + * Ordered to improve efficiency of cpu_search() and switch(). >>>>> + * tdq_lock is padded to avoid false sharing with tdq_load and >>>>> + * tdq_cpu_idle. >>>>> + */ >>>>> struct mtx tdq_lock; /* run queue lock. */ >>>>> + char pad[64 - sizeof(struct mtx)]; >>>> >>>> >>>> Can this use 'tdq_lock __aligned(CACHE_LINE_SIZE)' instead? >>>> >>> >>> No - that doesn't pad it. I believe that only works if it's global, >>> i.e. not part of a data structure. >> >> >> As I've already said in another thread __align() doesn't work on >> object declaration, so what that won't pad it either if it is global >> or part of a struct. >> It is just implemented as __attribute__((aligned(X))): >> http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html > > > Actually it seems gcc itself doesn't really care and it up to the > linker to honor that.
Yes but the concept being that if you use __aligned() properly (when defining a struct) the object will be correctly sized, so you will get padding automatically. Attilio -- Peace can only be achieved by understanding - A. Einstein _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"