All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@domain.hid>
To: xenomai-core <xenomai@xenomai.org>
Subject: [Xenomai-core] [PATCH] optimise syscall mux-code calculation
Date: Thu, 13 Jul 2006 13:13:43 +0200	[thread overview]
Message-ID: <44B62AE7.8080503@domain.hid> (raw)


[-- 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 --]

             reply	other threads:[~2006-07-13 11:13 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-13 11:13 Jan Kiszka [this message]
2006-07-15  2:24 ` [Xenomai-core] [PATCH] optimise syscall mux-code calculation 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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=44B62AE7.8080503@domain.hid \
    --to=jan.kiszka@domain.hid \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.