diff options
author | Prerna Saxena <prerna@linux.vnet.ibm.com> | 2009-11-09 11:36:11 +0530 |
---|---|---|
committer | Prerna Saxena <prerna@linux.vnet.ibm.com> | 2009-11-09 11:36:11 +0530 |
commit | a476086d1ef0448c86e466f5955f78d282b473fd (patch) | |
tree | c2e4c6752c451de3b1137da53b5095ba664bfaef /tapset/irq.stp | |
parent | fafeaf8e5874e6855343421b5dd91403fc49c991 (diff) | |
download | systemtap-steved-a476086d1ef0448c86e466f5955f78d282b473fd.tar.gz systemtap-steved-a476086d1ef0448c86e466f5955f78d282b473fd.tar.xz systemtap-steved-a476086d1ef0448c86e466f5955f78d282b473fd.zip |
IRQ tapset, sample script, testsuite, man page updates, etc
Diffstat (limited to 'tapset/irq.stp')
-rw-r--r-- | tapset/irq.stp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/tapset/irq.stp b/tapset/irq.stp new file mode 100644 index 00000000..6a9b9147 --- /dev/null +++ b/tapset/irq.stp @@ -0,0 +1,172 @@ +/* + * 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 : probes creation of 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 : probes queuing of work on a workqueue + * @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 = $work->func +} + +/** + * probe workqueue.execute : probes execution of deferred work. + * @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 = $work->func +} + +/** + * probe workqueue.destroy : probes destruction of each worker thread of each cpu for a 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 : Fires prior to execution of interrupt handler. + * @irq : irq number. + * @action : struct irqaction* for this interrupt num. + * @handler : interrupt handler function. + * @flags : Flags for IRQ handler + * 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. + * @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 : 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 = $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 : Fires just after execution of interrupt handler. + * @irq : interrupt number + * @action : struct irqaction* + * @ret : return value of the handler + * @handler : interrupt handler function that was executed. + * @flags : flags for IRQ handler + * 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. + * @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 : 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 = $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 : triggered just before executing handler + * for a pending softirq. + * @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 = $h->action +} + +/** + * probe softirq.exit : triggered just after executing handler for a pending + * softirq. + * @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 = $h->action +} |