On Fri, 2007-10-26 at 13:59 +0900, Tsutomu OWA wrote:
> Hello Darren Hart,
> 
> At Fri, 20 Jul 2007 15:40:58 -0700, Darren Hart wrote:
> > Please download the tarball, give the updated documentation a cursory 
> > glance 
> > and give them a go on your -rt system.  Please post your experience here as 
> > well as any questions or problems you may run into.
> 
> This patch adds powerpc version of rdtscll() macro which actually reads
> the timebase register and powerpc version of atomic_inc() to compile.
> Compile and run tested on a Celleb (a powerpc64 machine).

Thank you for the patch.  I think we should perhaps move all the rdtscl
stuff into a header file with a more generic name.. rdsystimer or
something.  Would you mind resending your patch with a:

Signed-off-by: Your Name <your_email_address>

So I can properly track the origin and credit you in the changelogs.

> 
> Comments and suggestions are welcome.
> 
> By the way, would you mind if I use and/or refer to your test
> results found at 
> http://www.kernel.org/pub/linux/kernel/people/dvhart/ols2007/ to compare with 
> the results taken on powerpc?  I'm going to present
> the test results at the ELC/E2007 (Embedded Linux Conference Europe;
> http://www.celinux.org/elc_europe07/elc_europe_index.html).

Please feel free to use the results, but do site the ols2007 publication
as the source.

--Darren Hart

> 
> thanks for your understanding!
> -- owa
> Corprate Software Engineering Center, TOSHIBA
> 
> diff -rup rt-test-0.3.org/func/async_handler/async_handler_tsc.c 
> rt-test-0.3/func/async_handler/async_handler_tsc.c
> --- rt-test-0.3.org/func/async_handler/async_handler_tsc.c    2007-07-21 
> 00:32:57.000000000 +0900
> +++ rt-test-0.3/func/async_handler/async_handler_tsc.c        2007-10-17 
> 19:55:34.000000000 +0900
> @@ -65,6 +65,16 @@ pthread_mutex_t mutex;
>               __asm__ __volatile__ ("rdtsc" : "=a" (low), "=d" (high)); \
>               val = (uint64_t)high << 32 | low;       \
>       } while(0)
> +#elif defined(__powerpc__)   /* 32bit version */
> +#define rdtscll(val)                                                 \
> +      do {                                                           \
> +             uint32_t tbhi, tblo ;                                   \
> +             __asm__ __volatile__ ("mftbu %0" : "=r" (tbhi));        \
> +             __asm__ __volatile__ ("mftbl %0" : "=r" (tblo));        \
> +             val = 1000 * ((uint64_t) tbhi << 32) | tblo;            \
> +     } while(0)
> +#else
> +#error
>  #endif
> 
>  /* return difference in microseconds */
> diff -rup rt-test-0.3.org/func/measurement/preempt_timing.c 
> rt-test-0.3/func/measurement/preempt_timing.c
> --- rt-test-0.3.org/func/measurement/preempt_timing.c 2007-07-21 
> 00:32:56.000000000 +0900
> +++ rt-test-0.3/func/measurement/preempt_timing.c     2007-10-17 
> 19:56:56.000000000 +0900
> @@ -50,6 +50,16 @@
>                __asm__ __volatile__ ("rdtsc" : "=a" (low), "=d" (high)); \
>               val = (uint64_t)high << 32 | low;       \
>       } while(0)
> +#elif defined(__powerpc__)   /* 32bit version */
> +#define rdtscll(val)                                                 \
> +      do {                                                           \
> +             uint32_t tbhi, tblo ;                                   \
> +             __asm__ __volatile__ ("mftbu %0" : "=r" (tbhi));        \
> +             __asm__ __volatile__ ("mftbl %0" : "=r" (tblo));        \
> +             val = 1000 * ((uint64_t) tbhi <<32) | tblo;             \
> +     } while(0)
> +#else
> +#error
>  #endif
> 
>  #define ITERATIONS 1000000ULL
> diff -rup rt-test-0.3.org/func/measurement/rdtsc-latency.c 
> rt-test-0.3/func/measurement/rdtsc-latency.c
> --- rt-test-0.3.org/func/measurement/rdtsc-latency.c  2007-07-21 
> 00:32:56.000000000 +0900
> +++ rt-test-0.3/func/measurement/rdtsc-latency.c      2007-10-17 
> 19:57:31.000000000 +0900
> @@ -42,6 +42,16 @@
>               __asm__ __volatile__ ("rdtsc" : "=a" (low), "=d" (high)); \
>               val = (uint64_t)high << 32 | low;       \
>       } while(0)
> +#elif defined(__powerpc__)   /* 32 bit version */
> +#define rdtscll(val)                                                 \
> +      do {                                                           \
> +             uint32_t tbhi, tblo ;                                   \
> +             __asm__ __volatile__ ("mftbu %0" : "=r" (tbhi));        \
> +             __asm__ __volatile__ ("mftbl %0" : "=r" (tblo));        \
> +             val = 1000 * ((uint64_t) tbhi <<32) | tblo;             \
> +     } while(0)
> +#else
> +#error
>  #endif
> 
>  /* return difference in nanoseconds */
> diff -rup rt-test-0.3.org/include/librt.h rt-test-0.3/include/librt.h
> --- rt-test-0.3.org/include/librt.h   2007-07-21 00:32:56.000000000 +0900
> +++ rt-test-0.3/include/librt.h       2007-10-16 18:19:08.000000000 +0900
> @@ -92,6 +92,7 @@ extern int _dbg_lvl;
>   */
>  static inline int atomic_add(int i, atomic_t *v)
>  {
> +#if defined(__x86_64__) || defined(__i386__)
>       int __i;
>       __i = i;
>       asm volatile(
> @@ -99,6 +100,26 @@ static inline int atomic_add(int i, atom
>                       :"=r"(i)
>                       :"m"(v->counter), "0"(i));
>       return i + __i;
> +
> +#elif defined(__powerpc__)
> +#define ISYNC_ON_SMP "\n\tisync\n"
> +#define LWSYNC_ON_SMP        __stringify(LWSYNC) "\n"
> +     int t;
> +     asm volatile(
> +"    lwsync \n\
> +1:   lwarx   %0,0,%2         # atomic_add_return     \n\
> +     add     %0,%1,%0\n\
> +     stwcx.  %0,0,%2 \n\
> +     bne-    1b"
> +     ISYNC_ON_SMP
> +     : "=&r" (t)
> +     : "r" (i), "r" (&v->counter)
> +     : "cc", "memory");
> +
> +     return t;
> +#else
> +#error
> +#endif
>  }
>  /* atomic_inc: atomically increment the integer passed by reference
>   */

-
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to