[PATCH]new_TSC_based_delay_tsc() - Kernel

This is a discussion on [PATCH]new_TSC_based_delay_tsc() - Kernel ; Hi all, This is a patch based on the Ingo's idea/patch to track delay_tsc() migration to another cpu by comparing smp_processor_id(). It is against kernel-2.6.24-rc3. What is different: 1. Using unsigned (instead of long) to unify for i386/x86_64. 2. Minimal ...

+ Reply to Thread
Results 1 to 2 of 2

Thread: [PATCH]new_TSC_based_delay_tsc()

  1. [PATCH]new_TSC_based_delay_tsc()

    Hi all,

    This is a patch based on the Ingo's idea/patch to track
    delay_tsc() migration to another cpu by comparing
    smp_processor_id(). It is against kernel-2.6.24-rc3.

    What is different:
    1. Using unsigned (instead of long) to unify for i386/x86_64.
    2. Minimal preempt_disable/enable() critical sections
    (more room for preemption)
    3. some statements have been rearranged, to account for
    possible under/overflow of left/TSC

    Tested on both: 32/64 bit SMP PREEMPT kernel-2.6.24-rc3

    Hope it is correct. Comments, please.

    Signed-off-by: Marin Mitov
    =========================================
    --- a/arch/x86/lib/delay_32.c 2007-11-18 10:20:45.000000000 +0200
    +++ b/arch/x86/lib/delay_32.c 2007-11-18 10:20:44.000000000 +0200
    @@ -38,18 +38,41 @@
    :"0" (loops));
    }

    -/* TSC based delay: */
    +/* TSC based delay:
    + *
    + * We are careful about preemption as TSC's are per-CPU.
    + */
    static void delay_tsc(unsigned long loops)
    {
    - unsigned long bclock, now;
    + unsigned prev, now;
    + unsigned left = loops;
    + unsigned prev_cpu, cpu;
    +
    + preempt_disable();
    + rdtscl(prev);
    + prev_cpu = smp_processor_id();
    + preempt_enable();
    + now = prev;

    - preempt_disable(); /* TSC's are per-cpu */
    - rdtscl(bclock);
    do {
    rep_nop();
    +
    + left -= now - prev;
    + prev = now;
    +
    + preempt_disable();
    rdtscl(now);
    - } while ((now-bclock) < loops);
    - preempt_enable();
    + cpu = smp_processor_id();
    + preempt_enable();
    +
    + if (prev_cpu != cpu){
    + /*
    + * We have migrated, we skip this small amount of time:
    + */
    + prev = now;
    + prev_cpu = cpu;
    + }
    + } while ((now-prev) < left);
    }

    /*
    --- a/arch/x86/lib/delay_64.c 2007-11-18 10:20:44.000000000 +0200
    +++ b/arch/x86/lib/delay_64.c 2007-11-18 10:20:44.000000000 +0200
    @@ -26,18 +26,42 @@
    return 0;
    }

    +/* TSC based delay:
    + *
    + * We are careful about preemption as TSC's are per-CPU.
    + */
    void __delay(unsigned long loops)
    {
    - unsigned bclock, now;
    + unsigned prev, now;
    + unsigned left = loops;
    + unsigned prev_cpu, cpu;
    +
    + preempt_disable();
    + rdtscl(prev);
    + prev_cpu = smp_processor_id();
    + preempt_enable();
    + now = prev;

    - preempt_disable(); /* TSC's are pre-cpu */
    - rdtscl(bclock);
    do {
    - rep_nop();
    + rep_nop();
    +
    + left -= now - prev;
    + prev = now;
    +
    + preempt_disable();
    rdtscl(now);
    + cpu = smp_processor_id();
    + preempt_enable();
    +
    + if (prev_cpu != cpu){
    + /*
    + * We have migrated, we skip this small amount of time:
    + */
    + prev = now;
    + prev_cpu = cpu;
    + }
    }
    - while ((now-bclock) < loops);
    - preempt_enable();
    + while ((now-prev) < left);
    }
    EXPORT_SYMBOL(__delay);



    -
    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/

  2. Re: [PATCH] new TSC based delay_tsc()


    * Marin Mitov wrote:

    > Hi all,
    >
    > This is a patch based on the Ingo's idea/patch to track delay_tsc()
    > migration to another cpu by comparing smp_processor_id(). It is
    > against kernel-2.6.24-rc3.
    >
    > What is different:
    > 1. Using unsigned (instead of long) to unify for i386/x86_64.
    > 2. Minimal preempt_disable/enable() critical sections
    > (more room for preemption)
    > 3. some statements have been rearranged, to account for
    > possible under/overflow of left/TSC
    >
    > Tested on both: 32/64 bit SMP PREEMPT kernel-2.6.24-rc3
    >
    > Hope it is correct. Comments, please.


    thanks! The changes look certainly good to me.

    > Signed-off-by: Marin Mitov


    Signed-off-by: Ingo Molnar

    Ingo
    -
    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/

+ Reply to Thread