sched: speed up and simplify vslice calculations
[safe/jmp/linux-2.6] / include / asm-m32r / system.h
index e55013f..2365de5 100644 (file)
@@ -10,7 +10,7 @@
  * Copyright (C) 2004, 2006  Hirokazu Takata <takata at linux-m32r.org>
  */
 
-#include <linux/config.h>
+#include <linux/compiler.h>
 #include <asm/assembler.h>
 
 #ifdef __KERNEL__
  * switch_to(prev, next) should switch from task `prev' to `next'
  * `prev' will never be the same as `next'.
  *
- * `next' and `prev' should be task_t, but it isn't always defined
+ * `next' and `prev' should be struct task_struct, but it isn't always defined
  */
 
+#if defined(CONFIG_FRAME_POINTER) || \
+       !defined(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER)
+#define M32R_PUSH_FP " push fp\n"
+#define M32R_POP_FP  " pop  fp\n"
+#else
+#define M32R_PUSH_FP ""
+#define M32R_POP_FP  ""
+#endif
+
 #define switch_to(prev, next, last)  do { \
        __asm__ __volatile__ ( \
                "       seth    lr, #high(1f)                           \n" \
                "       or3     lr, lr, #low(1f)                        \n" \
                "       st      lr, @%4  ; store old LR                 \n" \
                "       ld      lr, @%5  ; load new LR                  \n" \
+                       M32R_PUSH_FP \
                "       st      sp, @%2  ; store old SP                 \n" \
                "       ld      sp, @%3  ; load new SP                  \n" \
                "       push    %1  ; store `prev' on new stack         \n" \
@@ -35,6 +45,7 @@
                "       .fillinsn                                       \n" \
                "1:                                                     \n" \
                "       pop     %0  ; restore `__last' from new stack   \n" \
+                       M32R_POP_FP \
                : "=r" (last) \
                : "0" (prev), \
                  "r" (&(prev->thread.sp)), "r" (&(next->thread.sp)), \
        ); \
 } while(0)
 
-/*
- * On SMP systems, when the scheduler does migration-cost autodetection,
- * it needs a way to flush as much of the CPU's caches as possible.
- *
- * TODO: fill this in!
- */
-static inline void sched_cacheflush(void)
-{
-}
-
 /* Interrupt Control */
 #if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
 #define local_irq_enable() \
@@ -123,8 +124,6 @@ static inline void local_irq_disable(void)
 #define xchg(ptr,x) \
        ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
 
-#define tas(ptr)       (xchg((ptr),1))
-
 #ifdef CONFIG_SMP
 extern void  __xchg_called_with_bad_pointer(void);
 #endif
@@ -139,14 +138,14 @@ extern void  __xchg_called_with_bad_pointer(void);
        "add3   "reg0", "addr", #0x2000;                \n\t"   \
        "ld     "reg0", @"reg0";                        \n\t"   \
        "unlock "reg0", @"reg1";                        \n\t"
-       /* FIXME: This workaround code cannot handle kenrel modules
+       /* FIXME: This workaround code cannot handle kernel modules
         * correctly under SMP environment.
         */
 #else  /* CONFIG_CHIP_M32700_TS1 */
 #define DCACHE_CLEAR(reg0, reg1, addr)
 #endif /* CONFIG_CHIP_M32700_TS1 */
 
-static inline unsigned long
+static __always_inline unsigned long
 __xchg(unsigned long x, volatile void * ptr, int size)
 {
        unsigned long flags;
@@ -319,7 +318,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
  * does not enforce ordering, since there is no data dependency between
  * the read of "a" and the read of "b".  Therefore, on some CPUs, such
  * as Alpha, "y" could be set to 3 and "x" to 0.  Use rmb()
- * in cases like thiswhere there are no data dependencies.
+ * in cases like this where there are no data dependencies.
  **/
 
 #define read_barrier_depends() do { } while (0)
@@ -329,16 +328,15 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
 #define smp_rmb()      rmb()
 #define smp_wmb()      wmb()
 #define smp_read_barrier_depends()     read_barrier_depends()
+#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
 #else
 #define smp_mb()       barrier()
 #define smp_rmb()      barrier()
 #define smp_wmb()      barrier()
 #define smp_read_barrier_depends()     do { } while (0)
+#define set_mb(var, value) do { var = value; barrier(); } while (0)
 #endif
 
-#define set_mb(var, value) do { xchg(&var, value); } while (0)
-#define set_wmb(var, value) do { var = value; wmb(); } while (0)
-
 #define arch_align_stack(x) (x)
 
-#endif  /* _ASM_M32R_SYSTEM_H */
+#endif /* _ASM_M32R_SYSTEM_H */