From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752089Ab1AERcX (ORCPT ); Wed, 5 Jan 2011 12:32:23 -0500 Received: from mail3.caviumnetworks.com ([12.108.191.235]:7593 "EHLO mail3.caviumnetworks.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752032Ab1AERcW (ORCPT ); Wed, 5 Jan 2011 12:32:22 -0500 Message-ID: <4D24AB1B.2010209@caviumnetworks.com> Date: Wed, 05 Jan 2011 09:32:11 -0800 From: David Daney User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Fedora/3.0.10-1.fc12 Thunderbird/3.0.10 MIME-Version: 1.0 To: Jason Baron , Ralf Baechle CC: peterz@infradead.org, mathieu.desnoyers@polymtl.ca, hpa@zytor.com, rostedt@goodmis.org, mingo@elte.hu, tglx@linutronix.de, andi@firstfloor.org, roland@redhat.com, rth@redhat.com, masami.hiramatsu.pt@hitachi.com, fweisbec@gmail.com, avi@redhat.com, davem@davemloft.net, sam@ravnborg.org, michael@ellerman.id.au, linux-kernel@vger.kernel.org Subject: Re: [PATCH 2/2] jump label: introduce static_branch() References: <2d8c38bd7ca93e162aedb8e7acfc8bdb96d85de2.1294239591.git.jbaron@redhat.com> In-Reply-To: <2d8c38bd7ca93e162aedb8e7acfc8bdb96d85de2.1294239591.git.jbaron@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jan 2011 17:32:17.0172 (UTC) FILETIME=[7F8BA540:01CBACFE] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/05/2011 07:43 AM, Jason Baron wrote: > Introduce: > > static __always_inline bool static_branch(struct jump_label_key *key) > > to replace the old JUMP_LABEL(key, label) macro. > > The new static_branch(), simplifies the usage of jump labels. Since, > static_branch() returns a boolean, it can be used as part of an if() > construct. It also, allows us to drop the 'label' argument from the > prototype. Its probably best understood with an example, here is the part > of the patch that converts the tracepoints to use unlikely_switch(): > > --- a/include/linux/tracepoint.h > +++ b/include/linux/tracepoint.h > @@ -146,9 +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.key, do_trace); \ > - return; \ > -do_trace: \ > + if (static_branch(&__tracepoint_##name.key)) \ > __DO_TRACE(&__tracepoint_##name, \ > TP_PROTO(data_proto), \ > TP_ARGS(data_args)); \ > > > I analyzed the code produced by static_branch(), and it seems to be > at least as good as the code generated by the JUMP_LABEL(). As a reminder, > we get a single nop in the fastpath for -02. But will often times get > a 'double jmp' in the -Os case. That is, 'jmp 0', followed by a jmp around > the disabled code. We believe that future gcc tweaks to allow block > re-ordering in the -Os, will solve the -Os case in the future. > > I also saw a 1-2% tbench throughput improvement when compiling with > jump labels. > > This patch also addresses a build issue that Tetsuo Handa reported where > gcc v3.3 currently chokes on compiling 'dynamic debug': > > include/net/inet_connection_sock.h: In function `inet_csk_reset_xmit_timer': > include/net/inet_connection_sock.h:236: error: duplicate label declaration `do_printk' > include/net/inet_connection_sock.h:219: error: this is a previous declaration > include/net/inet_connection_sock.h:236: error: duplicate label declaration `out' > include/net/inet_connection_sock.h:219: error: this is a previous declaration > include/net/inet_connection_sock.h:236: error: duplicate label `do_printk' > include/net/inet_connection_sock.h:236: error: duplicate label `out' > > > Thanks to H. Peter Anvin for suggesting this improved syntax. > > Suggested-by: H. Peter Anvin > Signed-off-by: Jason Baron > Tested-by: Tetsuo Handa > --- > arch/sparc/include/asm/jump_label.h | 25 ++++++++++++++----------- > arch/x86/include/asm/jump_label.h | 22 +++++++++++++--------- > arch/x86/kernel/jump_label.c | 2 +- > include/linux/dynamic_debug.h | 18 ++++-------------- > include/linux/jump_label.h | 26 +++++++++++--------------- > include/linux/jump_label_ref.h | 18 +++++++++++------- > include/linux/perf_event.h | 26 +++++++++++++------------- > include/linux/tracepoint.h | 4 +--- > kernel/jump_label.c | 2 +- > 9 files changed, 69 insertions(+), 74 deletions(-) > [...] This patch will conflict with the MIPS jump label support that Ralf has queued up for 2.6.38. David Daney