lkml.org 
[lkml]   [2015]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] x86/spinlocks: Fix regression in spinlock contention detection
    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 ?




    \
     
     \ /
      Last update: 2015-05-05 19:01    [W:3.936 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site