Skip to content

Commit

Permalink
tracing: Cleanup the convoluted softirq tracepoints
Browse files Browse the repository at this point in the history
With the addition of trace_softirq_raise() the softirq tracepoint got
even more convoluted. Why the tracepoints take two pointers to assign
an integer is beyond my comprehension.

But adding an extra case which treats the first pointer as an unsigned
long when the second pointer is NULL including the back and forth
type casting is just horrible.

Convert the softirq tracepoints to take a single unsigned int argument
for the softirq vector number and fix the call sites.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <alpine.LFD.2.00.1010191428560.6815@localhost6.localdomain6>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Acked-by: mathieu.desnoyers@efficios.com
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Thomas Gleixner committed Oct 21, 2010
1 parent 750ed15 commit f4bc6bb
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 42 deletions.
2 changes: 1 addition & 1 deletion include/linux/interrupt.h
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ extern void open_softirq(int nr, void (*action)(struct softirq_action *));
extern void softirq_init(void);
static inline void __raise_softirq_irqoff(unsigned int nr)
{
trace_softirq_raise((struct softirq_action *)(unsigned long)nr, NULL);
trace_softirq_raise(nr);
or_softirq_pending(1UL << nr);
}

Expand Down
54 changes: 20 additions & 34 deletions include/trace/events/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,76 +86,62 @@ TRACE_EVENT(irq_handler_exit,

DECLARE_EVENT_CLASS(softirq,

TP_PROTO(struct softirq_action *h, struct softirq_action *vec),
TP_PROTO(unsigned int vec_nr),

TP_ARGS(h, vec),
TP_ARGS(vec_nr),

TP_STRUCT__entry(
__field( int, vec )
__field( unsigned int, vec )
),

TP_fast_assign(
if (vec)
__entry->vec = (int)(h - vec);
else
__entry->vec = (int)(long)h;
__entry->vec = vec_nr;
),

TP_printk("vec=%d [action=%s]", __entry->vec,
TP_printk("vec=%u [action=%s]", __entry->vec,
show_softirq_name(__entry->vec))
);

/**
* softirq_entry - called immediately before the softirq handler
* @h: pointer to struct softirq_action
* @vec: pointer to first struct softirq_action in softirq_vec array
* @vec_nr: softirq vector number
*
* The @h parameter, contains a pointer to the struct softirq_action
* which has a pointer to the action handler that is called. By subtracting
* the @vec pointer from the @h pointer, we can determine the softirq
* number. Also, when used in combination with the softirq_exit tracepoint
* we can determine the softirq latency.
* When used in combination with the softirq_exit tracepoint
* we can determine the softirq handler runtine.
*/
DEFINE_EVENT(softirq, softirq_entry,

TP_PROTO(struct softirq_action *h, struct softirq_action *vec),
TP_PROTO(unsigned int vec_nr),

TP_ARGS(h, vec)
TP_ARGS(vec_nr)
);

/**
* softirq_exit - called immediately after the softirq handler returns
* @h: pointer to struct softirq_action
* @vec: pointer to first struct softirq_action in softirq_vec array
* @vec_nr: softirq vector number
*
* The @h parameter contains a pointer to the struct softirq_action
* that has handled the softirq. By subtracting the @vec pointer from
* the @h pointer, we can determine the softirq number. Also, when used in
* combination with the softirq_entry tracepoint we can determine the softirq
* latency.
* When used in combination with the softirq_entry tracepoint
* we can determine the softirq handler runtine.
*/
DEFINE_EVENT(softirq, softirq_exit,

TP_PROTO(struct softirq_action *h, struct softirq_action *vec),
TP_PROTO(unsigned int vec_nr),

TP_ARGS(h, vec)
TP_ARGS(vec_nr)
);

/**
* softirq_raise - called immediately when a softirq is raised
* @h: pointer to struct softirq_action
* @vec: pointer to first struct softirq_action in softirq_vec array
* @vec_nr: softirq vector number
*
* The @h parameter contains a pointer to the softirq vector number which is
* raised. @vec is NULL and it means @h includes vector number not
* softirq_action. When used in combination with the softirq_entry tracepoint
* we can determine the softirq raise latency.
* When used in combination with the softirq_entry tracepoint
* we can determine the softirq raise to run latency.
*/
DEFINE_EVENT(softirq, softirq_raise,

TP_PROTO(struct softirq_action *h, struct softirq_action *vec),
TP_PROTO(unsigned int vec_nr),

TP_ARGS(h, vec)
TP_ARGS(vec_nr)
);

#endif /* _TRACE_IRQ_H */
Expand Down
16 changes: 9 additions & 7 deletions kernel/softirq.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,18 +212,20 @@ asmlinkage void __do_softirq(void)

do {
if (pending & 1) {
unsigned int vec_nr = h - softirq_vec;
int prev_count = preempt_count();
kstat_incr_softirqs_this_cpu(h - softirq_vec);

trace_softirq_entry(h, softirq_vec);
kstat_incr_softirqs_this_cpu(vec_nr);

trace_softirq_entry(vec_nr);
h->action(h);
trace_softirq_exit(h, softirq_vec);
trace_softirq_exit(vec_nr);
if (unlikely(prev_count != preempt_count())) {
printk(KERN_ERR "huh, entered softirq %td %s %p"
printk(KERN_ERR "huh, entered softirq %u %s %p"
"with preempt_count %08x,"
" exited with %08x?\n", h - softirq_vec,
softirq_to_name[h - softirq_vec],
h->action, prev_count, preempt_count());
" exited with %08x?\n", vec_nr,
softirq_to_name[vec_nr], h->action,
prev_count, preempt_count());
preempt_count() = prev_count;
}

Expand Down

0 comments on commit f4bc6bb

Please sign in to comment.