WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] x86: optimize this_cpu()

To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] x86: optimize this_cpu()
From: "Jan Beulich" <JBeulich@xxxxxxxxxx>
Date: Tue, 13 Jul 2010 14:35:22 +0100
Delivery-date: Tue, 13 Jul 2010 06:36:13 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Besides the .text space savings of over 2.5k on x86-64 (1.5k for
x86-32) this removes a load (plus a lea on x86-64) from various
frequently executed code paths, and finally provides a reason (other
than legibility) to prefer this_cpu() over per_cpu() in all places
where smp_processor_id() isn't being called anyway.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

--- 2010-06-15.orig/xen/include/asm-x86/current.h       2010-07-13 
14:38:21.000000000 +0200
+++ 2010-06-15/xen/include/asm-x86/current.h    2010-07-13 15:12:37.000000000 
+0200
@@ -17,6 +17,10 @@ struct vcpu;
 struct cpu_info {
     struct cpu_user_regs guest_cpu_user_regs;
     unsigned int         processor_id;
+    unsigned long        per_cpu_offset;
+#ifdef __x86_64__
+    unsigned long        __pad_for_stack_bottom;
+#endif
     struct vcpu         *current_vcpu;
 };
 
@@ -35,7 +39,12 @@ static inline struct cpu_info *get_cpu_i
 #define current               (get_current())
 
 #define get_processor_id()    (get_cpu_info()->processor_id)
-#define set_processor_id(id)  (get_cpu_info()->processor_id = (id))
+#define set_processor_id(id)  do {                                      \
+    struct cpu_info *ci__ = get_cpu_info();                             \
+    ci__->per_cpu_offset = __per_cpu_offset[ci__->processor_id = (id)]; \
+} while (0)
+
+#define get_per_cpu_offset()  (get_cpu_info()->per_cpu_offset)
 
 #define guest_cpu_user_regs() (&get_cpu_info()->guest_cpu_user_regs)
 
--- 2010-06-15.orig/xen/include/asm-x86/percpu.h        2010-07-13 
14:38:21.000000000 +0200
+++ 2010-06-15/xen/include/asm-x86/percpu.h     2010-07-13 13:56:38.000000000 
+0200
@@ -16,7 +16,7 @@ void percpu_init_areas(void);
 #define per_cpu(var, cpu)  \
     (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
 #define __get_cpu_var(var) \
-    (per_cpu(var, smp_processor_id()))
+    (*RELOC_HIDE(&per_cpu__##var, get_per_cpu_offset()))
 
 #define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel