svn commit: r242014 - head/sys/kern
Jim Harris
jim.harris at gmail.com
Wed Oct 24 19:00:25 UTC 2012
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.
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.
More information about the svn-src-head
mailing list