• J
    jump label: Introduce static_branch() interface · d430d3d7
    Jason Baron 提交于
    Introduce:
    
    static __always_inline bool static_branch(struct jump_label_key *key);
    
    instead of the old JUMP_LABEL(key, label) macro.
    
    In this way, jump labels become really easy to use:
    
    Define:
    
            struct jump_label_key jump_key;
    
    Can be used as:
    
            if (static_branch(&jump_key))
                    do unlikely code
    
    enable/disale via:
    
            jump_label_inc(&jump_key);
            jump_label_dec(&jump_key);
    
    that's it!
    
    For the jump labels disabled case, the static_branch() becomes an
    atomic_read(), and jump_label_inc()/dec() are simply atomic_inc(),
    atomic_dec() operations. We show testing results for this change below.
    
    Thanks to H. Peter Anvin for suggesting the 'static_branch()' construct.
    
    Since we now require a 'struct jump_label_key *key', we can store a pointer into
    the jump table addresses. In this way, we can enable/disable jump labels, in
    basically constant time. This change allows us to completely remove the previous
    hashtable scheme. Thanks to Peter Zijlstra for this re-write.
    
    Testing:
    
    I ran a series of 'tbench 20' runs 5 times (with reboots) for 3
    configurations, where tracepoints were disabled.
    
    jump label configured in
    avg: 815.6
    
    jump label *not* configured in (using atomic reads)
    avg: 800.1
    
    jump label *not* configured in (regular reads)
    avg: 803.4
    Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
    LKML-Reference: <20110316212947.GA8792@redhat.com>
    Signed-off-by: NJason Baron <jbaron@redhat.com>
    Suggested-by: NH. Peter Anvin <hpa@linux.intel.com>
    Tested-by: NDavid Daney <ddaney@caviumnetworks.com>
    Acked-by: NRalf Baechle <ralf@linux-mips.org>
    Acked-by: NDavid S. Miller <davem@davemloft.net>
    Acked-by: NMathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
    d430d3d7
vmlinux.lds.h 23.6 KB