svn commit: r242014 - head/sys/kern

Attilio Rao attilio at freebsd.org
Wed Oct 24 20:29:24 UTC 2012


On Wed, Oct 24, 2012 at 9:25 PM, Andre Oppermann <andre at freebsd.org> wrote:
> On 24.10.2012 21:06, Attilio Rao wrote:
>>
>> On Wed, Oct 24, 2012 at 8:00 PM, Jim Harris <jim.harris at gmail.com> wrote:
>>>
>>> On Wed, Oct 24, 2012 at 11:43 AM, John Baldwin <jhb at 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


More information about the svn-src-head mailing list