1. 14 10月, 2008 40 次提交
    • P
      x86 mmiotrace: implement mmiotrace_printk() · 9e57fb35
      Pekka Paalanen 提交于
      Offer mmiotrace users a function to inject markers from inside the kernel.
      This depends on the trace_vprintk() patch.
      Signed-off-by: NPekka Paalanen <pq@iki.fi>
      Acked-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      9e57fb35
    • P
      ftrace: add trace_vprintk() · 801fe400
      Pekka Paalanen 提交于
      trace_vprintk() for easier implementation of tracer specific *_printk
      functions. Add check check for no_tracer, and implement
      __ftrace_printk() as a wrapper.
      Signed-off-by: NPekka Paalanen <pq@iki.fi>
      Acked-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      801fe400
    • P
      ftrace: move mmiotrace functions out of trace.c · 45dcd8b8
      Pekka Paalanen 提交于
      Moves the mmiotrace specific functions from trace.c to
      trace_mmiotrace.c. Functions trace_wake_up(), tracing_get_trace_entry(),
      and tracing_generic_entry_update() are therefore made available outside
      trace.c.
      Signed-off-by: NPekka Paalanen <pq@iki.fi>
      Acked-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      45dcd8b8
    • P
      x86 mmiotrace: fix a rare memory leak · bbe5c783
      Pekka Paalanen 提交于
      Signed-off-by: NPekka Paalanen <pq@iki.fi>
      Acked-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      bbe5c783
    • S
      ftrace: fix unlocking of hash · 644f991d
      Steven Rostedt 提交于
      This must be brown paper bag week for Steven Rostedt!
      
      While working on ftrace for PPC, I discovered that the hash locking done
      when CONFIG_FTRACE_MCOUNT_RECORD is not set, is totally incorrect.
      
      With a cut and paste error, I had the hash lock macro to lock for both
      hash_lock _and_ hash_unlock!
      
      This bug did not affect x86 since this bug was introduced when
      CONFIG_FTRACE_MCOUNT_RECORD was added to x86.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      644f991d
    • S
      ftrace: use ftrace_release for all dynamic ftrace functions · c0719e5a
      Steven Rostedt 提交于
      ftrace_release is necessary for all uses of dynamic ftrace and not just
      the archs that have CONFIG_FTRACE_MCOUNT_RECORD defined.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      c0719e5a
    • I
      ftrace: make it depend on DEBUG_KERNEL · d3ee6d99
      Ingo Molnar 提交于
      make most of the tracers depend on DEBUG_KERNEL - that's their intended
      purpose. (most distributions have DEBUG_KERNEL enabled anyway so this is
      not a practical limitation - but it simplifies the tracing menu in the
      normal case)
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      d3ee6d99
    • P
      ftrace: sched_switch: show the wakee's cpu · 80b5e940
      Peter Zijlstra 提交于
      While profiling the smp behaviour of the scheduler it was needed to know to
      which cpu a task got woken.
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      80b5e940
    • P
      ftrace: make ftrace_printk usable with the other tracers · f09ce573
      Peter Zijlstra 提交于
      Currently ftrace_printk only works with the ftrace tracer, switch it to an
      iter_ctrl setting so we can make us of them with other tracers too.
      
      [rostedt@redhat.com: tweak to the disable condition]
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      f09ce573
    • S
      ftrace: print continue index fix · 5a90f577
      Steven Rostedt 提交于
      An item in the trace buffer that is bigger than one entry may be split
      up using the TRACE_CONT entry. This makes it a virtual single entry.
      The current code increments the iterator index even while traversing
      TRACE_CONT entries, making it look like the iterator is further than
      it actually is.
      
      This patch adds code to not increment the iterator index while skipping
      over TRACE_CONT entries.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Acked-by: NPeter Zijlstra <peterz@infradead.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      5a90f577
    • S
      ftrace: binary and not logical for continue test · 652567aa
      Steven Rostedt 提交于
      Peter Zijlstra provided me with a nice brown paper bag while letting me know
      that I was doing a logical AND and not a binary one, making a condition
      true more often than it should be.
      
      Luckily, a false true is handled by the calling function and no harm is
      done. But this needs to be fixed regardless.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Acked-by: NPeter Zijlstra <peterz@infradead.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      652567aa
    • M
      ftrace: make output nicely spaced for up to 999 cpus · a6168353
      Michael Ellerman 提交于
      Currently some of the ftrace output goes skewiff if you have more
      than 9 cpus, and some if you have more than 99.
      
      Twiddle with the headers and format strings to make up to 999 cpus
      display without causing spacing problems.
      Signed-off-by: NMichael Ellerman <michael@ellerman.id.au>
      Acked-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      a6168353
    • I
      stack tracer: depends on DEBUG_KERNEL · 2ff01c6a
      Ingo Molnar 提交于
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      2ff01c6a
    • S
      ftrace: stack trace add indexes · 1b6cced6
      Steven Rostedt 提交于
      This patch adds indexes into the stack that the functions in the
      stack dump were found at. As an added bonus, I also added a diff
      to show which function is the most notorious consumer of the stack.
      
      The output now looks like this:
      
      # cat /debug/tracing/stack_trace
              Depth   Size      Location    (48 entries)
              -----   ----      --------
        0)     2476     212   blk_recount_segments+0x39/0x59
        1)     2264      12   bio_phys_segments+0x16/0x1d
        2)     2252      20   blk_rq_bio_prep+0x23/0xaf
        3)     2232      12   init_request_from_bio+0x74/0x77
        4)     2220      56   __make_request+0x294/0x331
        5)     2164     136   generic_make_request+0x34f/0x37d
        6)     2028      56   submit_bio+0xe7/0xef
        7)     1972      28   submit_bh+0xd1/0xf0
        8)     1944     112   block_read_full_page+0x299/0x2a9
        9)     1832       8   blkdev_readpage+0x14/0x16
       10)     1824      28   read_cache_page_async+0x7e/0x109
       11)     1796      16   read_cache_page+0x11/0x49
       12)     1780      32   read_dev_sector+0x3c/0x72
       13)     1748      48   read_lba+0x4d/0xaa
       14)     1700     168   efi_partition+0x85/0x61b
       15)     1532      72   rescan_partitions+0x10e/0x266
       16)     1460      40   do_open+0x1c7/0x24e
       17)     1420     292   __blkdev_get+0x79/0x84
       18)     1128      12   blkdev_get+0x12/0x14
       19)     1116      20   register_disk+0xd1/0x11e
       20)     1096      28   add_disk+0x34/0x90
       21)     1068      52   sd_probe+0x2b1/0x366
       22)     1016      20   driver_probe_device+0xa5/0x120
       23)      996       8   __device_attach+0xd/0xf
       24)      988      32   bus_for_each_drv+0x3e/0x68
       25)      956      24   device_attach+0x56/0x6c
       26)      932      16   bus_attach_device+0x26/0x4d
       27)      916      64   device_add+0x380/0x4b4
       28)      852      28   scsi_sysfs_add_sdev+0xa1/0x1c9
       29)      824     160   scsi_probe_and_add_lun+0x919/0xa2a
       30)      664      36   __scsi_add_device+0x88/0xae
       31)      628      44   ata_scsi_scan_host+0x9e/0x21c
       32)      584      28   ata_host_register+0x1cb/0x1db
       33)      556      24   ata_host_activate+0x98/0xb5
       34)      532     192   ahci_init_one+0x9bd/0x9e9
       35)      340      20   pci_device_probe+0x3e/0x5e
       36)      320      20   driver_probe_device+0xa5/0x120
       37)      300      20   __driver_attach+0x3f/0x5e
       38)      280      36   bus_for_each_dev+0x40/0x62
       39)      244      12   driver_attach+0x19/0x1b
       40)      232      28   bus_add_driver+0x9c/0x1af
       41)      204      28   driver_register+0x76/0xd2
       42)      176      20   __pci_register_driver+0x44/0x71
       43)      156       8   ahci_init+0x14/0x16
       44)      148     100   _stext+0x42/0x122
       45)       48      20   kernel_init+0x175/0x1dc
       46)       28      28   kernel_thread_helper+0x7/0x10
      
      The first column is simply an index starting from the inner most function
      and counting down to the outer most.
      
      The next column is the location that the function was found on the stack.
      
      The next column is the size of the stack for that function.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      1b6cced6
    • S
      ftrace: remove warning of old objcopy and local functions · d53475b5
      Steven Rostedt 提交于
      The warning messages about old objcopy and local functions spam the
      user quite drastically.  Remove the warning until we can find a nicer
      way of tell the user to upgrade their objcopy.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Cc: Stephen Rothwell <sfr@canb.auug.org.au>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      d53475b5
    • S
      ftrace: remove direct reference to mcount in trace code · 3b47bfc1
      Steven Rostedt 提交于
      The mcount record method of ftrace scans objdump for references to mcount.
      Using mcount as the reference to test if the calls to mcount being replaced
      are indeed calls to mcount, this use of mcount was also caught as a
      location to change. Using a variable that points to the mcount address
      moves this reference into the data section that is not scanned, and
      we do not use a false location to try and modify.
      
      The warn on code was what was used to detect this bug.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      3b47bfc1
    • S
      ftrace: add stack tracer · e5a81b62
      Steven Rostedt 提交于
      This is another tracer using the ftrace infrastructure, that examines
      at each function call the size of the stack. If the stack use is greater
      than the previous max it is recorded.
      
      You can always see (and set) the max stack size seen. By setting it
      to zero will start the recording again. The backtrace is also available.
      
      For example:
      
      # cat /debug/tracing/stack_max_size
      1856
      
      # cat /debug/tracing/stack_trace
      [<c027764d>] stack_trace_call+0x8f/0x101
      [<c021b966>] ftrace_call+0x5/0x8
      [<c02553cc>] clocksource_get_next+0x12/0x48
      [<c02542a5>] update_wall_time+0x538/0x6d1
      [<c0245913>] do_timer+0x23/0xb0
      [<c0257657>] tick_do_update_jiffies64+0xd9/0xf1
      [<c02576b9>] tick_sched_timer+0x4a/0xad
      [<c0250fe6>] __run_hrtimer+0x3e/0x75
      [<c02518ed>] hrtimer_interrupt+0xf1/0x154
      [<c022c870>] smp_apic_timer_interrupt+0x71/0x84
      [<c021b7e9>] apic_timer_interrupt+0x2d/0x34
      [<c0238597>] finish_task_switch+0x29/0xa0
      [<c05abd13>] schedule+0x765/0x7be
      [<c05abfca>] schedule_timeout+0x1b/0x90
      [<c05ab4d4>] wait_for_common+0xab/0x101
      [<c05ab5ac>] wait_for_completion+0x12/0x14
      [<c033cfc3>] blk_execute_rq+0x84/0x99
      [<c0402470>] scsi_execute+0xc2/0x105
      [<c040250a>] scsi_execute_req+0x57/0x7f
      [<c043afe0>] sr_test_unit_ready+0x3e/0x97
      [<c043bbd6>] sr_media_change+0x43/0x205
      [<c046b59f>] media_changed+0x48/0x77
      [<c046b5ff>] cdrom_media_changed+0x31/0x37
      [<c043b091>] sr_block_media_changed+0x16/0x18
      [<c02b9e69>] check_disk_change+0x1b/0x63
      [<c046f4c3>] cdrom_open+0x7a1/0x806
      [<c043b148>] sr_block_open+0x78/0x8d
      [<c02ba4c0>] do_open+0x90/0x257
      [<c02ba869>] blkdev_open+0x2d/0x56
      [<c0296a1f>] __dentry_open+0x14d/0x23c
      [<c0296b32>] nameidata_to_filp+0x24/0x38
      [<c02a1c68>] do_filp_open+0x347/0x626
      [<c02967ef>] do_sys_open+0x47/0xbc
      [<c02968b0>] sys_open+0x23/0x2b
      [<c021aadd>] sysenter_do_call+0x12/0x26
      
      I've tested this on both x86_64 and i386.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      e5a81b62
    • A
      kbuild: ftrace: don't assume that scripts/recordmcount.pl is executable · b3a32041
      Andrew Morton 提交于
      CHK     include/linux/version.h
        CHK     include/linux/utsrelease.h
        CC      scripts/mod/empty.o
      /bin/sh: /usr/src/25/scripts/recordmcount.pl: Permission denied
      
      We shouldn't assume that files have their `x' bits set.  There are various
      ways in which file permissions get lost, including use of patch(1).
      
      It might not be correct to assume that perl lives in $PATH?
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      b3a32041
    • S
      ftrace: objcopy version test for local symbols · f2f8458e
      Steven Rostedt 提交于
      The --globalize-symbols option came out in objcopy version 2.17.
      If the kernel is being compiled on a system with a lower version of
      objcopy, then we can not use the globalize / localize trick to
      link to symbols pointing to local functions.
      
      This patch tests the version of objcopy and will only use the trick
      if the version is greater than or equal to 2.17. Otherwise, if an
      object has only local functions within a section, it will give a
      nice warning and recommend the user to upgrade their objcopy.
      
      Leaving the symbols unrecorded is not that big of a deal, since the
      mcount record method changes the actual mcount code to be a simple
      "ret" without recording registers or anything.
      Reported-by: NStephen Rothwell <sfr@canb.auug.org.au>
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      f2f8458e
    • I
      ftrace: clean up macro usage · ac8825ec
      Ingo Molnar 提交于
      enclose the argument in parenthesis. (especially since we cast it,
      which is a high prio operation)
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      ac8825ec
    • S
      ftrace: fix build failure · 2d7da80f
      Stephen Rothwell 提交于
      After disabling FTRACE_MCOUNT_RECORD via a patch, a dormant build
      failure surfaced:
      
       kernel/trace/ftrace.c: In function 'ftrace_record_ip':
       kernel/trace/ftrace.c:416: error: incompatible type for argument 1 of '_spin_lock_irqsave'
       kernel/trace/ftrace.c:433: error: incompatible type for argument 1 of '_spin_lock_irqsave'
      
      Introduced by commit 6dad8e07f4c10b17b038e84d29f3ca41c2e55cd0 ("ftrace:
      add necessary locking for ftrace records").
      Signed-off-by: NStephen Rothwell <sfr@canb.auug.org.au>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      2d7da80f
    • S
      ftrace: x86 use copy to and from user functions · 6f93fc07
      Steven Rostedt 提交于
      The modification of code is performed either by kstop_machine, before
      SMP starts, or on module code before the module is executed. There is
      no reason to do the modifications from assembly. The copy to and from
      user functions are sufficient and produces cleaner and easier to read
      code.
      
      Thanks to Benjamin Herrenschmidt for suggesting the idea.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      6f93fc07
    • S
      ftrace: handle weak symbol functions · 8feff1ca
      Steven Rostedt 提交于
      During tests and checks, I've discovered that there were failures to
      convert mcount callers into nops. Looking deeper into these failures,
      code that was attempted to be changed was not an mcount caller.
      The current code only updates if the code being changed is what it expects,
      but I still investigate any time there is a failure.
      
      What was happening is that a weak symbol was being used as a reference
      for other mcount callers. That weak symbol was also referenced elsewhere
      so the offsets were using the strong symbol and not the function symbol
      that it was referenced from.
      
      This patch changes the setting up of the mcount_loc section to search
      for a global function that is not weak. It will pick a local over a weak
      but if only a weak is found in a section, a warning is printed and the
      mcount location is not recorded (just to be safe).
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      8feff1ca
    • S
      ftrace: update recordmount.pl arch changes · d74fcd1e
      Steven Rostedt 提交于
      I'm trying to keep all the arch changes in recordmcount.pl in one place.
      I moved your code into that area, by adding the flags to the commands
      that were passed in.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      d74fcd1e
    • J
      ftrace: fix build problem with CONFIG_FTRACE · 6a4917e3
      Jeremy Fitzhardinge 提交于
      I'm seeing when I use separate src/build dirs:
      
      make[3]: *** [arch/x86/kernel/time_32.o] Error 1
      /bin/sh: scripts/recordmcount.pl: No such file or directory
      make[3]: *** [arch/x86/kernel/irq_32.o] Error 1
      /bin/sh: scripts/recordmcount.pl: No such file or directory
      make[3]: *** [arch/x86/kernel/ldt.o] Error 1
      /bin/sh: scripts/recordmcount.pl: No such file or directory
      make[3]: *** [arch/x86/kernel/i8259.o] Error 1
      /bin/sh: scripts/recordmcount.pl: No such file or directory
      
      This fixes it.
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      6a4917e3
    • H
      ftrace: fix incorrect comment style of __ftrace_enabled_save() · 37002735
      Huang Ying 提交于
      This patch fixes incorrect comment style of __ftrace_enabled_save().
      Signed-off-by: NHuang Ying <ying.huang@intel.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      37002735
    • S
      ftrace: add necessary locking for ftrace records · 99ecdc43
      Steven Rostedt 提交于
      The new design of pre-recorded mcounts and updating the code outside of
      kstop_machine has changed the way the records themselves are protected.
      
      This patch uses the ftrace_lock to protect the records. Note, the lock
      still does not need to be taken within calls that are only called via
      kstop_machine, since the that code can not run while the spin lock is held.
      
      Also removed the hash_lock needed for the daemon when MCOUNT_RECORD is
      configured. Also did a slight cleanup of an unused variable.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      99ecdc43
    • S
      ftrace: do not init module on ftrace disabled · 00fd61ae
      Steven Rostedt 提交于
      If one of the self tests of ftrace has disabled the function tracer,
      do not run the code to convert the mcount calls in modules.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      00fd61ae
    • F
      ftrace: fix some mistakes in error messages · 98a983aa
      Frédéric Weisbecker 提交于
      This patch fixes some mistakes on the tracer in warning messages when
      debugfs fails to create tracing files.
      Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
      Cc: srostedt@redhat.com
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      98a983aa
    • I
      ftrace: scripts/recordmcount.pl cross-build hack · 3989cce8
      Ingo Molnar 提交于
      hack around:
      
       ld: Relocatable linking with relocations from format elf32-i386 (init/.tmp_gl_calibrate.o) to format elf64-x86-64 (init/.tmp_mx_calibrate.o) i  CC      arch/x86/mm/extable.o
       objcopy: 'init/.tmp_mx_calibrate.o': No such file
       rm: cannot remove `init/.tmp_mx_calibrate.o': No such file or directory
       ld: Relocatable linking with relocations from format elf32-i386 (arch/x86/mm/extable.o) to format elf64-x86-64 (arch/x86/mm/.tmp_mx_extable.o) is not supported
       mv: cannot stat `arch/x86/mm/.tmp_mx_extable.o': No such file or directory
       ld: Relocatable linking with relocations from format elf32-i386 (arch/x86/mm/fault.o) to format elf64-x86-64 (arch/x86/mm/.tmp_mx_fault.o) is not supported
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      3989cce8
    • I
      ftrace: ftrace_kill_atomic() build fix · c5131ad6
      Ingo Molnar 提交于
      fix:
      
       kernel/built-in.o: In function `ftrace_dump':
       (.text+0x2e2ea): undefined reference to `ftrace_kill_atomic'
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      c5131ad6
    • I
      ftrace: build fix · 7b928c23
      Ingo Molnar 提交于
      fix:
      
       In file included from init/main.c:65:
       include/linux/ftrace.h:166: error: expected ‘,' or ‘;' before ‘{' token
       make[1]: *** [init/main.o] Error 1
       make: *** [init/main.o] Error 2
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      7b928c23
    • S
      ftrace: dump out ftrace buffers to console on panic · 3f5a54e3
      Steven Rostedt 提交于
      At OLS I had a lot of interest to be able to have the ftrace buffers
      dumped on panic.  Usually one would expect to uses kexec and examine
      the buffers after a new kernel is loaded. But sometimes the resources
      do not permit kdump and kexec, so having an option to still see the
      sequence of events up to the crash is very advantageous.
      
      This patch adds the option to have the ftrace buffers dumped to the
      console in the latency_trace format on a panic. When the option is set,
      the default entries per CPU buffer are lowered to 16384, since the writing
      to the serial (if that is the console) may take an awful long time
      otherwise.
      
      [
       Changes since -v1:
        Got alpine to send correctly (as well as spell check working).
        Removed config option.
        Moved the static variables into ftrace_dump itself.
        Gave printk a log level.
      ]
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      3f5a54e3
    • S
      ftrace: ftrace_printk doc moved · 2f2c99db
      Steven Rostedt 提交于
      Based on Randy Dunlap's suggestion, the ftrace_printk kernel-doc belongs
      with the ftrace_printk macro that should be used. Not with the
      __ftrace_printk internal function.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Acked-by: NRandy Dunlap <randy.dunlap@oracle.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      2f2c99db
    • S
      ftrace: printk formatting infrastructure · dd0e545f
      Steven Rostedt 提交于
      This patch adds a feature that can help kernel developers debug their
      code using ftrace.
      
        int ftrace_printk(const char *fmt, ...);
      
      This records into the ftrace buffer using printf formatting. The entry
      size in the buffers are still a fixed length. A new type has been added
      that allows for more entries to be used for a single recording.
      
      The start of the print is still the same as the other entries.
      
      It returns the number of characters written to the ftrace buffer.
      
      For example:
      
      Having a module with the following code:
      
      static int __init ftrace_print_test(void)
      {
              ftrace_printk("jiffies are %ld\n", jiffies);
              return 0;
      }
      
      Gives me:
      
        insmod-5441  3...1 7569us : ftrace_print_test: jiffies are 4296626666
      
      for the latency_trace file and:
      
                insmod-5441  [03]  1959.370498: ftrace_print_test jiffies are 4296626666
      
      for the trace file.
      
      Note: Only the infrastructure should go into the kernel. It is to help
      facilitate debugging for other kernel developers. Calls to ftrace_printk
      is not intended to be left in the kernel, and should be frowned upon just
      like scattering printks around in the code.
      
      But having this easily at your fingertips helps the debugging go faster
      and bugs be solved quicker.
      
      Maybe later on, we can hook this with markers and have their printf format
      be sucked into ftrace output.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      dd0e545f
    • S
      ftrace: new continue entry - separate out from trace_entry · 2e2ca155
      Steven Rostedt 提交于
      Some tracers will need to work with more than one entry. In order to do this
      the trace_entry structure was split into two fields. One for the start of
      all entries, and one to continue an existing entry.
      
      The trace_entry structure now has a "field" entry that consists of the previous
      content of the trace_entry, and a "cont" entry that is just a string buffer
      the size of the "field" entry.
      
      Thanks to Andrew Morton for suggesting this idea.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      2e2ca155
    • S
      ftrace: remove old pointers to mcount · fed1939c
      Steven Rostedt 提交于
      When a mcount pointer is recorded into a table, it is used to add or
      remove calls to mcount (replacing them with nops). If the code is removed
      via removing a module, the pointers still exist.  At modifying the code
      a check is always made to make sure the code being replaced is the code
      expected. In-other-words, the code being replaced is compared to what
      it is expected to be before being replaced.
      
      There is a very small chance that the code being replaced just happens
      to look like code that calls mcount (very small since the call to mcount
      is relative). To remove this chance, this patch adds ftrace_release to
      allow module unloading to remove the pointers to mcount within the module.
      
      Another change for init calls is made to not trace calls marked with
      __init. The tracing can not be started until after init is done anyway.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      fed1939c
    • S
      ftrace: move notrace to compiler.h · 28614889
      Steven Rostedt 提交于
      The notrace define belongs in compiler.h so that it can be used in
      init.h
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      28614889
    • S
      ftrace: do not show freed records in available_filter_functions · a9fdda33
      Steven Rostedt 提交于
      Seems that freed records can appear in the available_filter_functions list.
      This patch fixes that.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      a9fdda33
    • S
      ftrace: use only 5 byte nops for x86 · 732f3ca7
      Steven Rostedt 提交于
      Mathieu Desnoyers revealed a bug in the original code. The nop that is
      used to relpace the mcount caller can be a two part nop. This runs the
      risk where a process can be preempted after executing the first nop, but
      before the second part of the nop.
      
      The ftrace code calls kstop_machine to keep multiple CPUs from executing
      code that is being modified, but it does not protect against a task preempting
      in the middle of a two part nop.
      
      If the above preemption happens and the tracer is enabled, after the
      kstop_machine runs, all those nops will be calls to the trace function.
      If the preempted process that was preempted between the two nops is executed
      again, it will execute half of the call to the trace function, and this
      might crash the system.
      
      This patch instead uses what both the latest Intel and AMD spec suggests.
      That is the P6_NOP5 sequence of "0x0f 0x1f 0x44 0x00 0x00".
      
      Note, some older CPUs and QEMU might fault on this nop, so this nop
      is executed with fault handling first. If it detects a fault, it will then
      use the code "0x66 0x66 0x66 0x66 0x90". If that faults, it will then
      default to a simple "jmp 1f; .byte 0x00 0x00 0x00; 1:". The jmp is
      not optimal but will do if the first two can not be executed.
      
      TODO: Examine the cpuid to determine the nop to use.
      Signed-off-by: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      732f3ca7