/usr/share/systemtap/tapset/linux/irq.stp is in systemtap-common 2.9-2ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | /*
* Copyright (C) 2009 IBM Corp.
* This file is part of systemtap, and is free software. You can
* redistribute it and/or modify it under the terms of the GNU General
* Public License (GPL); either version 2, or (at your option) any
* later version.
*
* Version 1.0 prerna@linux.vnet.ibm.com 2009-10-28
*
* Tracepoint based tapset for IRQs, Workqueues, etc
*
*/
// Probes for workqueues.
/**
* probe workqueue.create - Creating a new workqueue
* @wq_thread: task_struct of the workqueue thread
* @cpu: cpu for which the worker thread is created
*/
probe workqueue.create = kernel.trace("workqueue_creation") ?
{
wq_thread = $wq_thread
cpu = $cpu
}
/**
* probe workqueue.insert - Queuing work on a workqueue
* @wq_thread: task_struct of the workqueue thread
* @work: work_struct* being queued
* @work_func: pointer to handler function
*/
probe workqueue.insert = kernel.trace("workqueue_insertion") ?
{
wq_thread = $wq_thread
work = $work
work_func = $work->func
}
/**
* probe workqueue.execute - Executing deferred work
* @wq_thread: task_struct of the workqueue thread
* @work: work_struct* being executed
* @work_func: pointer to handler function
*/
probe workqueue.execute = kernel.trace("workqueue_execution") ?
{
wq_thread = $wq_thread
work = $work
work_func = $work->func
}
/**
* probe workqueue.destroy - Destroying workqueue
* @wq_thread: task_struct of the workqueue thread
*/
probe workqueue.destroy = kernel.trace("workqueue_destruction") ?
{
wq_thread = $wq_thread
}
// Probes for IRQ handlers.
/**
* probe irq_handler.entry - Execution of interrupt handler starting
* @irq: irq number
* @action: struct irqaction* for this interrupt num
* @handler: interrupt handler function
* @flags: Flags for IRQ handler
* @flags_str: symbolic string representation of IRQ flags
* @dev_name: name of device
* @dev_id: Cookie to identify device
* @next_irqaction: pointer to next irqaction for shared interrupts
* @dir: pointer to the proc/irq/NN/name entry
* @thread_fn: interrupt handler function for threaded interrupts
* @thread: thread pointer for threaded interrupts
* @thread_flags: Flags related to thread
*/
probe irq_handler.entry = kernel.trace("irq_handler_entry") ?
{
irq = $irq
// the tracepoint doesn't have the struct definition, so we must @cast
action = & @cast($action, "irqaction", "kernel<linux/interrupt.h>")
handler = action->handler
flags = action->flags
flags_str = irqflags_str(flags)
dev_name = action->name
dev_id = action->dev_id
next_irqaction = action->next
dir = action->dir
thread_fn = action->thread_fn
thread = action->thread
thread_flags = action->thread_flags
}
/**
* probe irq_handler.exit - Execution of interrupt handler completed
* @irq: interrupt number
* @action: struct irqaction*
* @ret: return value of the handler
* @handler: interrupt handler function that was executed
* @flags: flags for IRQ handler
* @flags_str: symbolic string representation of IRQ flags
* @dev_name: name of device
* @dev_id: Cookie to identify device
* @next_irqaction: pointer to next irqaction for shared interrupts
* @dir: pointer to the proc/irq/NN/name entry
* @thread_fn: interrupt handler function for threaded interrupts
* @thread: thread pointer for threaded interrupts
* @thread_flags: Flags related to thread
*/
probe irq_handler.exit = kernel.trace("irq_handler_exit") ?
{
irq = $irq
// the tracepoint doesn't have the struct definition, so we must @cast
action = & @cast($action, "irqaction", "kernel<linux/interrupt.h>")
ret = $ret
handler = action->handler
flags = action->flags
flags_str = irqflags_str(flags)
dev_name = action->name
dev_id = action->dev_id
next_irqaction = action->next
dir = action->dir
thread_fn = action->thread_fn
thread = action->thread
thread_flags = action->thread_flags
}
// Softirq based probes.
/**
* probe softirq.entry - Execution of handler for a pending softirq starting
* @h: struct softirq_action* for current pending softirq
* @vec: softirq_action vector
* @action: pointer to softirq handler just about to execute
* @vec_nr: softirq vector number
*/
probe softirq.entry = kernel.trace("irq_softirq_entry") !,
kernel.trace("softirq_entry") ?
{
# kernels < 2.6.37
h = @choose_defined($h, 0)
vec = @choose_defined($vec, 0)
action = (@defined($h) ? @cast($h,"softirq_action","kernel<linux/interrupt.h>")->action : 0)
# kernels >= 2.6.37
vec_nr = @choose_defined($vec_nr, 0)
}
/**
* probe softirq.exit - Execution of handler for a pending softirq completed
* @h: struct softirq_action* for just executed softirq
* @vec: softirq_action vector
* @action: pointer to softirq handler that just finished execution
* @vec_nr: softirq vector number
*/
probe softirq.exit = kernel.trace("irq_softirq_exit") !,
kernel.trace("softirq_exit") ?
{
# kernels < 2.6.37
h = @choose_defined($h, 0)
vec = @choose_defined($vec, 0)
action = (@defined($h) ? @cast($h,"softirq_action","kernel<linux/interrupt.h>")->action : 0)
# kernels >= 2.6.37
vec_nr = @choose_defined($vec_nr, 0)
}
|