05 Mar, 2020

1 commit

  • commit f66c0447cca1281116224d474cdb37d6a18e4b5b upstream.

    Set the unoptimized flag after confirming the code is completely
    unoptimized. Without this fix, when a kprobe hits the intermediate
    modified instruction (the first byte is replaced by an INT3, but
    later bytes can still be a jump address operand) while unoptimizing,
    it can return to the middle byte of the modified code, which causes
    an invalid instruction exception in the kernel.

    Usually, this is a rare case, but if we put a probe on the function
    call while text patching, it always causes a kernel panic as below:

    # echo p text_poke+5 > kprobe_events
    # echo 1 > events/kprobes/enable
    # echo 0 > events/kprobes/enable

    invalid opcode: 0000 [#1] PREEMPT SMP PTI
    RIP: 0010:text_poke+0x9/0x50
    Call Trace:
    arch_unoptimize_kprobe+0x22/0x28
    arch_unoptimize_kprobes+0x39/0x87
    kprobe_optimizer+0x6e/0x290
    process_one_work+0x2a0/0x610
    worker_thread+0x28/0x3d0
    ? process_one_work+0x610/0x610
    kthread+0x10d/0x130
    ? kthread_park+0x80/0x80
    ret_from_fork+0x3a/0x50

    text_poke() is used for patching the code in optprobes.

    This can happen even if we blacklist text_poke() and other functions,
    because there is a small time window during which we show the intermediate
    code to other CPUs.

    [ mingo: Edited the changelog. ]

    Tested-by: Alexei Starovoitov
    Signed-off-by: Masami Hiramatsu
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Cc: bristot@redhat.com
    Fixes: 6274de4984a6 ("kprobes: Support delayed unoptimizing")
    Link: https://lkml.kernel.org/r/157483422375.25881.13508326028469515760.stgit@devnote2
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Masami Hiramatsu
     

21 Sep, 2019

1 commit

  • Pull tracing updates from Steven Rostedt:

    - Addition of multiprobes to kprobe and uprobe events (allows for more
    than one probe attached to the same location)

    - Addition of adding immediates to probe parameters

    - Clean up of the recordmcount.c code. This brings us closer to merging
    recordmcount into objtool, and reuse code.

    - Other small clean ups

    * tag 'trace-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (33 commits)
    selftests/ftrace: Update kprobe event error testcase
    tracing/probe: Reject exactly same probe event
    tracing/probe: Fix to allow user to enable events on unloaded modules
    selftests/ftrace: Select an existing function in kprobe_eventname test
    tracing/kprobe: Fix NULL pointer access in trace_porbe_unlink()
    tracing: Make sure variable reference alias has correct var_ref_idx
    tracing: Be more clever when dumping hex in __print_hex()
    ftrace: Simplify ftrace hash lookup code in clear_func_from_hash()
    tracing: Add "gfp_t" support in synthetic_events
    tracing: Rename tracing_reset() to tracing_reset_cpu()
    tracing: Document the stack trace algorithm in the comments
    tracing/arm64: Have max stack tracer handle the case of return address after data
    recordmcount: Clarify what cleanup() does
    recordmcount: Remove redundant cleanup() calls
    recordmcount: Kernel style formatting
    recordmcount: Kernel style function signature formatting
    recordmcount: Rewrite error/success handling
    selftests/ftrace: Add syntax error test for multiprobe
    selftests/ftrace: Add syntax error test for immediates
    selftests/ftrace: Add a testcase for kprobe multiprobe event
    ...

    Linus Torvalds
     

17 Sep, 2019

1 commit

  • Pull scheduler updates from Ingo Molnar:

    - MAINTAINERS: Add Mark Rutland as perf submaintainer, Juri Lelli and
    Vincent Guittot as scheduler submaintainers. Add Dietmar Eggemann,
    Steven Rostedt, Ben Segall and Mel Gorman as scheduler reviewers.

    As perf and the scheduler is getting bigger and more complex,
    document the status quo of current responsibilities and interests,
    and spread the review pain^H^H^H^H fun via an increase in the Cc:
    linecount generated by scripts/get_maintainer.pl. :-)

    - Add another series of patches that brings the -rt (PREEMPT_RT) tree
    closer to mainline: split the monolithic CONFIG_PREEMPT dependencies
    into a new CONFIG_PREEMPTION category that will allow the eventual
    introduction of CONFIG_PREEMPT_RT. Still a few more hundred patches
    to go though.

    - Extend the CPU cgroup controller with uclamp.min and uclamp.max to
    allow the finer shaping of CPU bandwidth usage.

    - Micro-optimize energy-aware wake-ups from O(CPUS^2) to O(CPUS).

    - Improve the behavior of high CPU count, high thread count
    applications running under cpu.cfs_quota_us constraints.

    - Improve balancing with SCHED_IDLE (SCHED_BATCH) tasks present.

    - Improve CPU isolation housekeeping CPU allocation NUMA locality.

    - Fix deadline scheduler bandwidth calculations and logic when cpusets
    rebuilds the topology, or when it gets deadline-throttled while it's
    being offlined.

    - Convert the cpuset_mutex to percpu_rwsem, to allow it to be used from
    setscheduler() system calls without creating global serialization.
    Add new synchronization between cpuset topology-changing events and
    the deadline acceptance tests in setscheduler(), which were broken
    before.

    - Rework the active_mm state machine to be less confusing and more
    optimal.

    - Rework (simplify) the pick_next_task() slowpath.

    - Improve load-balancing on AMD EPYC systems.

    - ... and misc cleanups, smaller fixes and improvements - please see
    the Git log for more details.

    * 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (53 commits)
    sched/psi: Correct overly pessimistic size calculation
    sched/fair: Speed-up energy-aware wake-ups
    sched/uclamp: Always use 'enum uclamp_id' for clamp_id values
    sched/uclamp: Update CPU's refcount on TG's clamp changes
    sched/uclamp: Use TG's clamps to restrict TASK's clamps
    sched/uclamp: Propagate system defaults to the root group
    sched/uclamp: Propagate parent clamps
    sched/uclamp: Extend CPU's cgroup controller
    sched/topology: Improve load balancing on AMD EPYC systems
    arch, ia64: Make NUMA select SMP
    sched, perf: MAINTAINERS update, add submaintainers and reviewers
    sched/fair: Use rq_lock/unlock in online_fair_sched_group
    cpufreq: schedutil: fix equation in comment
    sched: Rework pick_next_task() slow-path
    sched: Allow put_prev_task() to drop rq->lock
    sched/fair: Expose newidle_balance()
    sched: Add task_struct pointer to sched_class::set_curr_task
    sched: Rework CPU hotplug task selection
    sched/{rt,deadline}: Fix set_next_task vs pick_next_task
    sched: Fix kerneldoc comment for ia64_set_curr_task
    ...

    Linus Torvalds
     

05 Sep, 2019

1 commit

  • Since BUG() and WARN() may use a trap (e.g. UD2 on x86) to
    get the address where the BUG() has occurred, kprobes can not
    do single-step out-of-line that instruction. So prohibit
    probing on such address.

    Without this fix, if someone put a kprobe on WARN(), the
    kernel will crash with invalid opcode error instead of
    outputing warning message, because kernel can not find
    correct bug address.

    Signed-off-by: Masami Hiramatsu
    Acked-by: Steven Rostedt (VMware)
    Acked-by: Naveen N. Rao
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Link: https://lkml.kernel.org/r/156750890133.19112.3393666300746167111.stgit@devnote2
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

01 Sep, 2019

1 commit

  • Allow kprobes which do not modify regs->ip, coexist with livepatch
    by dropping FTRACE_OPS_FL_IPMODIFY from ftrace_ops.

    User who wants to modify regs->ip (e.g. function fault injection)
    must set a dummy post_handler to its kprobes when registering.
    However, if such regs->ip modifying kprobes is set on a function,
    that function can not be livepatched.

    Link: http://lkml.kernel.org/r/156403587671.30117.5233558741694155985.stgit@devnote2

    Acked-by: Joe Lawrence
    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Steven Rostedt (VMware)

    Masami Hiramatsu
     

19 Aug, 2019

1 commit

  • lockdep reports the following deadlock scenario:

    WARNING: possible circular locking dependency detected

    kworker/1:1/48 is trying to acquire lock:
    000000008d7a62b2 (text_mutex){+.+.}, at: kprobe_optimizer+0x163/0x290

    but task is already holding lock:
    00000000850b5e2d (module_mutex){+.+.}, at: kprobe_optimizer+0x31/0x290

    which lock already depends on the new lock.

    the existing dependency chain (in reverse order) is:

    -> #1 (module_mutex){+.+.}:
    __mutex_lock+0xac/0x9f0
    mutex_lock_nested+0x1b/0x20
    set_all_modules_text_rw+0x22/0x90
    ftrace_arch_code_modify_prepare+0x1c/0x20
    ftrace_run_update_code+0xe/0x30
    ftrace_startup_enable+0x2e/0x50
    ftrace_startup+0xa7/0x100
    register_ftrace_function+0x27/0x70
    arm_kprobe+0xb3/0x130
    enable_kprobe+0x83/0xa0
    enable_trace_kprobe.part.0+0x2e/0x80
    kprobe_register+0x6f/0xc0
    perf_trace_event_init+0x16b/0x270
    perf_kprobe_init+0xa7/0xe0
    perf_kprobe_event_init+0x3e/0x70
    perf_try_init_event+0x4a/0x140
    perf_event_alloc+0x93a/0xde0
    __do_sys_perf_event_open+0x19f/0xf30
    __x64_sys_perf_event_open+0x20/0x30
    do_syscall_64+0x65/0x1d0
    entry_SYSCALL_64_after_hwframe+0x49/0xbe

    -> #0 (text_mutex){+.+.}:
    __lock_acquire+0xfcb/0x1b60
    lock_acquire+0xca/0x1d0
    __mutex_lock+0xac/0x9f0
    mutex_lock_nested+0x1b/0x20
    kprobe_optimizer+0x163/0x290
    process_one_work+0x22b/0x560
    worker_thread+0x50/0x3c0
    kthread+0x112/0x150
    ret_from_fork+0x3a/0x50

    other info that might help us debug this:

    Possible unsafe locking scenario:

    CPU0 CPU1
    ---- ----
    lock(module_mutex);
    lock(text_mutex);
    lock(module_mutex);
    lock(text_mutex);

    *** DEADLOCK ***

    As a reproducer I've been using bcc's funccount.py
    (https://github.com/iovisor/bcc/blob/master/tools/funccount.py),
    for example:

    # ./funccount.py '*interrupt*'

    That immediately triggers the lockdep splat.

    Fix by acquiring text_mutex before module_mutex in kprobe_optimizer().

    Signed-off-by: Andrea Righi
    Acked-by: Masami Hiramatsu
    Cc: Anil S Keshavamurthy
    Cc: David S. Miller
    Cc: Linus Torvalds
    Cc: Naveen N. Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: d5b844a2cf50 ("ftrace/x86: Remove possible deadlock between register_kprobe() and ftrace_run_update_code()")
    Link: http://lkml.kernel.org/r/20190812184302.GA7010@xps-13
    Signed-off-by: Ingo Molnar

    Andrea Righi
     

01 Aug, 2019

1 commit

  • CONFIG_PREEMPTION is selected by CONFIG_PREEMPT and by
    CONFIG_PREEMPT_RT. Both PREEMPT and PREEMPT_RT require the same
    functionality which today depends on CONFIG_PREEMPT.

    Switch kprobes conditional over to CONFIG_PREEMPTION.

    Signed-off-by: Thomas Gleixner
    Acked-by: Peter Zijlstra (Intel)
    Cc: Linus Torvalds
    Cc: Masami Hiramatsu
    Cc: Paolo Bonzini
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Link: http://lkml.kernel.org/r/20190726212124.516286187@linutronix.de
    Signed-off-by: Ingo Molnar

    Thomas Gleixner
     

19 Jul, 2019

1 commit

  • Pull tracing updates from Steven Rostedt:
    "The main changes in this release include:

    - Add user space specific memory reading for kprobes

    - Allow kprobes to be executed earlier in boot

    The rest are mostly just various clean ups and small fixes"

    * tag 'trace-v5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (33 commits)
    tracing: Make trace_get_fields() global
    tracing: Let filter_assign_type() detect FILTER_PTR_STRING
    tracing: Pass type into tracing_generic_entry_update()
    ftrace/selftest: Test if set_event/ftrace_pid exists before writing
    ftrace/selftests: Return the skip code when tracing directory not configured in kernel
    tracing/kprobe: Check registered state using kprobe
    tracing/probe: Add trace_event_call accesses APIs
    tracing/probe: Add probe event name and group name accesses APIs
    tracing/probe: Add trace flag access APIs for trace_probe
    tracing/probe: Add trace_event_file access APIs for trace_probe
    tracing/probe: Add trace_event_call register API for trace_probe
    tracing/probe: Add trace_probe init and free functions
    tracing/uprobe: Set print format when parsing command
    tracing/kprobe: Set print format right after parsed command
    kprobes: Fix to init kprobes in subsys_initcall
    tracepoint: Use struct_size() in kmalloc()
    ring-buffer: Remove HAVE_64BIT_ALIGNED_ACCESS
    ftrace: Enable trampoline when rec count returns back to one
    tracing/kprobe: Do not run kprobe boot tests if kprobe_event is on cmdline
    tracing: Make a separate config for trace event self tests
    ...

    Linus Torvalds
     

17 Jul, 2019

1 commit

  • Since arm64 kernel initializes breakpoint trap vector in arch_initcall(),
    initializing kprobe (and run smoke test) in postcore_initcall() causes
    a kernel panic.

    To fix this issue, move the kprobe initialization in subsys_initcall()
    (which is called right afer the arch_initcall).

    In-kernel kprobe users (ftrace and bpf) are using fs_initcall() which is
    called after subsys_initcall(), so this shouldn't cause more problem.

    Link: http://lkml.kernel.org/r/155956708268.12228.10363800793132214198.stgit@devnote2
    Link: http://lkml.kernel.org/r/20190709153755.GB10123@lakrids.cambridge.arm.com

    Reported-by: Anders Roxell
    Fixes: b5f8b32c93b2 ("kprobes: Initialize kprobes at postcore_initcall")
    Tested-by: Anders Roxell
    Tested-by: Mark Rutland
    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Steven Rostedt (VMware)

    Masami Hiramatsu
     

03 Jun, 2019

1 commit


31 May, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public license as published by
    the free software foundation either version 2 of the license or at
    your option any later version this program is distributed in the
    hope that it will be useful but without any warranty without even
    the implied warranty of merchantability or fitness for a particular
    purpose see the gnu general public license for more details you
    should have received a copy of the gnu general public license along
    with this program if not write to the free software foundation inc
    59 temple place suite 330 boston ma 02111 1307 usa

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 1334 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Richard Fontana
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190527070033.113240726@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

26 May, 2019

1 commit

  • Initialize kprobes at postcore_initcall level instead of module_init
    since kprobes is not a module, and it depends on only subsystems
    initialized in core_initcall.
    This will allow ftrace kprobe event to add new events when it is
    initializing because ftrace kprobe event is initialized at
    later initcall level.

    Link: http://lkml.kernel.org/r/155851394736.15728.13626739508905120098.stgit@devnote2

    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Steven Rostedt (VMware)

    Masami Hiramatsu
     

16 Apr, 2019

1 commit

  • The following commit introduced a bug in one of our error paths:

    819319fc9346 ("kprobes: Return error if we fail to reuse kprobe instead of BUG_ON()")

    it missed to handle the return value of kprobe_optready() as
    error-value. In reality, the kprobe_optready() returns a bool
    result, so "true" case must be passed instead of 0.

    This causes some errors on kprobe boot-time selftests on ARM:

    [ ] Beginning kprobe tests...
    [ ] Probe ARM code
    [ ] kprobe
    [ ] kretprobe
    [ ] ARM instruction simulation
    [ ] Check decoding tables
    [ ] Run test cases
    [ ] FAIL: test_case_handler not run
    [ ] FAIL: Test andge r10, r11, r14, asr r7
    [ ] FAIL: Scenario 11
    ...
    [ ] FAIL: Scenario 7
    [ ] Total instruction simulation tests=1631, pass=1433 fail=198
    [ ] kprobe tests failed

    This can happen if an optimized probe is unregistered and next
    kprobe is registered on same address until the previous probe
    is not reclaimed.

    If this happens, a hidden aggregated probe may be kept in memory,
    and no new kprobe can probe same address. Also, in that case
    register_kprobe() will return "1" instead of minus error value,
    which can mislead caller logic.

    Signed-off-by: Masami Hiramatsu
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: stable@vger.kernel.org # v5.0+
    Fixes: 819319fc9346 ("kprobes: Return error if we fail to reuse kprobe instead of BUG_ON()")
    Link: http://lkml.kernel.org/r/155530808559.32517.539898325433642204.stgit@devnote2
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

13 Feb, 2019

1 commit

  • Newer GCC versions can generate some different instances of a function
    with suffixed symbols if the function is optimized and only
    has a part of that. (e.g. .constprop, .part etc.)

    In this case, it is not enough to check the entry of kprobe
    blacklist because it only records non-suffixed symbol address.

    To fix this issue, search non-suffixed symbol in blacklist if
    given address is within a symbol which has a suffix.

    Note that this can cause false positive cases if a kprobe-safe
    function is optimized to suffixed instance and has same name
    symbol which is blacklisted.
    But I would like to chose a fail-safe design for this issue.

    Signed-off-by: Masami Hiramatsu
    Reviewed-by: Steven Rostedt (VMware)
    Cc: Alexander Shishkin
    Cc: Andrea Righi
    Cc: Arnaldo Carvalho de Melo
    Cc: Jiri Olsa
    Cc: Linus Torvalds
    Cc: Mathieu Desnoyers
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/154998799234.31052.6136378903570418008.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

27 Dec, 2018

1 commit

  • Pull perf updates from Ingo Molnar:
    "The main changes in this cycle on the kernel side:

    - rework kprobes blacklist handling (Masami Hiramatsu)

    - misc cleanups

    on the tooling side these areas were the main focus:

    - 'perf trace' enhancements (Arnaldo Carvalho de Melo)

    - 'perf bench' enhancements (Davidlohr Bueso)

    - 'perf record' enhancements (Alexey Budankov)

    - 'perf annotate' enhancements (Jin Yao)

    - 'perf top' enhancements (Jiri Olsa)

    - Intel hw tracing enhancements (Adrian Hunter)

    - ARM hw tracing enhancements (Leo Yan, Mathieu Poirier)

    - ... plus lots of other enhancements, cleanups and fixes"

    * 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (171 commits)
    tools uapi asm: Update asm-generic/unistd.h copy
    perf symbols: Relax checks on perf-PID.map ownership
    perf trace: Wire up the fadvise 'advice' table generator
    perf beauty: Add generator for fadvise64's 'advice' arg constants
    tools headers uapi: Grab a copy of fadvise.h
    perf beauty mmap: Print mmap's 'offset' arg in hexadecimal
    perf beauty mmap: Print PROT_READ before PROT_EXEC to match strace output
    perf trace beauty: Beautify arch_prctl()'s arguments
    perf trace: When showing string prefixes show prefix + ??? for unknown entries
    perf trace: Move strarrays to beauty.h for further reuse
    perf beauty: Wire up the x86_arch prctl code table generator
    perf beauty: Add a string table generator for x86's 'arch_prctl' codes
    tools include arch: Grab a copy of x86's prctl.h
    perf trace: Show NULL when syscall pointer args are 0
    perf trace: Enclose the errno strings with ()
    perf augmented_raw_syscalls: Copy 'access' arg as well
    perf trace: Add alignment spaces after the closing parens
    perf trace beauty: Print O_RDONLY when (flags & O_ACCMODE) == 0
    perf trace: Allow asking for not suppressing common string prefixes
    perf trace: Add a prefix member to the strarray class
    ...

    Linus Torvalds
     

18 Dec, 2018

1 commit

  • Blacklist symbols in arch-defined probe-prohibited areas.
    With this change, user can see all symbols which are prohibited
    to probe in debugfs.

    All archtectures which have custom prohibit areas should define
    its own arch_populate_kprobe_blacklist() function, but unless that,
    all symbols marked __kprobes are blacklisted.

    Reported-by: Andrea Righi
    Tested-by: Andrea Righi
    Signed-off-by: Masami Hiramatsu
    Cc: Andy Lutomirski
    Cc: Anil S Keshavamurthy
    Cc: Borislav Petkov
    Cc: David S. Miller
    Cc: Linus Torvalds
    Cc: Naveen N. Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: Yonghong Song
    Link: http://lkml.kernel.org/r/154503485491.26176.15823229545155174796.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

28 Nov, 2018

1 commit

  • Now that synchronize_rcu() waits for preempt-disable regions of code
    as well as RCU read-side critical sections, synchronize_sched() can be
    replaced by synchronize_rcu(). This commit therefore makes this change.

    Signed-off-by: Paul E. McKenney
    Cc: "Naveen N. Rao"
    Cc: Anil S Keshavamurthy
    Cc: "David S. Miller"
    Acked-by: Masami Hiramatsu

    Paul E. McKenney
     

12 Sep, 2018

5 commits

  • Instead of calling BUG_ON(), if we find a kprobe in use on free kprobe
    list, just remove it from the list and keep it on kprobe hash list
    as same as other in-use kprobes.

    Signed-off-by: Masami Hiramatsu
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/153666126882.21306.10738207224288507996.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Make reuse_unused_kprobe() to return error code if
    it fails to reuse unused kprobe for optprobe instead
    of calling BUG_ON().

    Signed-off-by: Masami Hiramatsu
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/153666124040.21306.14150398706331307654.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Since reuse_unused_kprobe() is called when the given kprobe
    is unused, checking it inside again with BUG_ON() is
    pointless. Remove it.

    Signed-off-by: Masami Hiramatsu
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/153666121154.21306.17540752948574483565.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Before calling add_new_kprobe(), aggr_probe's GONE
    flag and kprobe GONE flag are cleared. We don't need
    to worry about that flag at this point.

    Signed-off-by: Masami Hiramatsu
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/153666118298.21306.4915366706875652652.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • All aggr_probes at this line are already disarmed by
    disable_kprobe() or checked by kprobe_disarmed().

    So this BUG_ON() is pointless, remove it.

    Signed-off-by: Masami Hiramatsu
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/153666115463.21306.8799008438116029806.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

21 Jun, 2018

6 commits

  • Replace %p with %pS or just remove it if unneeded.
    And use WARN_ONCE() if it is a single bug.

    Signed-off-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: Arnd Bergmann
    Cc: David Howells
    Cc: David S . Miller
    Cc: Heiko Carstens
    Cc: Jon Medhurst
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: Thomas Richter
    Cc: Tobin C . Harding
    Cc: Will Deacon
    Cc: acme@kernel.org
    Cc: akpm@linux-foundation.org
    Cc: brueckner@linux.vnet.ibm.com
    Cc: linux-arch@vger.kernel.org
    Cc: rostedt@goodmis.org
    Cc: schwidefsky@de.ibm.com
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/lkml/152491899284.9916.5350534544808158621.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Show probed address in debugfs kprobe list file as same
    as kallsyms does. This information is used for checking
    kprobes are placed in the expected address. So it should
    be able to compared with address in kallsyms.

    Signed-off-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: Arnd Bergmann
    Cc: David Howells
    Cc: David S . Miller
    Cc: Heiko Carstens
    Cc: Jon Medhurst
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: Thomas Richter
    Cc: Tobin C . Harding
    Cc: Will Deacon
    Cc: acme@kernel.org
    Cc: akpm@linux-foundation.org
    Cc: brueckner@linux.vnet.ibm.com
    Cc: linux-arch@vger.kernel.org
    Cc: rostedt@goodmis.org
    Cc: schwidefsky@de.ibm.com
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/lkml/152491896256.9916.1583733714492565296.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Show kprobes blacklist addresses under same condition of
    showing kallsyms addresses.

    Since there are several name conflict for local symbols,
    kprobe blacklist needs to show each addresses so that
    user can identify where is on blacklist by comparing
    with kallsyms.

    Signed-off-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: Arnd Bergmann
    Cc: David Howells
    Cc: David S . Miller
    Cc: Heiko Carstens
    Cc: Jon Medhurst
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: Thomas Richter
    Cc: Tobin C . Harding
    Cc: Will Deacon
    Cc: acme@kernel.org
    Cc: akpm@linux-foundation.org
    Cc: brueckner@linux.vnet.ibm.com
    Cc: linux-arch@vger.kernel.org
    Cc: rostedt@goodmis.org
    Cc: schwidefsky@de.ibm.com
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/lkml/152491893217.9916.14760965896164273464.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Since the blacklist and list files on debugfs indicates
    a sensitive address information to reader, it should be
    restricted to the root user.

    Suggested-by: Thomas Richter
    Suggested-by: Ingo Molnar
    Signed-off-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: Arnd Bergmann
    Cc: David Howells
    Cc: David S . Miller
    Cc: Heiko Carstens
    Cc: Jon Medhurst
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: Tobin C . Harding
    Cc: Will Deacon
    Cc: acme@kernel.org
    Cc: akpm@linux-foundation.org
    Cc: brueckner@linux.vnet.ibm.com
    Cc: linux-arch@vger.kernel.org
    Cc: rostedt@goodmis.org
    Cc: schwidefsky@de.ibm.com
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/lkml/152491890171.9916.5183693615601334087.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Don't check the ->break_handler() from the core kprobes code,
    because it was only used by jprobes which got removed.

    ( In followup patches we'll remove the remaining calls in low level
    arch handlers as well and remove the callback altogether. )

    Signed-off-by: Masami Hiramatsu
    Acked-by: Thomas Gleixner
    Cc: Ananth N Mavinakayanahalli
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: linux-arch@vger.kernel.org
    Link: https://lore.kernel.org/lkml/152942462686.15209.6324404940493598980.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Remove functionally empty jprobe API implementations and test cases.

    Signed-off-by: Masami Hiramatsu
    Acked-by: Thomas Gleixner
    Cc: Ananth N Mavinakayanahalli
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: linux-arch@vger.kernel.org
    Link: https://lore.kernel.org/lkml/152942430705.15209.2307050500995264322.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

25 Apr, 2018

1 commit

  • File /sys/kernel/debug/kprobes/blacklist displays random addresses:

    [root@s8360046 linux]# cat /sys/kernel/debug/kprobes/blacklist
    0x0000000047149a90-0x00000000bfcb099a print_type_x8
    ....

    This breaks 'perf probe' which uses the blacklist file to prohibit
    probes on certain functions by checking the address range.

    Fix this by printing the correct (unhashed) address.

    The file mode is read all but this is not an issue as the file
    hierarchy points out:
    # ls -ld /sys/ /sys/kernel/ /sys/kernel/debug/ /sys/kernel/debug/kprobes/
    /sys/kernel/debug/kprobes/blacklist
    dr-xr-xr-x 12 root root 0 Apr 19 07:56 /sys/
    drwxr-xr-x 8 root root 0 Apr 19 07:56 /sys/kernel/
    drwx------ 16 root root 0 Apr 19 06:56 /sys/kernel/debug/
    drwxr-xr-x 2 root root 0 Apr 19 06:56 /sys/kernel/debug/kprobes/
    -r--r--r-- 1 root root 0 Apr 19 06:56 /sys/kernel/debug/kprobes/blacklist

    Everything in and below /sys/kernel/debug is rwx to root only,
    no group or others have access.

    Background:
    Directory /sys/kernel/debug/kprobes is created by debugfs_create_dir()
    which sets the mode bits to rwxr-xr-x. Maybe change that to use the
    parent's directory mode bits instead?

    Link: http://lkml.kernel.org/r/20180419105556.86664-1-tmricht@linux.ibm.com

    Fixes: ad67b74d2469 ("printk: hash addresses printed with %p")
    Cc: stable@vger.kernel.org
    Cc: # v4.15+
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: David S Miller
    Cc: Masami Hiramatsu
    Cc: acme@kernel.org

    Signed-off-by: Thomas Richter
    Signed-off-by: Steven Rostedt (VMware)

    Thomas Richter
     

16 Feb, 2018

2 commits

  • Improve error handling when disarming ftrace-based kprobes. Like with
    arm_kprobe_ftrace(), propagate any errors from disarm_kprobe_ftrace() so
    that we do not disable/unregister kprobes that are still armed. In other
    words, unregister_kprobe() and disable_kprobe() should not report success
    if the kprobe could not be disarmed.

    disarm_all_kprobes() keeps its current behavior and attempts to
    disarm all kprobes. It returns the last encountered error and gives a
    warning if not all probes could be disarmed.

    This patch is based on Petr Mladek's original patchset (patches 2 and 3)
    back in 2015, which improved kprobes error handling, found here:

    https://lkml.org/lkml/2015/2/26/452

    However, further work on this had been paused since then and the patches
    were not upstreamed.

    Based-on-patches-by: Petr Mladek
    Signed-off-by: Jessica Yu
    Acked-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Jiri Kosina
    Cc: Joe Lawrence
    Cc: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Miroslav Benes
    Cc: Peter Zijlstra
    Cc: Petr Mladek
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Link: http://lkml.kernel.org/r/20180109235124.30886-3-jeyu@kernel.org
    Signed-off-by: Ingo Molnar

    Jessica Yu
     
  • Improve error handling when arming ftrace-based kprobes. Specifically, if
    we fail to arm a ftrace-based kprobe, register_kprobe()/enable_kprobe()
    should report an error instead of success. Previously, this has lead to
    confusing situations where register_kprobe() would return 0 indicating
    success, but the kprobe would not be functional if ftrace registration
    during the kprobe arming process had failed. We should therefore take any
    errors returned by ftrace into account and propagate this error so that we
    do not register/enable kprobes that cannot be armed. This can happen if,
    for example, register_ftrace_function() finds an IPMODIFY conflict (since
    kprobe_ftrace_ops has this flag set) and returns an error. Such a conflict
    is possible since livepatches also set the IPMODIFY flag for their ftrace_ops.

    arm_all_kprobes() keeps its current behavior and attempts to arm all
    kprobes. It returns the last encountered error and gives a warning if
    not all probes could be armed.

    This patch is based on Petr Mladek's original patchset (patches 2 and 3)
    back in 2015, which improved kprobes error handling, found here:

    https://lkml.org/lkml/2015/2/26/452

    However, further work on this had been paused since then and the patches
    were not upstreamed.

    Based-on-patches-by: Petr Mladek
    Signed-off-by: Jessica Yu
    Acked-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Jiri Kosina
    Cc: Joe Lawrence
    Cc: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Miroslav Benes
    Cc: Peter Zijlstra
    Cc: Petr Mladek
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Link: http://lkml.kernel.org/r/20180109235124.30886-2-jeyu@kernel.org
    Signed-off-by: Ingo Molnar

    Jessica Yu
     

20 Oct, 2017

2 commits

  • Disable the jprobes APIs and comment out the jprobes API function
    code. This is in preparation of removing all jprobes related
    code (including kprobe's break_handler).

    Nowadays ftrace and other tracing features are mature enough
    to replace jprobes use-cases. Users can safely use ftrace and
    perf probe etc. for their use cases.

    Signed-off-by: Masami Hiramatsu
    Cc: Alexei Starovoitov
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Ian McDonald
    Cc: Kees Cook
    Cc: Linus Torvalds
    Cc: Paul E . McKenney
    Cc: Peter Zijlstra
    Cc: Stephen Hemminger
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Cc: Vlad Yasevich
    Link: http://lkml.kernel.org/r/150724527741.5014.15465541485637899227.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • We want to wait for all potentially preempted kprobes trampoline
    execution to have completed. This guarantees that any freed
    trampoline memory is not in use by any task in the system anymore.
    synchronize_rcu_tasks() gives such a guarantee, so use it.

    Also, this guarantees to wait for all potentially preempted tasks
    on the instructions which will be replaced with a jump.

    Since this becomes a problem only when CONFIG_PREEMPT=y, enable
    CONFIG_TASKS_RCU=y for synchronize_rcu_tasks() in that case.

    Signed-off-by: Masami Hiramatsu
    Acked-by: Paul E. McKenney
    Cc: Ananth N Mavinakayanahalli
    Cc: Linus Torvalds
    Cc: Naveen N . Rao
    Cc: Paul E . McKenney
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/150845661962.5443.17724352636247312231.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

18 Oct, 2017

1 commit

  • This reverts commit:

    e863d539614641 ("kprobes: Warn if optprobe handler tries to change execution path")

    On PowerPC, we place a probe at kretprobe_trampoline to catch function
    returns and with CONFIG_OPTPROBES=y, this probe gets optimized. This
    works for us due to the way we handle the optprobe as described in
    commit:

    762df10bad6954 ("powerpc/kprobes: Optimize kprobe in kretprobe_trampoline()")

    With the above commit, we end up with a warning. As such, revert this change.

    Reported-by: Michael Ellerman
    Signed-off-by: Naveen N. Rao
    Cc: Ananth N Mavinakayanahalli
    Cc: Linus Torvalds
    Cc: Masami Hiramatsu
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/20171017081834.3629-1-naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Ingo Molnar

    Naveen N. Rao
     

28 Sep, 2017

2 commits

  • Warn if optprobe handler tries to change execution path.
    As described in Documentation/kprobes.txt, with optprobe
    user handler can not change instruction pointer. In that
    case user must avoid optimizing the kprobes by setting
    post_handler or break_handler.

    Signed-off-by: Masami Hiramatsu
    Cc: Alexei Starovoitov
    Cc: Alexei Starovoitov
    Cc: Ananth N Mavinakayanahalli
    Cc: Linus Torvalds
    Cc: Paul E . McKenney
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/150581521955.32348.3615624715034787365.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     
  • Make insn buffer always ROX and use text_poke() to write
    the copied instructions instead of set_memory_*().
    This makes instruction buffer stronger against other
    kernel subsystems because there is no window time
    to modify the buffer.

    Suggested-by: Ingo Molnar
    Signed-off-by: Masami Hiramatsu
    Cc: Ananth N Mavinakayanahalli
    Cc: Anil S Keshavamurthy
    Cc: David S . Miller
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/150304463032.17009.14195368040691676813.stgit@devbox
    Signed-off-by: Ingo Molnar

    Masami Hiramatsu
     

08 Jul, 2017

3 commits

  • Similar to commit 90ec5e89e393c ("kretprobes: Ensure probe location is
    at function entry"), ensure that the jprobe probepoint is at function
    entry.

    Signed-off-by: Naveen N. Rao
    Cc: Ananth N Mavinakayanahalli
    Cc: Linus Torvalds
    Cc: Masami Hiramatsu
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/a4525af6c5a42df385efa31251246cf7cca73598.1499443367.git.naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Ingo Molnar

    Naveen N. Rao
     
  • Re-factor jprobe registration functions as the current version is
    getting too unwieldy. Move the actual jprobe registration to
    register_jprobe() and re-organize code accordingly.

    Suggested-by: Ingo Molnar
    Signed-off-by: Naveen N. Rao
    Cc: Ananth N Mavinakayanahalli
    Cc: Linus Torvalds
    Cc: Masami Hiramatsu
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/089cae4bfe73767f765291ee0e6fb0c3d240e5f1.1499443367.git.naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Ingo Molnar

    Naveen N. Rao
     
  • Rename function_offset_within_entry() to scope it to kprobe namespace by
    using kprobe_ prefix, and to also simplify it.

    Suggested-by: Ingo Molnar
    Suggested-by: Masami Hiramatsu
    Signed-off-by: Naveen N. Rao
    Cc: Ananth N Mavinakayanahalli
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/3aa6c7e2e4fb6e00f3c24fa306496a66edb558ea.1499443367.git.naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Ingo Molnar

    Naveen N. Rao
     

04 Jul, 2017

1 commit

  • Pull SMP hotplug updates from Thomas Gleixner:
    "This update is primarily a cleanup of the CPU hotplug locking code.

    The hotplug locking mechanism is an open coded RWSEM, which allows
    recursive locking. The main problem with that is the recursive nature
    as it evades the full lockdep coverage and hides potential deadlocks.

    The rework replaces the open coded RWSEM with a percpu RWSEM and
    establishes full lockdep coverage that way.

    The bulk of the changes fix up recursive locking issues and address
    the now fully reported potential deadlocks all over the place. Some of
    these deadlocks have been observed in the RT tree, but on mainline the
    probability was low enough to hide them away."

    * 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (37 commits)
    cpu/hotplug: Constify attribute_group structures
    powerpc: Only obtain cpu_hotplug_lock if called by rtasd
    ARM/hw_breakpoint: Fix possible recursive locking for arch_hw_breakpoint_init
    cpu/hotplug: Remove unused check_for_tasks() function
    perf/core: Don't release cred_guard_mutex if not taken
    cpuhotplug: Link lock stacks for hotplug callbacks
    acpi/processor: Prevent cpu hotplug deadlock
    sched: Provide is_percpu_thread() helper
    cpu/hotplug: Convert hotplug locking to percpu rwsem
    s390: Prevent hotplug rwsem recursion
    arm: Prevent hotplug rwsem recursion
    arm64: Prevent cpu hotplug rwsem recursion
    kprobes: Cure hotplug lock ordering issues
    jump_label: Reorder hotplug lock and jump_label_lock
    perf/tracing/cpuhotplug: Fix locking order
    ACPI/processor: Use cpu_hotplug_disable() instead of get_online_cpus()
    PCI: Replace the racy recursion prevention
    PCI: Use cpu_hotplug_disable() instead of get_online_cpus()
    perf/x86/intel: Drop get_online_cpus() in intel_snb_check_microcode()
    x86/perf: Drop EXPORT of perf_check_microcode
    ...

    Linus Torvalds