14 Dec, 2017

1 commit

  • [ Upstream commit 92ee46efeb505ead3ab06d3c5ce695637ed5f152 ]

    Fengguang Wu reported that running the rcuperf test during boot can cause
    the jump_label_test() to hit a WARN_ON(). The issue is that the core jump
    label code relies on kernel_text_address() to detect when it can no longer
    update branches that may be contained in __init sections. The
    kernel_text_address() in turn assumes that if the system_state variable is
    greter than or equal to SYSTEM_RUNNING then __init sections are no longer
    valid (since the assumption is that they have been freed). However, when
    rcuperf is setup to run in early boot it can call kernel_power_off() which
    sets the system_state to SYSTEM_POWER_OFF.

    Since rcuperf initialization is invoked via a module_init(), we can make
    the dependency of jump_label_test() needing to complete before rcuperf
    explicit by calling it via early_initcall().

    Reported-by: Fengguang Wu
    Signed-off-by: Jason Baron
    Acked-by: Paul E. McKenney
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/1510609727-2238-1-git-send-email-jbaron@akamai.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jason Baron
     

10 Aug, 2017

5 commits

  • As using the normal static key API under the hotplug lock is
    pretty much impossible, let's provide a variant of some of them
    that require the hotplug lock to have already been taken.

    These function are only meant to be used in CPU hotplug callbacks.

    Signed-off-by: Marc Zyngier
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Leo Yan
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-arm-kernel@lists.infradead.org
    Link: http://lkml.kernel.org/r/20170801080257.5056-4-marc.zyngier@arm.com
    Signed-off-by: Ingo Molnar

    Marc Zyngier
     
  • In order to later introduce an "already locked" version of some
    of the static key funcions, let's split the code into the core stuff
    (the *_cpuslocked functions) and the usual helpers, which now
    take/release the hotplug lock and call into the _cpuslocked
    versions.

    Signed-off-by: Marc Zyngier
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Leo Yan
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-arm-kernel@lists.infradead.org
    Link: http://lkml.kernel.org/r/20170801080257.5056-3-marc.zyngier@arm.com
    Signed-off-by: Ingo Molnar

    Marc Zyngier
     
  • As we're about to rework the locking, let's move the taking and
    release of the CPU hotplug lock to locations that will make its
    reworking completely obvious.

    Signed-off-by: Marc Zyngier
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Leo Yan
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-arm-kernel@lists.infradead.org
    Link: http://lkml.kernel.org/r/20170801080257.5056-2-marc.zyngier@arm.com
    Signed-off-by: Ingo Molnar

    Marc Zyngier
     
  • In the unlikely case text modification does not fully order things,
    add some extra ordering of our own to ensure we only enabled the fast
    path after all text is visible.

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Jason Baron
    Cc: Linus Torvalds
    Cc: Paolo Bonzini
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • static_key_enable/disable are trying to cap the static key count to
    0/1. However, their use of key->enabled is outside jump_label_lock
    so they do not really ensure that.

    Rewrite them to do a quick check for an already enabled (respectively,
    already disabled), and then recheck under the jump label lock. Unlike
    static_key_slow_inc/dec, a failed check under the jump label lock does
    not modify key->enabled.

    Signed-off-by: Paolo Bonzini
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Eric Dumazet
    Cc: Jason Baron
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/1501601046-35683-2-git-send-email-pbonzini@redhat.com
    Signed-off-by: Ingo Molnar

    Paolo Bonzini
     

26 May, 2017

1 commit

  • The conversion of the hotplug locking to a percpu rwsem unearthed lock
    ordering issues all over the place.

    The jump_label code has two issues:

    1) Nested get_online_cpus() invocations

    2) Ordering problems vs. the cpus rwsem and the jump_label_mutex

    To cure these, the following lock order has been established;

    cpus_rwsem -> jump_label_lock -> text_mutex

    Even if not all architectures need protection against CPU hotplug, taking
    cpus_rwsem before jump_label_lock is now mandatory in code pathes which
    actually modify code and therefor need text_mutex protection.

    Move the get_online_cpus() invocations into the core jump label code and
    establish the proper lock order where required.

    Signed-off-by: Thomas Gleixner
    Acked-by: Ingo Molnar
    Acked-by: "David S. Miller"
    Cc: Paul E. McKenney
    Cc: Chris Metcalf
    Cc: Peter Zijlstra
    Cc: Sebastian Siewior
    Cc: Steven Rostedt
    Cc: Jason Baron
    Cc: Ralf Baechle
    Link: http://lkml.kernel.org/r/20170524081549.025830817@linutronix.de

    Thomas Gleixner
     

28 Feb, 2017

1 commit

  • Pull tracing updates from Steven Rostedt:
    "This release has no new tracing features, just clean ups, minor fixes
    and small optimizations"

    * tag 'trace-v4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (25 commits)
    tracing: Remove outdated ring buffer comment
    tracing/probes: Fix a warning message to show correct maximum length
    tracing: Fix return value check in trace_benchmark_reg()
    tracing: Use modern function declaration
    jump_label: Reduce the size of struct static_key
    tracing/probe: Show subsystem name in messages
    tracing/hwlat: Update old comment about migration
    timers: Make flags output in the timer_start tracepoint useful
    tracing: Have traceprobe_probes_write() not access userspace unnecessarily
    tracing: Have COMM event filter key be treated as a string
    ftrace: Have set_graph_function handle multiple functions in one write
    ftrace: Do not hold references of ftrace_graph_{notrace_}hash out of graph_lock
    tracing: Reset parser->buffer to allow multiple "puts"
    ftrace: Have set_graph_functions handle write with RDWR
    ftrace: Reset fgd->hash in ftrace_graph_write()
    ftrace: Replace (void *)1 with a meaningful macro name FTRACE_GRAPH_EMPTY
    ftrace: Create a slight optimization on searching the ftrace_hash
    tracing: Add ftrace_hash_key() helper function
    ftrace: Convert graph filter to use hash tables
    ftrace: Expose ftrace_hash_empty and ftrace_lookup_ip
    ...

    Linus Torvalds
     

15 Feb, 2017

1 commit

  • The static_key->next field goes mostly unused. The field is used for
    associating module uses with a static key. Most uses of struct static_key
    define a static key in the core kernel and make use of it entirely within
    the core kernel, or define the static key in a module and make use of it
    only from within that module. In fact, of the ~3,000 static keys defined,
    I found only about 5 or so that did not fit this pattern.

    Thus, we can remove the static_key->next field entirely and overload
    the static_key->entries field. That is, when all the static_key uses
    are contained within the same module, static_key->entries continues
    to point to those uses. However, if the static_key uses are not contained
    within the module where the static_key is defined, then we allocate a
    struct static_key_mod, store a pointer to the uses within that
    struct static_key_mod, and have the static key point at the static_key_mod.
    This does incur some extra memory usage when a static_key is used in a
    module that does not define it, but since there are only a handful of such
    cases there is a net savings.

    In order to identify if the static_key->entries pointer contains a
    struct static_key_mod or a struct jump_entry pointer, bit 1 of
    static_key->entries is set to 1 if it points to a struct static_key_mod and
    is 0 if it points to a struct jump_entry. We were already using bit 0 in a
    similar way to store the initial value of the static_key. This does mean
    that allocations of struct static_key_mod and that the struct jump_entry
    tables need to be at least 4-byte aligned in memory. As far as I can tell
    all arches meet this criteria.

    For my .config, the patch increased the text by 778 bytes, but reduced
    the data + bss size by 14912, for a net savings of 14,134 bytes.

    text data bss dec hex filename
    8092427 5016512 790528 13899467 d416cb vmlinux.pre
    8093205 5001600 790528 13885333 d3df95 vmlinux.post

    Link: http://lkml.kernel.org/r/1486154544-4321-1-git-send-email-jbaron@akamai.com

    Cc: Peter Zijlstra
    Cc: Ingo Molnar
    Cc: Joe Perches
    Signed-off-by: Jason Baron
    Signed-off-by: Steven Rostedt (VMware)

    Jason Baron
     

12 Jan, 2017

1 commit

  • Modules that use static_key_deferred need a way to synchronize with
    any delayed work that is still pending when the module is unloaded.
    Introduce static_key_deferred_flush() which flushes any pending
    jump label updates.

    Signed-off-by: David Matlack
    Cc: stable@vger.kernel.org
    Acked-by: Peter Zijlstra (Intel)
    Signed-off-by: Paolo Bonzini

    David Matlack
     

05 Aug, 2016

1 commit

  • Pull more powerpc updates from Michael Ellerman:
    "These were delayed for various reasons, so I let them sit in next a
    bit longer, rather than including them in my first pull request.

    Fixes:
    - Fix early access to cpu_spec relocation from Benjamin Herrenschmidt
    - Fix incorrect event codes in power9-event-list from Madhavan Srinivasan
    - Move register_process_table() out of ppc_md from Michael Ellerman

    Use jump_label use for [cpu|mmu]_has_feature():
    - Add mmu_early_init_devtree() from Michael Ellerman
    - Move disable_radix handling into mmu_early_init_devtree() from Michael Ellerman
    - Do hash device tree scanning earlier from Michael Ellerman
    - Do radix device tree scanning earlier from Michael Ellerman
    - Do feature patching before MMU init from Michael Ellerman
    - Check features don't change after patching from Michael Ellerman
    - Make MMU_FTR_RADIX a MMU family feature from Aneesh Kumar K.V
    - Convert mmu_has_feature() to returning bool from Michael Ellerman
    - Convert cpu_has_feature() to returning bool from Michael Ellerman
    - Define radix_enabled() in one place & use static inline from Michael Ellerman
    - Add early_[cpu|mmu]_has_feature() from Michael Ellerman
    - Convert early cpu/mmu feature check to use the new helpers from Aneesh Kumar K.V
    - jump_label: Make it possible for arches to invoke jump_label_init() earlier from Kevin Hao
    - Call jump_label_init() in apply_feature_fixups() from Aneesh Kumar K.V
    - Remove mfvtb() from Kevin Hao
    - Move cpu_has_feature() to a separate file from Kevin Hao
    - Add kconfig option to use jump labels for cpu/mmu_has_feature() from Michael Ellerman
    - Add option to use jump label for cpu_has_feature() from Kevin Hao
    - Add option to use jump label for mmu_has_feature() from Kevin Hao
    - Catch usage of cpu/mmu_has_feature() before jump label init from Aneesh Kumar K.V
    - Annotate jump label assembly from Michael Ellerman

    TLB flush enhancements from Aneesh Kumar K.V:
    - radix: Implement tlb mmu gather flush efficiently
    - Add helper for finding SLBE LLP encoding
    - Use hugetlb flush functions
    - Drop multiple definition of mm_is_core_local
    - radix: Add tlb flush of THP ptes
    - radix: Rename function and drop unused arg
    - radix/hugetlb: Add helper for finding page size
    - hugetlb: Add flush_hugetlb_tlb_range
    - remove flush_tlb_page_nohash

    Add new ptrace regsets from Anshuman Khandual and Simon Guo:
    - elf: Add powerpc specific core note sections
    - Add the function flush_tmregs_to_thread
    - Enable in transaction NT_PRFPREG ptrace requests
    - Enable in transaction NT_PPC_VMX ptrace requests
    - Enable in transaction NT_PPC_VSX ptrace requests
    - Adapt gpr32_get, gpr32_set functions for transaction
    - Enable support for NT_PPC_CGPR
    - Enable support for NT_PPC_CFPR
    - Enable support for NT_PPC_CVMX
    - Enable support for NT_PPC_CVSX
    - Enable support for TM SPR state
    - Enable NT_PPC_TM_CTAR, NT_PPC_TM_CPPR, NT_PPC_TM_CDSCR
    - Enable support for NT_PPPC_TAR, NT_PPC_PPR, NT_PPC_DSCR
    - Enable support for EBB registers
    - Enable support for Performance Monitor registers"

    * tag 'powerpc-4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (48 commits)
    powerpc/mm: Move register_process_table() out of ppc_md
    powerpc/perf: Fix incorrect event codes in power9-event-list
    powerpc/32: Fix early access to cpu_spec relocation
    powerpc/ptrace: Enable support for Performance Monitor registers
    powerpc/ptrace: Enable support for EBB registers
    powerpc/ptrace: Enable support for NT_PPPC_TAR, NT_PPC_PPR, NT_PPC_DSCR
    powerpc/ptrace: Enable NT_PPC_TM_CTAR, NT_PPC_TM_CPPR, NT_PPC_TM_CDSCR
    powerpc/ptrace: Enable support for TM SPR state
    powerpc/ptrace: Enable support for NT_PPC_CVSX
    powerpc/ptrace: Enable support for NT_PPC_CVMX
    powerpc/ptrace: Enable support for NT_PPC_CFPR
    powerpc/ptrace: Enable support for NT_PPC_CGPR
    powerpc/ptrace: Adapt gpr32_get, gpr32_set functions for transaction
    powerpc/ptrace: Enable in transaction NT_PPC_VSX ptrace requests
    powerpc/ptrace: Enable in transaction NT_PPC_VMX ptrace requests
    powerpc/ptrace: Enable in transaction NT_PRFPREG ptrace requests
    powerpc/process: Add the function flush_tmregs_to_thread
    elf: Add powerpc specific core note sections
    powerpc/mm: remove flush_tlb_page_nohash
    powerpc/mm/hugetlb: Add flush_hugetlb_tlb_range
    ...

    Linus Torvalds
     

04 Aug, 2016

3 commits

  • Pull module updates from Rusty Russell:
    "The only interesting thing here is Jessica's patch to add
    ro_after_init support to modules. The rest are all trivia"

    * tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
    extable.h: add stddef.h so "NULL" definition is not implicit
    modules: add ro_after_init support
    jump_label: disable preemption around __module_text_address().
    exceptions: fork exception table content from module.h into extable.h
    modules: Add kernel parameter to blacklist modules
    module: Do a WARN_ON_ONCE() for assert module mutex not held
    Documentation/module-signing.txt: Note need for version info if reusing a key
    module: Invalidate signatures on force-loaded modules
    module: Issue warnings when tainting kernel
    module: fix redundant test.
    module: fix noreturn attribute for __module_put_and_exit()

    Linus Torvalds
     
  • The current jump_label.h includes bug.h for things such as WARN_ON().
    This makes the header problematic for inclusion by kernel.h or any
    headers that kernel.h includes, since bug.h includes kernel.h (circular
    dependency). The inclusion of atomic.h is similarly problematic. Thus,
    this should make jump_label.h 'includable' from most places.

    Link: http://lkml.kernel.org/r/7060ce35ddd0d20b33bf170685e6b0fab816bdf2.1467837322.git.jbaron@akamai.com
    Signed-off-by: Jason Baron
    Cc: "David S. Miller"
    Cc: Arnd Bergmann
    Cc: Benjamin Herrenschmidt
    Cc: Chris Metcalf
    Cc: Heiko Carstens
    Cc: Joe Perches
    Cc: Martin Schwidefsky
    Cc: Michael Ellerman
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jason Baron
     
  • Steven reported a warning caused by not holding module_mutex or
    rcu_read_lock_sched: his backtrace was corrupted but a quick audit
    found this possible cause. It's wrong anyway...

    Reported-by: Steven Rostedt
    Signed-off-by: Rusty Russell

    Rusty Russell
     

01 Aug, 2016

1 commit


26 Jul, 2016

1 commit

  • Pull locking updates from Ingo Molnar:
    "The locking tree was busier in this cycle than the usual pattern - a
    couple of major projects happened to coincide.

    The main changes are:

    - implement the atomic_fetch_{add,sub,and,or,xor}() API natively
    across all SMP architectures (Peter Zijlstra)

    - add atomic_fetch_{inc/dec}() as well, using the generic primitives
    (Davidlohr Bueso)

    - optimize various aspects of rwsems (Jason Low, Davidlohr Bueso,
    Waiman Long)

    - optimize smp_cond_load_acquire() on arm64 and implement LSE based
    atomic{,64}_fetch_{add,sub,and,andnot,or,xor}{,_relaxed,_acquire,_release}()
    on arm64 (Will Deacon)

    - introduce smp_acquire__after_ctrl_dep() and fix various barrier
    mis-uses and bugs (Peter Zijlstra)

    - after discovering ancient spin_unlock_wait() barrier bugs in its
    implementation and usage, strengthen its semantics and update/fix
    usage sites (Peter Zijlstra)

    - optimize mutex_trylock() fastpath (Peter Zijlstra)

    - ... misc fixes and cleanups"

    * 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (67 commits)
    locking/atomic: Introduce inc/dec variants for the atomic_fetch_$op() API
    locking/barriers, arch/arm64: Implement LDXR+WFE based smp_cond_load_acquire()
    locking/static_keys: Fix non static symbol Sparse warning
    locking/qspinlock: Use __this_cpu_dec() instead of full-blown this_cpu_dec()
    locking/atomic, arch/tile: Fix tilepro build
    locking/atomic, arch/m68k: Remove comment
    locking/atomic, arch/arc: Fix build
    locking/Documentation: Clarify limited control-dependency scope
    locking/atomic, arch/rwsem: Employ atomic_long_fetch_add()
    locking/atomic, arch/qrwlock: Employ atomic_fetch_add_acquire()
    locking/atomic, arch/mips: Convert to _relaxed atomics
    locking/atomic, arch/alpha: Convert to _relaxed atomics
    locking/atomic: Remove the deprecated atomic_{set,clear}_mask() functions
    locking/atomic: Remove linux/atomic.h:atomic_fetch_or()
    locking/atomic: Implement atomic{,64,_long}_fetch_{add,sub,and,andnot,or,xor}{,_relaxed,_acquire,_release}()
    locking/atomic: Fix atomic64_relaxed() bits
    locking/atomic, arch/xtensa: Implement atomic_fetch_{add,sub,and,or,xor}()
    locking/atomic, arch/x86: Implement atomic{,64}_fetch_{add,sub,and,or,xor}()
    locking/atomic, arch/tile: Implement atomic{,64}_fetch_{add,sub,and,or,xor}()
    locking/atomic, arch/sparc: Implement atomic{,64}_fetch_{add,sub,and,or,xor}()
    ...

    Linus Torvalds
     

07 Jul, 2016

1 commit

  • Fix the following sparse warnings:

    kernel/jump_label.c:473:23: warning:
    symbol 'jump_label_module_nb' was not declared. Should it be static?

    Signed-off-by: Wei Yongjun
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/1466183980-8903-1-git-send-email-weiyj_lk@163.com
    Signed-off-by: Ingo Molnar

    Wei Yongjun
     

24 Jun, 2016

1 commit

  • The following scenario is possible:

    CPU 1 CPU 2
    static_key_slow_inc()
    atomic_inc_not_zero()
    -> key.enabled == 0, no increment
    jump_label_lock()
    atomic_inc_return()
    -> key.enabled == 1 now
    static_key_slow_inc()
    atomic_inc_not_zero()
    -> key.enabled == 1, inc to 2
    return
    ** static key is wrong!
    jump_label_update()
    jump_label_unlock()

    Testing the static key at the point marked by (**) will follow the
    wrong path for jumps that have not been patched yet. This can
    actually happen when creating many KVM virtual machines with userspace
    LAPIC emulation; just run several copies of the following program:

    #include
    #include
    #include
    #include

    int main(void)
    {
    for (;;) {
    int kvmfd = open("/dev/kvm", O_RDONLY);
    int vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);
    close(ioctl(vmfd, KVM_CREATE_VCPU, 1));
    close(vmfd);
    close(kvmfd);
    }
    return 0;
    }

    Every KVM_CREATE_VCPU ioctl will attempt a static_key_slow_inc() call.
    The static key's purpose is to skip NULL pointer checks and indeed one
    of the processes eventually dereferences NULL.

    As explained in the commit that introduced the bug:

    706249c222f6 ("locking/static_keys: Rework update logic")

    jump_label_update() needs key.enabled to be true. The solution adopted
    here is to temporarily make key.enabled == -1, and use go down the
    slow path when key.enabled
    Signed-off-by: Paolo Bonzini
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: # v4.3+
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: 706249c222f6 ("locking/static_keys: Rework update logic")
    Link: http://lkml.kernel.org/r/1466527937-69798-1-git-send-email-pbonzini@redhat.com
    [ Small stylistic edits to the changelog and the code. ]
    Signed-off-by: Ingo Molnar

    Paolo Bonzini
     

23 Nov, 2015

1 commit

  • There were still a number of references to my old Red Hat email
    address in the kernel source. Remove these while keeping the
    Red Hat copyright notices intact.

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Arnaldo Carvalho de Melo
    Cc: Jiri Olsa
    Cc: Linus Torvalds
    Cc: Mike Galbraith
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Cc: Thomas Gleixner
    Cc: Vince Weaver
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     

03 Aug, 2015

6 commits

  • Add a little selftest that validates all combinations.

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • There are various problems and short-comings with the current
    static_key interface:

    - static_key_{true,false}() read like a branch depending on the key
    value, instead of the actual likely/unlikely branch depending on
    init value.

    - static_key_{true,false}() are, as stated above, tied to the
    static_key init values STATIC_KEY_INIT_{TRUE,FALSE}.

    - we're limited to the 2 (out of 4) possible options that compile to
    a default NOP because that's what our arch_static_branch() assembly
    emits.

    So provide a new static_key interface:

    DEFINE_STATIC_KEY_TRUE(name);
    DEFINE_STATIC_KEY_FALSE(name);

    Which define a key of different types with an initial true/false
    value.

    Then allow:

    static_branch_likely()
    static_branch_unlikely()

    to take a key of either type and emit the right instruction for the
    case.

    This means adding a second arch_static_branch_jump() assembly helper
    which emits a JMP per default.

    In order to determine the right instruction for the right state,
    encode the branch type in the LSB of jump_entry::key.

    This is the final step in removing the naming confusion that has led to
    a stream of avoidable bugs such as:

    a833581e372a ("x86, perf: Fix static_key bug in load_mm_cr4()")

    ... but it also allows new static key combinations that will give us
    performance enhancements in the subsequent patches.

    Tested-by: Rabin Vincent # arm
    Signed-off-by: Peter Zijlstra (Intel)
    Acked-by: Michael Ellerman # ppc
    Acked-by: Heiko Carstens # s390
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • Instead of spreading the branch_default logic all over the place,
    concentrate it into the one jump_label_type() function.

    This does mean we need to actually increment/decrement the enabled
    count _before_ calling the update path, otherwise jump_label_type()
    will not see the right state.

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • Avoid some casting with a helper, also prepares the way for
    overloading the LSB of jump_entry::key.

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • … the static_key* pattern

    Rename the JUMP_LABEL_TYPE_* macros to be JUMP_TYPE_* and move the
    inline helpers into kernel/jump_label.c, since that's the only place
    they're ever used.

    Also rename the helpers where it's all about static keys.

    This is the second step in removing the naming confusion that has led to
    a stream of avoidable bugs such as:

    a833581e372a ("x86, perf: Fix static_key bug in load_mm_cr4()")

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Ingo Molnar <mingo@kernel.org>

    Peter Zijlstra
     
  • Since we've already stepped away from ENABLE is a JMP and DISABLE is a
    NOP with the branch_default bits, and are going to make it even worse,
    rename it to make it all clearer.

    This way we don't mix multiple levels of logic attributes, but have a
    plain 'physical' name for what the current instruction patching status
    of a jump label is.

    This is a first step in removing the naming confusion that has led to
    a stream of avoidable bugs such as:

    a833581e372a ("x86, perf: Fix static_key bug in load_mm_cr4()")

    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: linux-kernel@vger.kernel.org
    [ Beefed up the changelog. ]
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     

27 May, 2015

1 commit

  • As per the module core lockdep annotations in the coming patch:

    [ 18.034047] ---[ end trace 9294429076a9c673 ]---
    [ 18.047760] Hardware name: Intel Corporation S2600GZ/S2600GZ, BIOS SE5C600.86B.02.02.0002.122320131210 12/23/2013
    [ 18.059228] ffffffff817d8676 ffff880036683c38 ffffffff8157e98b 0000000000000001
    [ 18.067541] 0000000000000000 ffff880036683c78 ffffffff8105fbc7 ffff880036683c68
    [ 18.075851] ffffffffa0046b08 0000000000000000 ffffffffa0046d00 ffffffffa0046cc8
    [ 18.084173] Call Trace:
    [ 18.086906] [] dump_stack+0x4f/0x7b
    [ 18.092649] [] warn_slowpath_common+0x97/0xe0
    [ 18.099361] [] warn_slowpath_null+0x1a/0x20
    [ 18.105880] [] __module_address+0x1d2/0x1e0
    [ 18.112400] [] jump_label_module_notify+0x143/0x1e0
    [ 18.119710] [] notifier_call_chain+0x4f/0x70
    [ 18.126326] [] __blocking_notifier_call_chain+0x5e/0x90
    [ 18.134009] [] blocking_notifier_call_chain+0x16/0x20
    [ 18.141490] [] load_module+0x1b50/0x2660
    [ 18.147720] [] SyS_init_module+0xce/0x100
    [ 18.154045] [] system_call_fastpath+0x12/0x17
    [ 18.160748] ---[ end trace 9294429076a9c674 ]---

    Jump labels is not doing it right; fix this.

    Cc: Rusty Russell
    Cc: Jason Baron
    Acked-by: Paul E. McKenney
    Signed-off-by: Peter Zijlstra (Intel)
    Signed-off-by: Rusty Russell

    Peter Zijlstra
     

20 Oct, 2013

1 commit

  • Usage of the static key primitives to toggle a branch must not be used
    before jump_label_init() is called from init/main.c. jump_label_init
    reorganizes and wires up the jump_entries so usage before that could
    have unforeseen consequences.

    Following primitives are now checked for correct use:
    * static_key_slow_inc
    * static_key_slow_dec
    * static_key_slow_dec_deferred
    * jump_label_rate_limit

    The x86 architecture already checks this by testing if the default_nop
    was already replaced with an optimal nop or with a branch instruction. It
    will panic then. Other architectures don't check for this.

    Because we need to relax this check for the x86 arch to allow code to
    transition from default_nop to the enabled state and other architectures
    did not check for this at all this patch introduces checking on the
    static_key primitives in a non-arch dependent manner.

    All checked functions are considered slow-path so the additional check
    does no harm to performance.

    The warnings are best observed with earlyprintk.

    Based on a patch from Andi Kleen.

    Cc: Steven Rostedt
    Cc: Peter Zijlstra
    Cc: Andi Kleen
    Signed-off-by: Hannes Frederic Sowa
    Signed-off-by: David S. Miller

    Hannes Frederic Sowa
     

09 Aug, 2013

1 commit

  • Commit b202952075f62603bea9bfb6ebc6b0420db11949 ("perf, core: Rate limit
    perf_sched_events jump_label patching") introduced rate limiting
    for jump label disabling. The changes were made in the jump label code
    in order to be more widely available and to keep things tidier. This is
    all fine, except now jump_label.h includes linux/workqueue.h, which
    makes it impossible to include jump_label.h from anything that
    workqueue.h needs. For example, it's now impossible to include
    jump_label.h from asm/spinlock.h, which is done in proposed
    pv-ticketlock patches. This patch splits out the rate limiting related
    changes from jump_label.h into a new file, jump_label_ratelimit.h, to
    resolve the issue.

    Signed-off-by: Andrew Jones
    Link: http://lkml.kernel.org/r/1376058122-8248-10-git-send-email-raghavendra.kt@linux.vnet.ibm.com
    Reviewed-by: Konrad Rzeszutek Wilk
    Signed-off-by: Raghavendra K T
    Acked-by: Ingo Molnar
    Signed-off-by: H. Peter Anvin

    Andrew Jones
     

07 Aug, 2012

1 commit


29 Feb, 2012

1 commit

  • In the jump label enabled case, calling static_key_enabled()
    results in a function call. The function returns the results of
    a compare, so it really doesn't need the overhead of a full
    function call. Let's make it 'static inline' for both the jump
    label enabled and disabled cases.

    Signed-off-by: Jason Baron
    Cc: a.p.zijlstra@chello.nl
    Cc: rostedt@goodmis.org
    Cc: mathieu.desnoyers@polymtl.ca
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Link: http://lkml.kernel.org/r/201202281849.q1SIn1p2023270@int-mx10.intmail.prod.int.phx2.redhat.com
    Signed-off-by: Ingo Molnar

    Jason Baron
     

24 Feb, 2012

1 commit

  • …_key_slow_[inc|dec]()

    So here's a boot tested patch on top of Jason's series that does
    all the cleanups I talked about and turns jump labels into a
    more intuitive to use facility. It should also address the
    various misconceptions and confusions that surround jump labels.

    Typical usage scenarios:

    #include <linux/static_key.h>

    struct static_key key = STATIC_KEY_INIT_TRUE;

    if (static_key_false(&key))
    do unlikely code
    else
    do likely code

    Or:

    if (static_key_true(&key))
    do likely code
    else
    do unlikely code

    The static key is modified via:

    static_key_slow_inc(&key);
    ...
    static_key_slow_dec(&key);

    The 'slow' prefix makes it abundantly clear that this is an
    expensive operation.

    I've updated all in-kernel code to use this everywhere. Note
    that I (intentionally) have not pushed through the rename
    blindly through to the lowest levels: the actual jump-label
    patching arch facility should be named like that, so we want to
    decouple jump labels from the static-key facility a bit.

    On non-jump-label enabled architectures static keys default to
    likely()/unlikely() branches.

    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Acked-by: Jason Baron <jbaron@redhat.com>
    Acked-by: Steven Rostedt <rostedt@goodmis.org>
    Cc: a.p.zijlstra@chello.nl
    Cc: mathieu.desnoyers@efficios.com
    Cc: davem@davemloft.net
    Cc: ddaney.cavm@gmail.com
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/20120222085809.GA26397@elte.hu
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

    Ingo Molnar
     

22 Feb, 2012

2 commits

  • While cross-compiling on sparc64, I found:

    kernel/jump_label.c: In function 'jump_label_update':
    kernel/jump_label.c:447:40: warning: cast from pointer to
    integer of different size [-Wpointer-to-int-cast]

    Fix by casting to 'unsigned long'.

    Signed-off-by: Jason Baron
    Cc: rostedt@goodmis.org
    Cc: mathieu.desnoyers@efficios.com
    Cc: davem@davemloft.net
    Cc: ddaney.cavm@gmail.com
    Cc: a.p.zijlstra@chello.nl
    Link: http://lkml.kernel.org/r/08026cbc6df80619cae833ef1ebbbc43efab69ab.1329851692.git.jbaron@redhat.com
    Signed-off-by: Ingo Molnar

    Jason Baron
     
  • The count on a jump label key should never go negative. Add a
    WARN() to check for this condition.

    Signed-off-by: Jason Baron
    Cc: Gleb Natapov
    Cc: rostedt@goodmis.org
    Cc: mathieu.desnoyers@efficios.com
    Cc: davem@davemloft.net
    Cc: ddaney.cavm@gmail.com
    Cc: a.p.zijlstra@chello.nl
    Link: http://lkml.kernel.org/r/3c68556121be4d1920417a3fe367da1ec38246b4.1329851692.git.jbaron@redhat.com
    Signed-off-by: Ingo Molnar

    Jason Baron
     

27 Dec, 2011

2 commits

  • * tip/perf/core: (66 commits)
    perf, x86: Expose perf capability to other modules
    perf, x86: Implement arch event mask as quirk
    x86, perf: Disable non available architectural events
    jump_label: Provide jump_label_key initializers
    jump_label, x86: Fix section mismatch
    perf, core: Rate limit perf_sched_events jump_label patching
    perf: Fix enable_on_exec for sibling events
    perf: Remove superfluous arguments
    perf, x86: Prefer fixed-purpose counters when scheduling
    perf, x86: Fix event scheduler for constraints with overlapping counters
    perf, x86: Implement event scheduler helper functions
    perf: Avoid a useless pmu_disable() in the perf-tick
    x86/tools: Add decoded instruction dump mode
    x86: Update instruction decoder to support new AVX formats
    x86/tools: Fix insn_sanity message outputs
    x86/tools: Fix instruction decoder message output
    x86: Fix instruction decoder to handle grouped AVX instructions
    x86/tools: Fix Makefile to build all test tools
    perf test: Soft errors shouldn't stop the "Validate PERF_RECORD_" test
    perf test: Validate PERF_RECORD_ events and perf_sample fields
    ...

    Signed-off-by: Avi Kivity

    * commit 'b3d9468a8bd218a695e3a0ff112cd4efd27b670a': (66 commits)
    perf, x86: Expose perf capability to other modules
    perf, x86: Implement arch event mask as quirk
    x86, perf: Disable non available architectural events
    jump_label: Provide jump_label_key initializers
    jump_label, x86: Fix section mismatch
    perf, core: Rate limit perf_sched_events jump_label patching
    perf: Fix enable_on_exec for sibling events
    perf: Remove superfluous arguments
    perf, x86: Prefer fixed-purpose counters when scheduling
    perf, x86: Fix event scheduler for constraints with overlapping counters
    perf, x86: Implement event scheduler helper functions
    perf: Avoid a useless pmu_disable() in the perf-tick
    x86/tools: Add decoded instruction dump mode
    x86: Update instruction decoder to support new AVX formats
    x86/tools: Fix insn_sanity message outputs
    x86/tools: Fix instruction decoder message output
    x86: Fix instruction decoder to handle grouped AVX instructions
    x86/tools: Fix Makefile to build all test tools
    perf test: Soft errors shouldn't stop the "Validate PERF_RECORD_" test
    perf test: Validate PERF_RECORD_ events and perf_sample fields
    ...

    Avi Kivity
     
  • Export these two symbols, they will be used by KVM mmu audit

    Signed-off-by: Xiao Guangrong
    Signed-off-by: Avi Kivity

    Xiao Guangrong
     

07 Dec, 2011

2 commits

  • Provide two initializers for jump_label_key that initialize it enabled
    or disabled. Also modify all jump_label code to allow for jump_labels to be
    initialized enabled.

    Signed-off-by: Peter Zijlstra
    Cc: Jason Baron
    Link: http://lkml.kernel.org/n/tip-p40e3yj21b68y03z1yv825e7@git.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • WARNING: arch/x86/kernel/built-in.o(.text+0x4c71): Section mismatch in
    reference from the function arch_jump_label_transform_static() to the
    function .init.text:text_poke_early()
    The function arch_jump_label_transform_static() references
    the function __init text_poke_early().
    This is often because arch_jump_label_transform_static lacks a __init
    annotation or the annotation of text_poke_early is wrong.

    Signed-off-by: Peter Zijlstra
    Cc: Jason Baron
    Link: http://lkml.kernel.org/n/tip-9lefe89mrvurrwpqw5h8xm8z@git.kernel.org
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     

06 Dec, 2011

2 commits

  • jump_lable patching is very expensive operation that involves pausing all
    cpus. The patching of perf_sched_events jump_label is easily controllable
    from userspace by unprivileged user.

    When te user runs a loop like this:

    "while true; do perf stat -e cycles true; done"

    ... the performance of my test application that just increments a counter
    for one second drops by 4%.

    This is on a 16 cpu box with my test application using only one of
    them. An impact on a real server doing real work will be worse.

    Performance of KVM PMU drops nearly 50% due to jump_lable for "perf
    record" since KVM PMU implementation creates and destroys perf event
    frequently.

    This patch introduces a way to rate limit jump_label patching and uses
    it to fix the above problem.

    I believe that as jump_label use will spread the problem will become more
    common and thus solving it in a generic code is appropriate. Also fixing
    it in the perf code would result in moving jump_label accounting logic to
    perf code with all the ifdefs in case of JUMP_LABEL=n kernel. With this
    patch all details are nicely hidden inside jump_label code.

    Signed-off-by: Gleb Natapov
    Acked-by: Jason Baron
    Signed-off-by: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20111127155909.GO2557@redhat.com
    Signed-off-by: Ingo Molnar

    Gleb Natapov
     
  • If cpu A calls jump_label_inc() just after atomic_add_return() is
    called by cpu B, atomic_inc_not_zero() will return value greater then
    zero and jump_label_inc() will return to a caller before jump_label_update()
    finishes its job on cpu B.

    Link: http://lkml.kernel.org/r/20111018175551.GH17571@redhat.com

    Cc: stable@vger.kernel.org
    Cc: Peter Zijlstra
    Acked-by: Jason Baron
    Signed-off-by: Gleb Natapov
    Signed-off-by: Steven Rostedt

    Gleb Natapov
     

11 Nov, 2011

1 commit