Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 05 Oct 2009 11:21:45 -0400
From:      John Baldwin <jhb@FreeBSD.org>
To:        Alan Cox <alc@cs.rice.edu>
Cc:        Alan Cox <alc@FreeBSD.org>, svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r197750 - head/sys/vm
Message-ID:  <4ACA0F09.2010808@FreeBSD.org>
In-Reply-To: <4ACA0000.2080005@cs.rice.edu>
References:  <200910041853.n94IrAf7082338@svn.freebsd.org> <4AC9F4F4.4030008@FreeBSD.org> <4ACA0000.2080005@cs.rice.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
Alan Cox wrote:
> John Baldwin wrote:
>> Alan Cox wrote:
>>> Author: alc
>>> Date: Sun Oct  4 18:53:10 2009
>>> New Revision: 197750
>>> URL: http://svn.freebsd.org/changeset/base/197750
>>>
>>> Log:
>>>   Align and pad the page queue and free page queue locks so that the 
>>> linker
>>>   can't possibly place them together within the same cache line.
>>>     MFC after:    3 weeks
>>>
>>> Modified:
>>>   head/sys/vm/vm_page.c
>>>   head/sys/vm/vm_page.h
>>>
>>> Modified: head/sys/vm/vm_page.c
>>> ============================================================================== 
>>>
>>> --- head/sys/vm/vm_page.c    Sun Oct  4 17:22:51 2009    (r197749)
>>> +++ head/sys/vm/vm_page.c    Sun Oct  4 18:53:10 2009    (r197750)
>>> @@ -135,8 +135,8 @@ __FBSDID("$FreeBSD$");
>>>   */
>>>  
>>>  struct vpgqueues vm_page_queues[PQ_COUNT];
>>> -struct mtx vm_page_queue_mtx;
>>> -struct mtx vm_page_queue_free_mtx;
>>> +struct vpglocks vm_page_queue_lock;
>>> +struct vpglocks vm_page_queue_free_lock;
>>
>> I think you can do this by just:
>>
>> struct mtx vm_page_queue_mtx __aligned(CACHE_LINE_SIZE);
>>
>> without the need for a wrapper structure.
>>
> 
> Unfortunately, no.  When I compile the following example:
> 
> int a;
> int b __attribute__((aligned(16)));
> int x;
> int y;
> int z;
> 
> int
> main(void)
> {
> 
>        return (0);
> }
> 
> I get the following:
> 
> 080495b4 A __bss_start
> 080495b4 A _edata
> 080495c0 b completed.4860
> 080495c4 B environ
> 080495d0 B b
> 080495d4 B x
> 080495d8 B z
> 080495dc B y
> 080495e0 B a
> 080495e4 A _end
> 
> Thus, "b" is aligned as specified, but not padded to 16 bytes.

Do you care what is in the padding in this case or more about just 
having each mutex on a separate cache line?  __aligned() is fine if you 
don't mind the padding getting reused for something else.

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4ACA0F09.2010808>