Skip to content
  1. Apr 26, 2017
  2. Apr 21, 2017
  3. Apr 19, 2017
    • Steven Rostedt (VMware)'s avatar
      ftrace: Move the probe function into the tracing directory · ec19b859
      Steven Rostedt (VMware) authored
      
      
      As nothing outside the tracing directory uses the function probes mechanism,
      I'm moving the prototypes out of the include/linux/ftrace.h and into the
      local kernel/trace/trace.h header. I plan on making them hook to the
      trace_array structure which is local to kernel/trace, and I do not want to
      expose it to the rest of the kernel. This requires that the probe functions
      must also be local to tracing. But luckily nothing else uses them.
      
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      ec19b859
    • Steven Rostedt (VMware)'s avatar
      selftests: ftrace: Add test to test reading of set_ftrace_file · a9064f67
      Steven Rostedt (VMware) authored
      
      
      The set_ftrace_file lists both functions that are filtered, as well as
      function probes (triggers) that are attached to a function, like traceon or
      stacktrace, etc. The reading of this file is not as trivial as most pseudo
      files are, and there's been various bugs that have appeared in the past
      when there's a mix of probes and functions listed. There's also a difference
      when reading the file using dd with a block size of 1.
      
      This test performs the following:
      
       o Resets set_ftrace_filter
      
       o Makes sure only "#### all functions enabled ####" is listed
      
          (All checks uses cat, and dd with bs=1 and bs=100)
      
       o Adds a traceon trigger to schedule
      
       o Checks if only "#### all function enabled ####" and the trigger is there.
      
       o Adds tracing of schedule
      
       o Checks if only schedule and the trigger is there
      
       o Adds tracing of do_IRQ as well
      
       o Checks if only schedule, do_IRQ and the trigger is there
      
       o Adds a traceon trigger to do_IRQ
      
       o Checks if only schedule, do_IRQ and both triggers are there
      
       o Removes tracing of do_IRQ
      
       o Checks if only schedule and both triggers are there
      
       o Removes tracing of schedule
      
       o Checks if only  "#### all functions enabled ####" and both triggers are there
      
       o Removes the triggers
      
       o Checks if only "#### all functions enabled ####" is there
      
       o Adds tracing of schedule
      
       o Checks if only schedule is there
      
       o Adds tracing of do_IRQ
      
       o Checks if only schedule and do_IRQ are there
      
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      a9064f67
    • Steven Rostedt (VMware)'s avatar
      selftests: ftrace: Add a test to test function triggers to start and stop tracing · d8b39e1d
      Steven Rostedt (VMware) authored
      
      
      This adds a test to test the function tiggers traceon and traceoff to make
      sure that it starts and stops tracing when a function is hit.
      
      The test performs the following:
      
       o Enables all events
      
       o Writes schedule:traceoff into set_ftrace_filter
      
       o Makes sure the tigger exists in the file
      
       o Makes sure the trace file no longer grows
      
       o Makes sure that tracing_on is now zero
      
       o Clears the trace file
      
       o Makes sure it's still empty
      
       o Removes the trigger
      
       o Makes sure tracing is still off (tracing_on is zero)
      
       o Writes schedule:traceon into set_ftrace_filter
      
       o Makes sure the trace file is no longer empty
      
       o Makes sure that tracing_on file is set to one
      
       o Removes the trigger
      
       o Makes sure the trigger is no longer there
      
       o Writes schedule:traceoff:3 into set_ftrace_filter
      
       o Makes sure that tracing_on turns off
      
         . Writes 1 into tracing_on
      
         . Makes sure that it turns off 2 more times
      
       o Writes 1 into tracing_on
      
       o Makes sure that tracing_on is still a one
      
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      d8b39e1d
    • Steven Rostedt (VMware)'s avatar
      selftests: ftrace: Add a selftest to test event enable/disable func trigger · 43bb45da
      Steven Rostedt (VMware) authored
      
      
      This adds a test to enable and disable trace events via the function
      triggers. It tests enabling and disabling the sched:sched_switch event via
      the the event_enable and event_disable function triggers attached to the
      schedule() kernel function.
      
      The test does the following:
      
       o disable all events
      
       o disables or enables the sched_switch event
      
       o writes schedule:event_enable/disable:sched:sched_switch into set_ftrace_filter
      
       o 5 times it checks to make sure:
      
          . Writes 0/1 into the sched_switch/enable
      
          . Checks that the sched_switch/enable goes back to 1/0
      
       o Resets the events
      
       o writes schedule:event_enable/disable:sched:sched_switch:3 into set_ftrace_filter
      
       o Does a loop of 3 to see that sched_switch/enable file gets updated
      
       o Makes sure the sched_switch/enable stops getting updated
      
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      43bb45da
    • Steven Rostedt (VMware)'s avatar
      selftests: ftrace: Add a way to reset triggers in the set_ftrace_filter file · 8e5e19c1
      Steven Rostedt (VMware) authored
      
      
      Just writing into the set_ftrace_filter file does not reset triggers, even
      though it can reset the function list. Triggers require writing the trigger
      name with a "!" prepended. It's worse that it requires the number if the
      trigger has a count associated to it.
      
      Add a reset_ftrace_filter function to the ftrace self tests to allow for the
      tests to have a generic way to clear them. It also resets any functions that
      are listed in that file as well.
      
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      8e5e19c1
  4. Apr 18, 2017
  5. Apr 17, 2017
    • Steven Rostedt (VMware)'s avatar
      ftrace: Fix indexing of t_hash_start() from t_next() · fcdc7125
      Steven Rostedt (VMware) authored
      
      
      t_hash_start() does not increment *pos, where as t_next() must. But when
      t_next() does increment *pos, it must still pass in the original *pos to
      t_hash_start() otherwise it will skip the first instance:
      
       # cd /sys/kernel/debug/tracing
       # echo schedule:traceoff > set_ftrace_filter
       # echo do_IRQ:traceoff > set_ftrace_filter
       # echo call_rcu > set_ftrace_filter
       # cat set_ftrace_filter
      call_rcu
      schedule:traceoff:unlimited
      do_IRQ:traceoff:unlimited
      
      The above called t_hash_start() from t_start() as there was only one
      function (call_rcu), but if we add another function:
      
       # echo xfrm_policy_destroy_rcu >> set_ftrace_filter
       # cat set_ftrace_filter
      call_rcu
      xfrm_policy_destroy_rcu
      do_IRQ:traceoff:unlimited
      
      The "schedule:traceoff" disappears.
      
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      fcdc7125
  6. Apr 16, 2017
    • Steven Rostedt (VMware)'s avatar
      ftrace: Fix removing of second function probe · acceb72e
      Steven Rostedt (VMware) authored
      When two function probes are added to set_ftrace_filter, and then one of
      them is removed, the update to the function locations is not performed, and
      the record keeping of the function states are corrupted, and causes an
      ftrace_bug() to occur.
      
      This is easily reproducable by adding two probes, removing one, and then
      adding it back again.
      
       # cd /sys/kernel/debug/tracing
       # echo schedule:traceoff > set_ftrace_filter
       # echo do_IRQ:traceoff > set_ftrace_filter
       # echo \!do_IRQ:traceoff > /debug/tracing/set_ftrace_filter
       # echo do_IRQ:traceoff > set_ftrace_filter
      
      Causes:
       ------------[ cut here ]------------
       WARNING: CPU: 2 PID: 1098 at kernel/trace/ftrace.c:2369 ftrace_get_addr_curr+0x143/0x220
       Modules linked in: [...]
       CPU: 2 PID: 1098 Comm: bash Not tainted 4.10.0-test+ #405
       Hardware name: Hewlett-Packard HP Compaq Pro 6300 SFF/339A, BIOS K01 v02.05 05/07/2012
       Call Trace:
        dump_stack+0x68/0x9f
        __warn+0x111/0x130
        ? trace_irq_work_interrupt+0xa0/0xa0
        warn_slowpath_null+0x1d/0x20
        ftrace_get_addr_curr+0x143/0x220
        ? __fentry__+0x10/0x10
        ftrace_replace_code+0xe3/0x4f0
        ? ftrace_int3_handler+0x90/0x90
        ? printk+0x99/0xb5
        ? 0xffffffff81000000
        ftrace_modify_all_code+0x97/0x110
        arch_ftrace_update_code+0x10/0x20
        ftrace_run_update_code+0x1c/0x60
        ftrace_run_modify_code.isra.48.constprop.62+0x8e/0xd0
        register_ftrace_function_probe+0x4b6/0x590
        ? ftrace_startup+0x310/0x310
        ? debug_lockdep_rcu_enabled.part.4+0x1a/0x30
        ? update_stack_state+0x88/0x110
        ? ftrace_regex_write.isra.43.part.44+0x1d3/0x320
        ? preempt_count_sub+0x18/0xd0
        ? mutex_lock_nested+0x104/0x800
        ? ftrace_regex_write.isra.43.part.44+0x1d3/0x320
        ? __unwind_start+0x1c0/0x1c0
        ? _mutex_lock_nest_lock+0x800/0x800
        ftrace_trace_probe_callback.isra.3+0xc0/0x130
        ? func_set_flag+0xe0/0xe0
        ? __lock_acquire+0x642/0x1790
        ? __might_fault+0x1e/0x20
        ? trace_get_user+0x398/0x470
        ? strcmp+0x35/0x60
        ftrace_trace_onoff_callback+0x48/0x70
        ftrace_regex_write.isra.43.part.44+0x251/0x320
        ? match_records+0x420/0x420
        ftrace_filter_write+0x2b/0x30
        __vfs_write+0xd7/0x330
        ? do_loop_readv_writev+0x120/0x120
        ? locks_remove_posix+0x90/0x2f0
        ? do_lock_file_wait+0x160/0x160
        ? __lock_is_held+0x93/0x100
        ? rcu_read_lock_sched_held+0x5c/0xb0
        ? preempt_count_sub+0x18/0xd0
        ? __sb_start_write+0x10a/0x230
        ? vfs_write+0x222/0x240
        vfs_write+0xef/0x240
        SyS_write+0xab/0x130
        ? SyS_read+0x130/0x130
        ? trace_hardirqs_on_caller+0x182/0x280
        ? trace_hardirqs_on_thunk+0x1a/0x1c
        entry_SYSCALL_64_fastpath+0x18/0xad
       RIP: 0033:0x7fe61c157c30
       RSP: 002b:00007ffe87890258 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
       RAX: ffffffffffffffda RBX: ffffffff8114a410 RCX: 00007fe61c157c30
       RDX: 0000000000000010 RSI: 000055814798f5e0 RDI: 0000000000000001
       RBP: ffff8800c9027f98 R08: 00007fe61c422740 R09: 00007fe61ca53700
       R10: 0000000000000073 R11: 0000000000000246 R12: 0000558147a36400
       R13: 00007ffe8788f160 R14: 0000000000000024 R15: 00007ffe8788f15c
        ? trace_hardirqs_off_caller+0xc0/0x110
       ---[ end trace 99fa09b3d9869c2c ]---
       Bad trampoline accounting at: ffffffff81cc3b00 (do_IRQ+0x0/0x150)
      
      Cc: stable@vger.kernel.org
      Fixes: 59df055f
      
       ("ftrace: trace different functions with a different tracer")
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      acceb72e
  7. Apr 11, 2017
    • Steven Rostedt (VMware)'s avatar
      tracing: Make sure rcu_irq_enter() can work for trace_*_rcuidle() trace events · d54b6eeb
      Steven Rostedt (VMware) authored
      
      
      Stack tracing discovered that there's a small location inside the RCU
      infrastructure where calling rcu_irq_enter() does not work. As trace events
      use rcu_irq_enter() it must make sure that it is functionable. A check
      against rcu_irq_enter_disabled() is added with a WARN_ON_ONCE() as no trace
      event should ever be used in that part of RCU. If the warning is triggered,
      then the trace event is ignored.
      
      Restructure the __DO_TRACE() a bit to get rid of the prercu and postrcu,
      and just have an rcucheck that does the work from within the _DO_TRACE()
      macro. gcc optimization will compile out the rcucheck=0 case.
      
      Link: http://lkml.kernel.org/r/20170405093207.404f8deb@gandalf.local.home
      
      Acked-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      d54b6eeb
    • Steven Rostedt (VMware)'s avatar
      rcu/tracing: Add rcu_disabled to denote when rcu_irq_enter() will not work · 03ecd3f4
      Steven Rostedt (VMware) authored
      
      
      Tracing uses rcu_irq_enter() as a way to make sure that RCU is watching when
      it needs to use rcu_read_lock() and friends. This is because tracing can
      happen as RCU is about to enter user space, or about to go idle, and RCU
      does not watch for RCU read side critical sections as it makes the
      transition.
      
      There is a small location within the RCU infrastructure that rcu_irq_enter()
      itself will not work. If tracing were to occur in that section it will break
      if it tries to use rcu_irq_enter().
      
      Originally, this happens with the stack_tracer, because it will call
      save_stack_trace when it encounters stack usage that is greater than any
      stack usage it had encountered previously. There was a case where that
      happened in the RCU section where rcu_irq_enter() did not work, and lockdep
      complained loudly about it. To fix it, stack tracing added a call to be
      disabled and RCU would disable stack tracing during the critical section
      that rcu_irq_enter() was inoperable. This solution worked, but there are
      other cases that use rcu_irq_enter() and it would be a good idea to let RCU
      give a way to let others know that rcu_irq_enter() will not work. For
      example, in trace events.
      
      Another helpful aspect of this change is that it also moves the per cpu
      variable called in the RCU critical section into a cache locale along with
      other RCU per cpu variables used in that same location.
      
      I'm keeping the stack_trace_disable() code, as that still could be used in
      the future by places that really need to disable it. And since it's only a
      static inline, it wont take up any kernel text if it is not used.
      
      Link: http://lkml.kernel.org/r/20170405093207.404f8deb@gandalf.local.home
      
      Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      03ecd3f4
    • Paul E. McKenney's avatar
      rcu: Fix dyntick-idle tracing · a278d471
      Paul E. McKenney authored
      
      
      The tracing subsystem started using rcu_irq_entry() and rcu_irq_exit()
      (with my blessing) to allow the current _rcuidle alternative tracepoint
      name to be dispensed with while still maintaining good performance.
      Unfortunately, this causes RCU's dyntick-idle entry code's tracing to
      appear to RCU like an interrupt that occurs where RCU is not designed
      to handle interrupts.
      
      This commit fixes this problem by moving the zeroing of ->dynticks_nesting
      after the offending trace_rcu_dyntick() statement, which narrows the
      window of vulnerability to a pair of adjacent statements that are now
      marked with comments to that effect.
      
      Link: http://lkml.kernel.org/r/20170405093207.404f8deb@gandalf.local.home
      Link: http://lkml.kernel.org/r/20170405193928.GM1600@linux.vnet.ibm.com
      
      Reported-by: default avatarSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      a278d471
    • Steven Rostedt (VMware)'s avatar
      tracing: Rename trace_active to disable_stack_tracer and inline its modification · 8aaf1ee7
      Steven Rostedt (VMware) authored
      
      
      In order to eliminate a function call, make "trace_active" into
      "disable_stack_tracer" and convert stack_tracer_disable() and friends into
      static inline functions.
      
      Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      8aaf1ee7
    • Steven Rostedt (VMware)'s avatar
      tracing: Add stack_tracer_disable/enable() functions · 5367278c
      Steven Rostedt (VMware) authored
      
      
      There are certain parts of the kernel that cannot let stack tracing
      proceed (namely in RCU), because the stack tracer uses RCU, and parts of RCU
      internals cannot handle having RCU read side locks taken.
      
      Add stack_tracer_disable() and stack_tracer_enable() functions to let RCU
      stop stack tracing on the current CPU when it is in those critical sections.
      
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      5367278c
    • Steven Rostedt (VMware)'s avatar
      tracing: Replace the per_cpu() with __this_cpu*() in trace_stack.c · 252babcd
      Steven Rostedt (VMware) authored
      
      
      The updates to the trace_active per cpu variable can be updated with the
      __this_cpu_*() functions as it only gets updated on the CPU that the variable
      is on.
      
      Thanks to Paul McKenney for suggesting __this_cpu_* instead of this_cpu_*.
      
      Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      252babcd