Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Oct 2012 12:00:23 -0700
From:      Jim Harris <jim.harris@gmail.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r242014 - head/sys/kern
Message-ID:  <CAJP=Hc9wLv02sX%2BWnzZtaKccSAFzqg8jT0oP13nLw1jMfwOEBQ@mail.gmail.com>
In-Reply-To: <201210241443.25988.jhb@freebsd.org>
References:  <201210241836.q9OIafqo073002@svn.freebsd.org> <201210241443.25988.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Oct 24, 2012 at 11:43 AM, John Baldwin <jhb@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.

I could have aligned tdq_cg instead of using the char array to get the
same effect.  I chose the padding only because there was precedence
for it in sys/vm/vm_page.h - struct vpglocks.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJP=Hc9wLv02sX%2BWnzZtaKccSAFzqg8jT0oP13nLw1jMfwOEBQ>