Messages in this thread | | | Date | Tue, 05 May 2015 21:08:38 +0530 | From | Raghavendra K T <> | Subject | Re: [PATCH] x86/spinlocks: Fix regression in spinlock contention detection |
| |
On 05/05/2015 09:02 PM, Waiman Long wrote: > On 05/05/2015 11: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 <stdio.h> >>> >>> #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 <stdio.h> >> >> //#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 ? >> >> > > __TICKET_LOCK_INC is currently ((unsigned short)2), not ((unsigned > int)2). That makes a difference. >
aah missed that part :). That makes sense.
Good catch Tahsin.
| |