Messages in this thread | | | Date | Tue, 05 May 2015 11:32:32 -0400 | From | Waiman Long <> | Subject | Re: [PATCH] x86/spinlocks: Fix regression in spinlock contention detection |
| |
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.
Cheers, Longman
| |