From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752150Ab1AYBm2 (ORCPT ); Mon, 24 Jan 2011 20:42:28 -0500 Received: from claw.goop.org ([74.207.240.146]:50023 "EHLO claw.goop.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751547Ab1AYBm1 (ORCPT ); Mon, 24 Jan 2011 20:42:27 -0500 Message-ID: <4D3E2A80.1000203@goop.org> Date: Mon, 24 Jan 2011 17:42:24 -0800 From: Jeremy Fitzhardinge User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101209 Fedora/3.1.7-0.35.b3pre.fc14 Lightning/1.0b3pre Thunderbird/3.1.7 MIME-Version: 1.0 To: Nick Piggin CC: Peter Zijlstra , "H. Peter Anvin" , Ingo Molnar , the arch/x86 maintainers , Linux Kernel Mailing List , Nick Piggin , Jeremy Fitzhardinge Subject: Re: [PATCH 6/6] x86/ticketlock: make __ticket_spin_trylock common References: <4086953399116e4d9a14f9fa1aa8cf33aaef753d.1295909909.git.jeremy.fitzhardinge@citrix.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/24/2011 05:16 PM, Nick Piggin wrote: > On Tue, Jan 25, 2011 at 10:41 AM, Jeremy Fitzhardinge wrote: >> From: Jeremy Fitzhardinge >> >> Make trylock code common regardless of ticket size. > What's the asm for this look like? Asm: movzwl (%rdi), %eax # lock_1(D)->slock, tmp cmpb %ah,%al # tmp leal 0x100(%rax), %edx # tmp, new jne 1f lock; cmpxchgw %dx,(%rdi) # new, lock_1(D)->slock 1: sete %dl # new movzbl %dl,%eax # new, tmp C: movw (%rdi), %dx # lock_2(D)->D.5949.tickets, old xorl %eax, %eax # D.13954 movzbl %dh, %ecx # old, tmp70 cmpb %dl, %cl # old, tmp70 jne .L5 #, leal 256(%rdx), %ecx #, D.13956 movl %edx, %eax # old, __ret lock; cmpxchgw %cx,(%rdi) # D.13956,* lock cmpw %dx, %ax # old, __ret sete %al #, D.13954 movzbl %al, %eax # D.13954, D.13954 .L5: The C version can't take advantage of the fact that the cmpxchg directly sets the flags, so it ends up re-comparing the old and swapped-out values to set the return. And it doesn't re-use the same sete to set the return value in the quick failed-to-acquire path. It might be worth having a generic cmpxchg() variant which returns a succeed/fail flag rather than the fetched value, to avoid comparison in this case - since many (most?) cmpxchg() callers end up doing that comparison. How performance critical is trylock? I guess the ones in fs/dcache.c are the ones looming large in your mind. J