From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759948AbbEEQKR (ORCPT ); Tue, 5 May 2015 12:10:17 -0400 Received: from mail-ie0-f181.google.com ([209.85.223.181]:35462 "EHLO mail-ie0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2993394AbbEEP26 (ORCPT ); Tue, 5 May 2015 11:28:58 -0400 MIME-Version: 1.0 In-Reply-To: <5548E0E5.60309@linux.vnet.ibm.com> References: <1430799331-20445-1-git-send-email-tahsin@google.com> <20150505091714.GF21418@twins.programming.kicks-ass.net> <55489D9E.4010003@linux.vnet.ibm.com> <20150505105812.GK21418@twins.programming.kicks-ass.net> <5548E0E5.60309@linux.vnet.ibm.com> Date: Tue, 5 May 2015 08:28:55 -0700 Message-ID: Subject: Re: [PATCH] x86/spinlocks: Fix regression in spinlock contention detection From: Tahsin Erdogan To: Raghavendra K T Cc: Peter Zijlstra , tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org, Waiman.Long@hp.com, borntraeger@de.ibm.com, oleg@redhat.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org //#define LOCK_INC ((unsigned int)2) // case 1 This works because it is casting to unsigned int. If you change it to unsigned short int, it becomes consistent with case 2. On Tue, May 5, 2015 at 8:25 AM, Raghavendra K T wrote: > On 05/05/2015 07:33 PM, Tahsin Erdogan wrote: >> >> The conversion to signed happens with types shorter than int (__ticket_t >> is either u8 or u16). >> >> By changing Raghavendra's program to use unsigned short int, you can see >> the problem: >> >> ================ >> #include >> >> #define LOCK_INC 2 >> >> int main() >> { >> unsigned short int head = 32700, tail=2; >> >> if ((tail - head) > LOCK_INC) >> printf(" tail - head > LOCK_INC \n"); >> else >> printf(" tail - head < LOCK_INC \n"); >> >> return 0; >> } >> >> ================ >> gcc -g -o t main.c >> ./t >> tail - head < LOCK_INC >> >> However, having just unsigned int returns the opposite result (unsigned >> int head = 32700, tail=2;) >> > > Interestingly, > > #include > > //#define LOCK_INC ((unsigned int)2) // case 1 > #define LOCK_INC 2 //case 2 > > int main() > { > unsigned short int head = 32700, tail=2; > > if ((tail - head) > LOCK_INC) > printf(" tail - head > LOCK_INC \n"); > else > printf(" tail - head < LOCK_INC \n"); > > return 0; > } > > case 1 works here (PeterZ's stricter version) > > case 2 gives tail - head < LOCK_INC > > But is it not that we have case 1 we are looking here ? > >