Index: stap-git-Oct-01/tapset/irq.stp =================================================================== --- /dev/null +++ stap-git-Oct-01/tapset/irq.stp @@ -0,0 +1,160 @@ +/* + * Tracepoint based tapset for IRQs, Workqueues, etc + * + */ +// Probes for workqueues. + +/* probe workqueue.create : probes creation of a new workqueue + * Variables : + * 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 : probes queuing of work on a workqueue + * Variables : + * wq_thread : task_struct of the workqueue thread. + * work : work_struct* being queued. + * work_func : pointer to handler func. + */ +probe workqueue.insert = kernel.trace("workqueue_insertion") +{ + wq_thread = $wq_thread + work = $work + work_func = @cast(work, "work_struct", "kernel")->func +} + +/* probe workqueue.execute : probes execution of deferred work. + * Variables : + * wq_thread : task_struct of the workqueue thread. + * work : work_struct* being executed. + * work_func : pointer to handler func. + */ +probe workqueue.execute = kernel.trace("workqueue_execution") +{ + wq_thread = $wq_thread + work = $work + work_func = @cast(work, "work_struct", "kernel")->func +} + +/* probe workqueue.destroy : probes destruction of each worker thread of each cpu for a workqueue. + * Variables : + * 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 : Fires prior to execution of interrupt handler. + * variables : + * irq : irq number. + * action : struct irqaction* for this interrupt num. + * handler : interrupt handler function. + * flags : + * IRQF_DISABLED [0x00000020] : keep irqs disabled when calling action handler. + * IRQF_SAMPLE_RANDOM [0x00000040] : irq is used to feed the random generator + * IRQF_SHARED [0x00000080] : allow sharing the irq among several devices + * IRQF_PROBE_SHARED [0x00000100] : set by callers when they expect sharing mismatches to occur + * IRQF_TIMER [0x00000200] : Flag to mark this interrupt as timer interrupt + * IRQF_PERCPU [0x00000400] : Interrupt is per cpu. + * IRQF_NOBALANCING [0x00000800] : Flag to exclude this interrupt from irq balancing + * IRQF_IRQPOLL [0x00001000] : Interrupt is used for polling. + * IRQF_ONESHOT [0x00002000] : Interrupt is not reenabled after the hardirq handler finished. + * 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: interupt 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 + action = $action + handler = @cast($action, "irqaction", "kernel")->handler + flags = @cast($action, "irqaction", "kernel")->flags + dev_name = @cast($action, "irqaction", "kernel")->name + dev_id = @cast($action, "irqaction", "kernel")->dev_id + next_irqaction = @cast($action, "irqaction", "kernel")->next + dir = @cast($action, "irqaction", "kernel")->dir + thread_fn = @cast($action, "irqaction", "kernel")->thread_fn + thread = @cast($action, "irqaction", "kernel")->thread + thread_flags = @cast($action, "irqaction", "kernel")->thread_flags +} + +/* probe irq_handler.exit : Fires just after execution of interrupt handler. + * variables : + * irq : interrupt number + * action : struct irqaction* + * ret : return value of the handler + * handler : interrupt handler function that was executed. + * flags : + * IRQF_DISABLED [0x00000020] : keep irqs disabled when calling action handler. + * IRQF_SAMPLE_RANDOM [0x00000040] : irq is used to feed the random generator + * IRQF_SHARED [0x00000080] : allow sharing the irq among several devices + * IRQF_PROBE_SHARED [0x00000100] : set by callers when they expect sharing mismatches to occur + * IRQF_TIMER [0x00000200] : Flag to mark this interrupt as timer interrupt + * IRQF_PERCPU [0x00000400] : Interrupt is per cpu. + * IRQF_NOBALANCING [0x00000800] : Flag to exclude this interrupt from irq balancing + * IRQF_IRQPOLL [0x00001000] : Interrupt is used for polling. + * IRQF_ONESHOT [0x00002000] : Interrupt is not reenabled after the hardirq handler finished. + * 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: interupt 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 + action = $action + ret = $ret + handler = @cast($action, "irqaction", "kernel")->handler + flags = @cast($action, "irqaction", "kernel")->flags + dev_name = @cast($action, "irqaction", "kernel")->name + dev_id = @cast($action, "irqaction", "kernel")->dev_id + next_irqaction = @cast($action, "irqaction", "kernel")->next + dir = @cast($action, "irqaction", "kernel")->dir + thread_fn = @cast($action, "irqaction", "kernel")->thread_fn + thread = @cast($action, "irqaction", "kernel")->thread + thread_flags = @cast($action, "irqaction", "kernel")->thread_flags +} + +// Softirq based probes. +/* probe softirq.entry : triggered just before executing handler for a pending + * softirq + * variables : + * h : struct softirq_action* for current pending softirq. + * vec : softirq_action vector. + * action : pointer to softirq handler just about to execute. + */ +probe softirq.entry = kernel.trace("softirq_entry") +{ + h = $h + vec = $vec + action = @cast($h, "softirq_action", "kernel")->action +} + +/* probe softirq.exit : triggered just after executing handler for a pending + * softirq. + * variables : + * h : struct softirq_action* for just executed softirq. + * vec : softirq_action vector. + * action : pointer to softirq handler that just finished execution. + */ +probe softirq.exit = kernel.trace("softirq_exit") +{ + h = $h + vec = $vec + action = @cast($h, "softirq_action", "kernel")->action +} Index: stap-git-Oct-01/tapset/aux_syscalls.stp =================================================================== --- stap-git-Oct-01.orig/tapset/aux_syscalls.stp +++ stap-git-Oct-01/tapset/aux_syscalls.stp @@ -1831,3 +1831,24 @@ function _struct_sigaction32_u:string(ua } #endif %} + +%{ +#include +static const _stp_val_array const _stp_irq_list[] = { + V(IRQF_DISABLED), + V(IRQF_SAMPLE_RANDOM), + V(IRQF_SHARED), + V(IRQF_PROBE_SHARED), + V(IRQF_TIMER), + V(IRQF_PERCPU), + V(IRQF_NOBALANCING), + V(IRQF_IRQPOLL), + V(IRQF_ONESHOT), + {0, NULL} +}; +%} + +function _irqflags_str:string(f:long) +%{ /* pure */ + _stp_lookup_or_str(_stp_irq_list, THIS->f, THIS->__retvalue, MAXSTRINGLEN); +%}