This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
Home Products Support Community News


[Xen-devel] Re: [PATCH RFC 02/12] x86/ticketlock: convert spin loop to C

To: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Subject: [Xen-devel] Re: [PATCH RFC 02/12] x86/ticketlock: convert spin loop to C
From: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Date: Mon, 02 Aug 2010 08:17:53 -0700
Cc: Nick Piggin <npiggin@xxxxxxx>, Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Linux Kernel Mailing List <linux-kernel@xxxxxxxxxxxxxxx>, Jan Beulich <JBeulich@xxxxxxxxxx>, Avi Kivity <avi@xxxxxxxxxx>
Delivery-date: Mon, 02 Aug 2010 08:18:36 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1280761639.1923.213.camel@laptop>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <cover.1279328276.git.jeremy.fitzhardinge@xxxxxxxxxx> <cf01e01095f802dc5082e82a8e96c84903e929a6.1279328276.git.jeremy.fitzhardinge@xxxxxxxxxx> <1280761639.1923.213.camel@laptop>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20100720 Fedora/3.1.1-1.fc13 Lightning/1.0b2pre Thunderbird/3.1.1
 On 08/02/2010 08:07 AM, Peter Zijlstra wrote:
On Fri, 2010-07-16 at 18:03 -0700, Jeremy Fitzhardinge wrote:
+       register union {
+               struct __raw_tickets tickets;
+               unsigned short slock;
+       } inc = { .slock = 1<<  TICKET_SHIFT };
   register arch_spinlock_t inc = { .tickets = { .head = 1, .tail = 0 } };

> From a quick look you can basically replace all TICKET_SHIFT usage (1<<
TICKET_SHIFT) with such a constant.

Mostly. In the later patch to convert trylock in to C, you need it to construct an argument for cmpxchg (which can only take a scalar, even if it does have a struct packed into it).

[ Also, does gcc really listen to the register hint these days? ]

It doesn't make much different in this case. I think the only real effect is that its illegal to take the address of a register variable.

+       asm volatile (LOCK_PREFIX "xaddw %w0, %1\n"
+                     : "+Q" (inc), "+m" (lock->slock) : : "memory", "cc");
  "+Q" (inc->slock)

+       for (;;) {
+               if (inc.tickets.head == inc.tickets.tail)
+                       return;
+               cpu_relax();
+               inc.tickets.head = ACCESS_ONCE(lock->tickets.head);
+       }
+       barrier();              /* make sure nothing creeps before the lock is 
taken */
How will it ever get to that barrier() ?

The compiler treats this as being:

        for (;;) {
                if (inc.tickets.head == inc.tickets.tail)
                        goto out;
out:    barrier();

(Which would probably be a reasonable way to clarify the code.)

Without the barrier there's a risk of locked-region code being scheduled before the for(;;) loop.


Xen-devel mailing list