lkml.org 
[lkml]   [2006]   [Sep]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: i386 PDA patches use of %gs
    Arjan van de Ven wrote:
    > gcc can be fixed if needed. I don't see the kernel switching to use that
    > any time soon though...

    I have a preliminary patch to implement per_cpu() in terms of __thread.

    Hm, my initial tests comparing reloading a NULL selector vs a real
    selector shows absolutely no measurable difference, on either a modern
    Core Duo, or an old P4... Admittedly this is with an artificial
    usermode test program, but I'd expect to see *some* difference if
    there's a difference.

    J


    --

    /* gcc -o time-segops time-segops.c -O2 -Wall -lrt -fomit-frame-pointer -funroll-loops */
    #include <stdio.h>
    #include <time.h>

    #define COUNT 10000000

    static inline void sync(void)
    {
    int a,b,c,d;

    asm volatile("cpuid"
    : "=a" (a), "=b" (b), "=c" (c), "=d" (d)
    : "0" (0), "2" (0)
    : "memory");
    }

    static void test_none(void)
    {
    int i;

    for(i = 0; i < COUNT; i++) {
    sync();
    }
    }

    static void test_fs(void)
    {
    int i, ds;
    asm volatile("mov %%ds,%0" : "=r" (ds));

    for(i = 0; i < COUNT; i++) {
    asm volatile("push %%fs; mov %0, %%fs; popl %%fs"
    : : "r" (ds));
    sync();
    }
    }

    static void test_gs(void)
    {
    int i, ds;
    asm volatile("mov %%ds,%0" : "=r" (ds));

    for(i = 0; i < COUNT; i++) {
    asm volatile("push %%gs; mov %0, %%gs; popl %%gs"
    : : "r" (ds));
    sync();
    }
    }

    typedef void (*test_t)(void);

    static test_t tests[] = {
    test_none,
    test_fs,
    test_gs,
    NULL,
    };

    int main()
    {
    int i;
    int ds, fs, gs;

    asm volatile("mov %%ds, %0; "
    "mov %%fs, %1; "
    "mov %%gs, %2"
    : "=r" (ds), "=r" (fs), "=r" (gs) : : "memory");

    printf("fs=%x gs=%x\n", fs, gs);
    for(i = 0; tests[i]; i++) {
    struct timespec start, end;
    unsigned long long delta;

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
    (*tests[i])();
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);

    delta = (end.tv_sec * 1000000000ull + end.tv_nsec) -
    (start.tv_sec * 1000000000ull + start.tv_nsec);
    delta /= COUNT;

    printf("%lluns/iteration\n", delta);
    }

    return 0;
    }

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-09-12 19:19    [W:0.024 / U:119.300 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site