20 Mar, 2018

1 commit

  • With the following commit:

    333522447063 ("jump_label: Explicitly disable jump labels in __init code")

    ... we explicitly disabled jump labels in __init code, so they could be
    detected and not warned about in the following commit:

    dc1dd184c2f0 ("jump_label: Warn on failed jump_label patching attempt")

    In-kernel __exit code has the same issue. It's never used, so it's
    freed along with the rest of initmem. But jump label entries in __exit
    code aren't explicitly disabled, so we get the following warning when
    enabling pr_debug() in __exit code:

    can't patch jump_label at dmi_sysfs_exit+0x0/0x2d
    WARNING: CPU: 0 PID: 22572 at kernel/jump_label.c:376 __jump_label_update+0x9d/0xb0

    Fix the warning by disabling all jump labels in initmem (which includes
    both __init and __exit code).

    Reported-and-tested-by: Li Wang
    Signed-off-by: Josh Poimboeuf
    Cc: Borislav Petkov
    Cc: Jason Baron
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: dc1dd184c2f0 ("jump_label: Warn on failed jump_label patching attempt")
    Link: http://lkml.kernel.org/r/7121e6e595374f06616c505b6e690e275c0054d1.1521483452.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

14 Mar, 2018

1 commit

  • The kbuild test robot reported the following warning on sparc64:

    kernel/jump_label.c: In function '__jump_label_update':
    kernel/jump_label.c:376:51: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    WARN_ONCE(1, "can't patch jump_label at %pS", (void *)entry->code);

    On sparc64, the jump_label entry->code field is of type u32, but
    pointers are 64-bit. Silence the warning by casting entry->code to an
    unsigned long before casting it to a pointer. This is also what the
    sparc jump label code does.

    Fixes: dc1dd184c2f0 ("jump_label: Warn on failed jump_label patching attempt")
    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: Jason Baron
    Cc: Borislav Petkov
    Cc: "David S . Miller"
    Link: https://lkml.kernel.org/r/c966fed42be6611254a62d46579ec7416548d572.1521041026.git.jpoimboe@redhat.com

    Josh Poimboeuf
     

21 Feb, 2018

3 commits

  • Convert init_kernel_text() to a global function and use it in a few
    places instead of manually comparing _sinittext and _einittext.

    Note that kallsyms.h has a very similar function called
    is_kernel_inittext(), but its end check is inclusive. I'm not sure
    whether that's intentional behavior, so I didn't touch it.

    Suggested-by: Jason Baron
    Signed-off-by: Josh Poimboeuf
    Acked-by: Peter Zijlstra
    Acked-by: Steven Rostedt (VMware)
    Cc: Borislav Petkov
    Cc: Linus Torvalds
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/4335d02be8d45ca7d265d2f174251d0b7ee6c5fd.1519051220.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • Currently when the jump label code encounters an address which isn't
    recognized by kernel_text_address(), it just silently fails.

    This can be dangerous because jump labels are used in a variety of
    places, and are generally expected to work. Convert the silent failure
    to a warning.

    This won't warn about attempted writes to tracepoints in __init code
    after initmem has been freed, as those are already guarded by the
    entry->code check.

    Signed-off-by: Josh Poimboeuf
    Acked-by: Peter Zijlstra
    Cc: Borislav Petkov
    Cc: Jason Baron
    Cc: Linus Torvalds
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/de3a271c93807adb7ed48f4e946b4f9156617680.1519051220.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • After initmem has been freed, any jump labels in __init code are
    prevented from being written to by the kernel_text_address() check in
    __jump_label_update(). However, this check is quite broad. If
    kernel_text_address() were to return false for any other reason, the
    jump label write would fail silently with no warning.

    For jump labels in module init code, entry->code is set to zero to
    indicate that the entry is disabled. Do the same thing for core kernel
    init code. This makes the behavior more consistent, and will also make
    it more straightforward to detect non-init jump label write failures in
    the next patch.

    Signed-off-by: Josh Poimboeuf
    Acked-by: Peter Zijlstra
    Cc: Borislav Petkov
    Cc: Jason Baron
    Cc: Linus Torvalds
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/c52825c73f3a174e8398b6898284ec20d4deb126.1519051220.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

24 Jan, 2018

1 commit

  • Tejun reported the following cpu-hotplug lock (percpu-rwsem) read recursion:

    tg_set_cfs_bandwidth()
    get_online_cpus()
    cpus_read_lock()

    cfs_bandwidth_usage_inc()
    static_key_slow_inc()
    cpus_read_lock()

    Reported-by: Tejun Heo
    Tested-by: Tejun Heo
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/20180122215328.GP3397@worktop
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     

14 Nov, 2017

1 commit

  • 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

    Jason Baron
     

19 Oct, 2017

1 commit

  • Right now it says:

    static_key_disable_cpuslocked used before call to jump_label_init
    ------------[ cut here ]------------
    WARNING: CPU: 0 PID: 0 at kernel/jump_label.c:161 static_key_disable_cpuslocked+0x68/0x70
    Modules linked in:
    CPU: 0 PID: 0 Comm: swapper Not tainted 4.14.0-rc5+ #1
    Hardware name: SGI.COM C2112-4GP3/X10DRT-P-Series, BIOS 2.0a 05/09/2016
    task: ffffffff81c0e480 task.stack: ffffffff81c00000
    RIP: 0010:static_key_disable_cpuslocked+0x68/0x70
    RSP: 0000:ffffffff81c03ef0 EFLAGS: 00010096 ORIG_RAX: 0000000000000000
    RAX: 0000000000000041 RBX: ffffffff81c32680 RCX: ffffffff81c5cbf8
    RDX: 0000000000000001 RSI: 0000000000000092 RDI: 0000000000000002
    RBP: ffff88807fffd240 R08: 726f666562206465 R09: 0000000000000136
    R10: 0000000000000000 R11: 696e695f6c656261 R12: ffffffff82158900
    R13: ffffffff8215f760 R14: 0000000000000001 R15: 0000000000000008
    FS: 0000000000000000(0000) GS:ffff883f7f400000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffff88807ffff000 CR3: 0000000001c09000 CR4: 00000000000606b0
    Call Trace:
    static_key_disable+0x16/0x20
    start_kernel+0x15a/0x45d
    ? load_ucode_intel_bsp+0x11/0x2d
    secondary_startup_64+0xa5/0xb0
    Code: 48 c7 c7 a0 15 cf 81 e9 47 53 4b 00 48 89 df e8 5f fc ff ff eb e8 48 c7 c6 \
    c0 97 83 81 48 c7 c7 d0 ff a2 81 31 c0 e8 c5 9d f5 ff ff eb a7 0f ff eb \
    b0 e8 eb a2 4b 00 53 48 89 fb e8 42 0e f0

    but it doesn't tell me which key it is. So dump the key's name too:

    static_key_disable_cpuslocked(): static key 'virt_spin_lock_key' used before call to jump_label_init()

    And that makes pinpointing which key is causing that a lot easier.

    include/linux/jump_label.h | 14 +++++++-------
    include/linux/jump_label_ratelimit.h | 6 +++---
    kernel/jump_label.c | 14 +++++++-------
    3 files changed, 17 insertions(+), 17 deletions(-)

    Signed-off-by: Borislav Petkov
    Reviewed-by: Steven Rostedt (VMware)
    Cc: Boris Ostrovsky
    Cc: Hannes Frederic Sowa
    Cc: Jason Baron
    Cc: Juergen Gross
    Cc: Linus Torvalds
    Cc: Paolo Bonzini
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/20171018152428.ffjgak4o25f7ept6@pd.tnic
    Signed-off-by: Ingo Molnar

    Borislav Petkov
     

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