]> Pileus Git - ~andy/linux/commitdiff
x86: conditionalize stack canary handling in hot path
authorTejun Heo <tj@kernel.org>
Tue, 20 Jan 2009 03:29:19 +0000 (12:29 +0900)
committerTejun Heo <tj@kernel.org>
Tue, 20 Jan 2009 03:29:19 +0000 (12:29 +0900)
Impact: no unnecessary stack canary swapping during context switch

There's no point in moving stack_canary around during context switch
if it's not enabled.  Conditionalize it.

Signed-off-by: Tejun Heo <tj@kernel.org>
arch/x86/include/asm/system.h

index 8cadfe9b1194ebfe78a4fb4bf2bce6c0e3a8dbba..b77bd8bd3cc28438358e7d22486ea55f22695133 100644 (file)
@@ -86,17 +86,28 @@ do {                                                                        \
        , "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \
          "r12", "r13", "r14", "r15"
 
+#ifdef CONFIG_CC_STACKPROTECTOR
+#define __switch_canary                                                          \
+       "movq %P[task_canary](%%rsi),%%r8\n\t"                            \
+       "movq %%r8,%%gs:%P[pda_canary]\n\t"
+#define __switch_canary_param                                            \
+       , [task_canary] "i" (offsetof(struct task_struct, stack_canary))  \
+       , [pda_canary] "i" (offsetof(struct x8664_pda, stack_canary))
+#else  /* CC_STACKPROTECTOR */
+#define __switch_canary
+#define __switch_canary_param
+#endif /* CC_STACKPROTECTOR */
+
 /* Save restore flags to clear handle leaking NT */
 #define switch_to(prev, next, last) \
-       asm volatile(SAVE_CONTEXT                                                   \
+       asm volatile(SAVE_CONTEXT                                         \
             "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */       \
             "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */    \
             "call __switch_to\n\t"                                       \
             ".globl thread_return\n"                                     \
             "thread_return:\n\t"                                         \
             "movq "__percpu_arg([current_task])",%%rsi\n\t"              \
-            "movq %P[task_canary](%%rsi),%%r8\n\t"                       \
-            "movq %%r8,%%gs:%P[pda_canary]\n\t"                          \
+            __switch_canary                                              \
             "movq %P[thread_info](%%rsi),%%r8\n\t"                       \
             LOCK_PREFIX "btr  %[tif_fork],%P[ti_flags](%%r8)\n\t"        \
             "movq %%rax,%%rdi\n\t"                                       \
@@ -108,9 +119,8 @@ do {                                                                        \
               [ti_flags] "i" (offsetof(struct thread_info, flags)),      \
               [tif_fork] "i" (TIF_FORK),                                 \
               [thread_info] "i" (offsetof(struct task_struct, stack)),   \
-              [task_canary] "i" (offsetof(struct task_struct, stack_canary)),\
-              [current_task] "m" (per_cpu_var(current_task)),            \
-              [pda_canary] "i" (offsetof(struct x8664_pda, stack_canary))\
+              [current_task] "m" (per_cpu_var(current_task))             \
+              __switch_canary_param                                      \
             : "memory", "cc" __EXTRA_CLOBBER)
 #endif