All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] [PATCH] optimise syscall mux-code calculation
@ 2006-07-13 11:13 Jan Kiszka
  2006-07-15  2:24 ` Philippe Gerum
  0 siblings, 1 reply; 13+ messages in thread
From: Jan Kiszka @ 2006-07-13 11:13 UTC (permalink / raw)
  To: xenomai-core


[-- Attachment #1.1: Type: text/plain, Size: 757 bytes --]

Hi,

some may recall the "micro-optimisation" thread I once started. Here is
now a simple approach to deal with the yet suboptimal mux-code
calculation in user-space. Code saving:

Before:
   text    data     bss     dec     hex filename
  18004     476       8   18488    4838 native/.libs/libnative.so
  27445     696       4   28145    6df1 posix/.libs/libpthread_rt.so

After:
   text    data     bss     dec     hex filename
  17172     476       8   17656    44f8 native/.libs/libnative.so
  26805     696       4   27505    6b71 posix/.libs/libpthread_rt.so

Of course, this also results in a few ops less being executed on each
Xenomai syscall invocation (not many cycles, though).

Tested without problems on x86 so far.

Jan

[-- Attachment #1.2: optimise-muxcode-calculation.patch --]
[-- Type: text/plain, Size: 7257 bytes --]

---
 include/asm-arm/syscall.h      |   25 +++++++++++++------------
 include/asm-blackfin/syscall.h |    4 +++-
 include/asm-i386/syscall.h     |    3 ++-
 include/asm-ia64/syscall.h     |   23 ++++++++++++-----------
 include/asm-powerpc/syscall.h  |    3 ++-
 ksrc/nucleus/shadow.c          |    3 ++-
 6 files changed, 34 insertions(+), 27 deletions(-)

Index: xenomai/include/asm-arm/syscall.h
===================================================================
--- xenomai.orig/include/asm-arm/syscall.h
+++ xenomai/include/asm-arm/syscall.h
@@ -26,6 +26,7 @@
 #include <asm-generic/xenomai/syscall.h>
 
 #define __xn_mux_code(id,op)    ((op << 24)|((id << 16) & 0xff0000)|(__xn_sys_mux & 0xffff))
+#define __xn_mux_code_shft(shifted_id,op) ((op << 24)|shifted_id|(__xn_sys_mux & 0xffff))
 
 #define XENO_ARM_SYSCALL        0x009F0042	/* carefully chosen... */
 
@@ -131,19 +132,19 @@ static inline int __xn_interrupted_p(str
 #define __sys1(x)	__sys2(x)
 
 #define XENOMAI_DO_SYSCALL(nr, id, op, args...)			\
-  ({								                    \
-        unsigned long __res;					        \
+  ({								\
+        unsigned long __res;					\
 	register unsigned long __res_r0 __asm__ ("r0");		\
-   	ASM_INDECL_##nr;					                \
-								                        \
-	LOADARGS_##nr(__xn_mux_code(id,op), args);		    \
-	__asm__ __volatile__ (					            \
-"       swi " __sys1(XENO_ARM_SYSCALL)			        \
-		: "=r" (__res_r0)				                \
-		: ASM_INPUT_##nr				                \
-		: "memory");					                \
-   	__res = __res_r0;					                \
-   	(int) __res;						                \
+   	ASM_INDECL_##nr;					\
+								\
+	LOADARGS_##nr(__xn_mux_code_shft(id,op), args);		\
+	__asm__ __volatile__ (					\
+"       swi " __sys1(XENO_ARM_SYSCALL)				\
+		: "=r" (__res_r0)				\
+		: ASM_INPUT_##nr				\
+		: "memory");					\
+   	__res = __res_r0;					\
+   	(int) __res;						\
   })
 
 #define XENOMAI_SYSCALL0(op)                XENOMAI_DO_SYSCALL(0,0,op)
Index: xenomai/include/asm-blackfin/syscall.h
===================================================================
--- xenomai.orig/include/asm-blackfin/syscall.h
+++ xenomai/include/asm-blackfin/syscall.h
@@ -27,6 +27,7 @@
    (i.e. negative syscall number in orig_p0 meaning "non-syscall
    entry"). */
 #define __xn_mux_code(id,op)   ((id << 24)|((op << 16) & 0xff0000)|(__xn_sys_mux & 0xffff))
+#define __xn_mux_code_fast(shifted_id,op) ((op << 24)|shifted_id|(__xn_sys_mux & 0xffff))
 
 /* Local syscalls -- the braindamage thing about this arch is the
    absence of atomic ops usable from user-space; so we export what
@@ -213,7 +214,8 @@ static inline int __xn_interrupted_p(str
   __res;								\
 })
 
-#define XENOMAI_DO_SYSCALL(nr, id, op, args...)	__emit_syscall##nr(__xn_mux_code(id,op), ##args)
+#define XENOMAI_DO_SYSCALL(nr, id, op, args...) \
+    __emit_syscall##nr(__xn_mux_code_shft(id,op), ##args)
 
 #define XENOMAI_SYSCALL0(op)                XENOMAI_DO_SYSCALL(0,0,op)
 #define XENOMAI_SYSCALL1(op,a1)             XENOMAI_DO_SYSCALL(1,0,op,a1)
Index: xenomai/include/asm-i386/syscall.h
===================================================================
--- xenomai.orig/include/asm-i386/syscall.h
+++ xenomai/include/asm-i386/syscall.h
@@ -23,6 +23,7 @@
 #include <asm-generic/xenomai/syscall.h>
 
 #define __xn_mux_code(id,op)  ((op << 24)|((id << 16) & 0xff0000)|(__xn_sys_mux & 0x7fff))
+#define __xn_mux_code_shft(shifted_id,op) ((op << 24)|shifted_id|(__xn_sys_mux & 0x7fff))
 
 #ifdef __KERNEL__
 
@@ -167,7 +168,7 @@ asm (".L__X'%ebx = 1\n\t"
 
 #define XENOMAI_SKIN_MUX(nr, id, op, args...) \
   ({								      \
-    int muxcode = __xn_mux_code(id,op);                               \
+    int muxcode = __xn_mux_code_shft(id,op);			      \
     unsigned resultvar;						      \
     asm volatile (						      \
     LOADARGS_##nr						      \
Index: xenomai/include/asm-ia64/syscall.h
===================================================================
--- xenomai.orig/include/asm-ia64/syscall.h
+++ xenomai/include/asm-ia64/syscall.h
@@ -24,6 +24,7 @@
 #include <asm-generic/xenomai/syscall.h>
 
 #define __xn_mux_code(id,op)        ((op << 24)|(((id << 16) & 0xff0000UL)|(__xn_sys_mux & 0xffffUL)))
+#define __xn_mux_code_shft(shifted_id,op) ((op << 24)|shifted_id|(__xn_sys_mux & 0xffffUL))
 
 #ifdef __KERNEL__
 
@@ -151,17 +152,17 @@ static inline int __xn_interrupted_p(str
   /* Branch registers.  */						\
   "b6", "b7"
 
-#define XENOMAI_SKIN_MUX(nr, id, op, args...)                   \
-  ({                                                            \
-    register long _r15 asm ("r15") = (__xn_mux_code(id,op));    \
-    register long _retval asm ("r8");                           \
-    register long err asm ("r10");                              \
-    LOAD_ARGS_##nr (args);                                      \
-    __asm __volatile ("break %3;;\n\t"                          \
-                      : "=r" (_retval), "=r" (_r15), "=r" (err) \
-                      : "i" (__BREAK_SYSCALL), "1" (_r15)       \
-			ASM_ARGS_##nr                           \
-                      : "memory" ASM_CLOBBERS_##nr);            \
+#define XENOMAI_SKIN_MUX(nr, id, op, args...)				\
+  ({									\
+    register long _r15 asm ("r15") = (__xn_mux_code_shft(id,op));	\
+    register long _retval asm ("r8");					\
+    register long err asm ("r10");					\
+    LOAD_ARGS_##nr (args);						\
+    __asm __volatile ("break %3;;\n\t"					\
+		      : "=r" (_retval), "=r" (_r15), "=r" (err)		\
+		      : "i" (__BREAK_SYSCALL), "1" (_r15)		\
+			ASM_ARGS_##nr					\
+		      : "memory" ASM_CLOBBERS_##nr);			\
     err < 0 ? -_retval : _retval; })
 
 #define XENOMAI_SYS_MUX(nr, op, args...) XENOMAI_SKIN_MUX(nr, 0, op , ##args)
Index: xenomai/include/asm-powerpc/syscall.h
===================================================================
--- xenomai.orig/include/asm-powerpc/syscall.h
+++ xenomai/include/asm-powerpc/syscall.h
@@ -26,6 +26,7 @@
 #include <asm-generic/xenomai/syscall.h>
 
 #define __xn_mux_code(id,op)        ((op << 24)|((id << 16) & 0xff0000)|(__xn_sys_mux & 0xffff))
+#define __xn_mux_code_shft(shifted_id,op) ((op << 24)|shifted_id|(__xn_sys_mux & 0xffff))
 
 #ifdef __KERNEL__
 
@@ -132,7 +133,7 @@ static inline int __xn_interrupted_p(str
 	register unsigned long __sc_6  __asm__ ("r6");		\
 	register unsigned long __sc_7  __asm__ ("r7");		\
 								\
-	LOADARGS_##nr(__xn_mux_code(id,op), args);		\
+	LOADARGS_##nr(__xn_mux_code_shft(id,op), args);		\
 	__asm__ __volatile__					\
 		("sc           \n\t"				\
 		 "mfcr %0      "				\
Index: xenomai/ksrc/nucleus/shadow.c
===================================================================
--- xenomai.orig/ksrc/nucleus/shadow.c
+++ xenomai/ksrc/nucleus/shadow.c
@@ -1187,7 +1187,8 @@ static int xnshadow_sys_bind(struct task
 		return err;
 	}
 
-	return muxid;
+	/* return pre-shifted muxid - saves some cycles in user-space */
+	return __xn_mux_code(muxid,0);
 }
 
 static int xnshadow_sys_info(struct task_struct *curr, struct pt_regs *regs)


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2006-07-19  9:25 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-13 11:13 [Xenomai-core] [PATCH] optimise syscall mux-code calculation Jan Kiszka
2006-07-15  2:24 ` Philippe Gerum
2006-07-15  8:06   ` Jan Kiszka
2006-07-15  8:31     ` Philippe Gerum
2006-07-15  8:37       ` Jan Kiszka
2006-07-15 15:11         ` Philippe Gerum
2006-07-15 11:40     ` Jan Kiszka
2006-07-15 12:13       ` Gilles Chanteperdrix
2006-07-15 12:29         ` Jan Kiszka
2006-07-15 15:56       ` Gilles Chanteperdrix
2006-07-16  9:43         ` Jan Kiszka
2006-07-16 14:47           ` Jan Kiszka
2006-07-19  9:25             ` Philippe Gerum

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.