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 --]
next 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.