From: Jason Baron <jbaron@redhat.com>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Koki Sanagi <sanagi.koki@jp.fujitsu.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@elte.hu>,
Frederic Weisbecker <fweisbec@gmail.com>,
nhorman@tuxdriver.com, scott.a.mcmillan@intel.com,
laijs@cn.fujitsu.com, LKML <linux-kernel@vger.kernel.org>,
eric.dumazet@gmail.com, kaneshige.kenji@jp.fujitsu.com,
David Miller <davem@davemloft.net>,
izumi.taku@jp.fujitsu.com, kosaki.motohiro@jp.fujitsu.com,
Heiko Carstens <heiko.carstens@de.ibm.com>,
"Luck, Tony" <tony.luck@intel.com>
Subject: Re: [PATCH] tracing: Cleanup the convoluted softirq tracepoints
Date: Tue, 19 Oct 2010 20:43:34 -0400 [thread overview]
Message-ID: <20101020004334.GA2014@redhat.com> (raw)
In-Reply-To: <4CBE2C1B.6070500@zytor.com>
On Tue, Oct 19, 2010 at 04:39:07PM -0700, H. Peter Anvin wrote:
> On 10/19/2010 03:27 PM, Peter Zijlstra wrote:
> >
> > Due to not actually having a sane key type the above is not easy to
> > implement, but I tried:
> >
> > #define _SWITCH_POINT(x)\
> > ({ \
> > __label__ jl_enabled; \
> > bool ret = true; \
> > JUMP_LABEL(x, jl_enabled); \
> > ret = false; \
> > jl_enabled: \
> > ret; })
> >
> > #define SWITCH_POINT(x) unlikely(_SWITCH_POINT(x))
> >
> > #define COND_STMT(key, stmt) \
> > do { \
> > if (SWITCH_POINT(key)) { \
> > stmt; \
> > } \
> > } while (0)
> >
> >
> > and that's still generating these double jumps.
> >
>
> I just experimented with it, and the ({...}) construct doesn't work,
> because it looks like a merged flow of control to gcc.
>
> Replacing the ({ ... }) with an inline does indeed remove the double
> jumps.
>
> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> index b67cb18..2ff829d 100644
> --- a/include/linux/jump_label.h
> +++ b/include/linux/jump_label.h
> @@ -61,12 +61,22 @@ static inline int jump_label_text_reserved(void
> *start, void *end)
>
> #endif
>
> +static __always_inline __pure bool _SWITCH_POINT(void *x)
> +{
> + asm goto("# SWITCH_POINT %0\n\t"
> + ".byte 0x66,0x66,0x66,0x66,0x90\n"
> + "1:"
> + : : "i" (x) : : jl_enabled);
> + return false;
> +jl_enabled:
> + return true;
> +}
> +
> +#define SWITCH_POINT(x) unlikely(_SWITCH_POINT(x))
> +
> #define COND_STMT(key, stmt) \
> do { \
> - __label__ jl_enabled; \
> - JUMP_LABEL(key, jl_enabled); \
> - if (0) { \
> -jl_enabled: \
> + if (SWITCH_POINT(key)) { \
> stmt; \
> } \
> } while (0)
>
>
> The key here seems to be to not use the JUMP_LABEL macro as implemented;
> I have utterly failed to make JUMP_LABEL() do the right thing.
>
ok, I tried this out for the tracepoint code, but I still seem to be
getting the double jump.
patch:
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 1947a12..7bc2537 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -66,12 +66,22 @@ static inline void jump_label_unlock(void) {}
#endif
+static __always_inline __pure bool _SWITCH_POINT(void *x)
+{
+ asm goto("# SWITCH_POINT %0\n\t"
+ ".byte 0x66,0x66,0x66,0x66,0x90\n"
+ "1:"
+ : : "i" (x) : : jl_enabled);
+ return false;
+jl_enabled:
+ return true;
+}
+
+#define SWITCH_POINT(x) unlikely(_SWITCH_POINT(x))
+
#define COND_STMT(key, stmt) \
do { \
- __label__ jl_enabled; \
- JUMP_LABEL(key, jl_enabled); \
- if (0) { \
-jl_enabled: \
+ if (SWITCH_POINT(key)) { \
stmt; \
} \
} while (0)
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index a4a90b6..1f8d14f 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -146,12 +146,7 @@ static inline void tracepoint_update_probe_range(struct tracepoint *begin,
extern struct tracepoint __tracepoint_##name; \
static inline void trace_##name(proto) \
{ \
- JUMP_LABEL(&__tracepoint_##name.state, do_trace); \
- return; \
-do_trace: \
- __DO_TRACE(&__tracepoint_##name, \
- TP_PROTO(data_proto), \
- TP_ARGS(data_args)); \
+ COND_STMT(&__tracepoint_##name.state, __DO_TRACE(&__tracepoint_##name, TP_PROTO(data_proto), TP_ARGS(data_args))); \
} \
static inline int \
register_trace_##name(void (*probe)(data_proto), void *data) \
disassemly:
ffffffff810360a6 <set_task_cpu>:
ffffffff810360a6: 55 push %rbp
ffffffff810360a7: 48 89 e5 mov %rsp,%rbp
ffffffff810360aa: 41 55 push %r13
ffffffff810360ac: 41 54 push %r12
ffffffff810360ae: 41 89 f4 mov %esi,%r12d
ffffffff810360b1: 53 push %rbx
ffffffff810360b2: 48 89 fb mov %rdi,%rbx
ffffffff810360b5: 48 81 ec b8 00 00 00 sub $0xb8,%rsp
ffffffff810360bc: 66 66 66 66 90 data32 data32 data32
xchg %ax,%ax
ffffffff810360c1: eb 19 jmp ffffffff810360dc
<set_task_cpu+0x36>
ffffffff810360c3: 49 8b 7d 08 mov 0x8(%r13),%rdi
ffffffff810360c7: 44 89 e2 mov %r12d,%edx
ffffffff810360ca: 48 89 de mov %rbx,%rsi
ffffffff810360cd: 41 ff 55 00 callq *0x0(%r13)
ffffffff810360d1: 49 83 c5 10 add $0x10,%r13
ffffffff810360d5: 49 83 7d 00 00 cmpq $0x0,0x0(%r13)
ffffffff810360da: eb 6c jmp ffffffff81036148
<set_task_cpu+0xa2>
ffffffff810360dc: 48 8b 43 08 mov 0x8(%rbx),%rax
ffffffff810360e0: 44 39 60 18 cmp %r12d,0x18(%rax)
ffffffff810360e4: 74 37 je ffffffff8103611d
<set_task_cpu+0x77>
ffffffff810360e6: 48 ff 83 98 00 00 00 incq 0x98(%rbx)
ffffffff810360ed: e9 00 00 00 00 jmpq ffffffff810360f2
<set_task_cpu+0x4c>
ffffffff810360f2: eb 29 jmp ffffffff8103611d
<set_task_cpu+0x77>
ffffffff810360f4: 4c 8d ad 30 ff ff ff lea -0xd0(%rbp),%r13
ffffffff810360fb: 4c 89 ef mov %r13,%rdi
ffffffff810360fe: e8 c7 94 ff ff callq ffffffff8102f5ca
<perf_fetch_caller_regs>
ffffffff81036103: 45 31 c0 xor %r8d,%r8d
ffffffff81036106: 4c 89 e9 mov %r13,%rcx
ffffffff81036109: ba 01 00 00 00 mov $0x1,%edx
ffffffff8103610e: be 01 00 00 00 mov $0x1,%esi
ffffffff81036113: bf 04 00 00 00 mov $0x4,%edi
ffffffff81036118: e8 67 19 07 00 callq ffffffff810a7a84
<__perf_sw_event>
ffffffff8103611d: 44 89 e6 mov %r12d,%esi
ffffffff81036120: 48 89 df mov %rbx,%rdi
ffffffff81036123: e8 2f 75 ff ff callq ffffffff8102d657
<set_task_rq>
ffffffff81036128: 48 8b 43 08 mov 0x8(%rbx),%rax
ffffffff8103612c: 44 89 60 18 mov %r12d,0x18(%rax)
ffffffff81036130: 48 81 c4 b8 00 00 00 add $0xb8,%rsp
ffffffff81036137: 5b pop %rbx
ffffffff81036138: 41 5c pop %r12
ffffffff8103613a: 41 5d pop %r13
ffffffff8103613c: c9 leaveq
ffffffff8103613d: c3 retq
ffffffff8103613e: 4c 8b 2d 3b 26 a9 00 mov
0xa9263b(%rip),%r13 # ffffffff81ac8780
<__tracepoint_sched_migrate_task+0x20>
ffffffff81036145: 4d 85 ed test %r13,%r13
ffffffff81036148: 0f 85 75 ff ff ff jne ffffffff810360c3
<set_task_cpu+0x1d>
ffffffff8103614e: eb 8c jmp ffffffff810360dc
<set_task_cpu+0x36>
I'm using gcc (GCC) 4.5.1 20100812
is my patch wrong?
thanks,
-Jason
next prev parent reply other threads:[~2010-10-20 0:44 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-23 9:41 [PATCH v4 0/5] netdev: show a process of packets Koki Sanagi
2010-08-23 9:42 ` [PATCH v4 1/5] irq: add tracepoint to softirq_raise Koki Sanagi
2010-09-03 15:29 ` Frederic Weisbecker
2010-09-03 15:39 ` Steven Rostedt
2010-09-03 15:42 ` Frederic Weisbecker
2010-09-03 15:43 ` Steven Rostedt
2010-09-03 15:50 ` Frederic Weisbecker
2010-09-06 1:46 ` Koki Sanagi
2010-09-08 8:33 ` [tip:perf/core] irq: Add " tip-bot for Lai Jiangshan
2010-09-08 11:25 ` [sparc build bug] " Ingo Molnar
2010-09-08 12:26 ` [PATCH] irq: Fix circular headers dependency Frederic Weisbecker
2010-09-09 19:54 ` [tip:perf/core] " tip-bot for Frederic Weisbecker
2010-10-18 9:44 ` [sparc build bug] Re: [tip:perf/core] irq: Add tracepoint to softirq_raise Peter Zijlstra
2010-10-18 10:11 ` Peter Zijlstra
2010-10-18 10:26 ` Heiko Carstens
2010-10-18 10:48 ` Peter Zijlstra
2010-10-19 10:58 ` Koki Sanagi
2010-10-19 11:25 ` Peter Zijlstra
2010-10-19 13:00 ` [PATCH] tracing: Cleanup the convoluted softirq tracepoints Thomas Gleixner
2010-10-19 13:08 ` Peter Zijlstra
2010-10-19 13:22 ` Mathieu Desnoyers
2010-10-19 13:41 ` Thomas Gleixner
2010-10-19 13:54 ` Steven Rostedt
2010-10-19 14:07 ` Thomas Gleixner
2010-10-19 14:28 ` Mathieu Desnoyers
2010-10-19 19:49 ` Thomas Gleixner
2010-10-19 20:55 ` Steven Rostedt
2010-10-19 21:07 ` Thomas Gleixner
2010-10-19 21:23 ` Steven Rostedt
2010-10-19 21:48 ` H. Peter Anvin
2010-10-19 22:23 ` Steven Rostedt
2010-10-19 22:26 ` H. Peter Anvin
2010-10-19 22:27 ` Peter Zijlstra
2010-10-19 23:39 ` H. Peter Anvin
2010-10-19 23:45 ` Steven Rostedt
2010-10-20 0:43 ` Jason Baron [this message]
2010-10-19 22:41 ` Mathieu Desnoyers
2010-10-19 22:49 ` H. Peter Anvin
2010-10-19 23:05 ` Steven Rostedt
2010-10-19 23:09 ` H. Peter Anvin
2010-10-20 15:27 ` Jason Baron
2010-10-20 15:41 ` Mathieu Desnoyers
2010-10-25 21:54 ` H. Peter Anvin
2010-10-25 22:01 ` Mathieu Desnoyers
2010-10-25 22:12 ` H. Peter Anvin
2010-10-25 22:19 ` H. Peter Anvin
2010-10-25 22:55 ` Mathieu Desnoyers
2010-10-26 0:39 ` Steven Rostedt
2010-10-26 1:14 ` Mathieu Desnoyers
2010-10-19 22:04 ` Thomas Gleixner
2010-10-19 22:33 ` Steven Rostedt
2010-10-21 16:18 ` Thomas Gleixner
2010-10-21 17:05 ` Steven Rostedt
2010-10-21 19:56 ` Thomas Gleixner
2010-10-25 22:31 ` H. Peter Anvin
2010-10-19 21:45 ` Thomas Gleixner
2010-10-19 22:14 ` Steven Rostedt
2010-10-19 21:16 ` David Daney
2010-10-19 21:32 ` Jason Baron
2010-10-19 21:38 ` David Daney
2010-10-19 21:47 ` Steven Rostedt
2010-10-19 21:28 ` Jason Baron
2010-10-19 21:55 ` Thomas Gleixner
2010-10-19 22:17 ` Thomas Gleixner
2010-10-20 1:36 ` Steven Rostedt
2010-10-20 1:52 ` Jason Baron
2010-10-25 22:32 ` H. Peter Anvin
2010-10-19 22:38 ` Jason Baron
2010-10-19 22:44 ` H. Peter Anvin
2010-10-19 22:56 ` Steven Rostedt
2010-10-19 22:57 ` H. Peter Anvin
2010-10-19 14:46 ` Steven Rostedt
2010-10-19 14:00 ` Mathieu Desnoyers
2010-10-21 14:52 ` [tip:perf/core] " tip-bot for Thomas Gleixner
2010-08-23 9:43 ` [PATCH v4 2/5] napi: convert trace_napi_poll to TRACE_EVENT Koki Sanagi
2010-08-24 3:52 ` David Miller
2010-09-08 8:34 ` [tip:perf/core] napi: Convert " tip-bot for Neil Horman
2010-08-23 9:45 ` [PATCH v4 3/5] netdev: add tracepoints to netdev layer Koki Sanagi
2010-08-24 3:53 ` David Miller
2010-09-08 8:34 ` [tip:perf/core] netdev: Add " tip-bot for Koki Sanagi
2010-08-23 9:46 ` [PATCH v4 4/5] skb: add tracepoints to freeing skb Koki Sanagi
2010-08-24 3:53 ` David Miller
2010-09-08 8:35 ` [tip:perf/core] skb: Add " tip-bot for Koki Sanagi
2010-08-23 9:47 ` [PATCH v4 5/5] perf:add a script shows a process of packet Koki Sanagi
2010-08-24 3:53 ` David Miller
2010-09-07 16:57 ` Frederic Weisbecker
2010-09-08 8:35 ` [tip:perf/core] perf: Add a script to show packets processing tip-bot for Koki Sanagi
2010-08-30 23:50 ` [PATCH v4 0/5] netdev: show a process of packets Steven Rostedt
2010-09-03 2:10 ` Koki Sanagi
2010-09-03 2:17 ` David Miller
2010-09-03 2:55 ` Koki Sanagi
2010-09-03 4:46 ` Frederic Weisbecker
2010-09-03 5:12 ` Koki Sanagi
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=20101020004334.GA2014@redhat.com \
--to=jbaron@redhat.com \
--cc=a.p.zijlstra@chello.nl \
--cc=davem@davemloft.net \
--cc=eric.dumazet@gmail.com \
--cc=fweisbec@gmail.com \
--cc=heiko.carstens@de.ibm.com \
--cc=hpa@zytor.com \
--cc=izumi.taku@jp.fujitsu.com \
--cc=kaneshige.kenji@jp.fujitsu.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@elte.hu \
--cc=nhorman@tuxdriver.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sanagi.koki@jp.fujitsu.com \
--cc=scott.a.mcmillan@intel.com \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox