tracing: Cleanup the convoluted softirq tracepoints
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>
This commit is contained in:
parent
750ed158bf
commit
f4bc6bb2d5
|
@ -410,7 +410,7 @@ extern void open_softirq(int nr, void (*action)(struct softirq_action *));
|
||||||
extern void softirq_init(void);
|
extern void softirq_init(void);
|
||||||
static inline void __raise_softirq_irqoff(unsigned int nr)
|
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);
|
or_softirq_pending(1UL << nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,76 +86,62 @@ TRACE_EVENT(irq_handler_exit,
|
||||||
|
|
||||||
DECLARE_EVENT_CLASS(softirq,
|
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(
|
TP_STRUCT__entry(
|
||||||
__field( int, vec )
|
__field( unsigned int, vec )
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
if (vec)
|
__entry->vec = vec_nr;
|
||||||
__entry->vec = (int)(h - vec);
|
|
||||||
else
|
|
||||||
__entry->vec = (int)(long)h;
|
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk("vec=%d [action=%s]", __entry->vec,
|
TP_printk("vec=%u [action=%s]", __entry->vec,
|
||||||
show_softirq_name(__entry->vec))
|
show_softirq_name(__entry->vec))
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* softirq_entry - called immediately before the softirq handler
|
* softirq_entry - called immediately before the softirq handler
|
||||||
* @h: pointer to struct softirq_action
|
* @vec_nr: softirq vector number
|
||||||
* @vec: pointer to first struct softirq_action in softirq_vec array
|
|
||||||
*
|
*
|
||||||
* The @h parameter, contains a pointer to the struct softirq_action
|
* When used in combination with the softirq_exit tracepoint
|
||||||
* which has a pointer to the action handler that is called. By subtracting
|
* we can determine the softirq handler runtine.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
DEFINE_EVENT(softirq, softirq_entry,
|
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
|
* softirq_exit - called immediately after the softirq handler returns
|
||||||
* @h: pointer to struct softirq_action
|
* @vec_nr: softirq vector number
|
||||||
* @vec: pointer to first struct softirq_action in softirq_vec array
|
|
||||||
*
|
*
|
||||||
* The @h parameter contains a pointer to the struct softirq_action
|
* When used in combination with the softirq_entry tracepoint
|
||||||
* that has handled the softirq. By subtracting the @vec pointer from
|
* we can determine the softirq handler runtine.
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
DEFINE_EVENT(softirq, softirq_exit,
|
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
|
* softirq_raise - called immediately when a softirq is raised
|
||||||
* @h: pointer to struct softirq_action
|
* @vec_nr: softirq vector number
|
||||||
* @vec: pointer to first struct softirq_action in softirq_vec array
|
|
||||||
*
|
*
|
||||||
* The @h parameter contains a pointer to the softirq vector number which is
|
* When used in combination with the softirq_entry tracepoint
|
||||||
* raised. @vec is NULL and it means @h includes vector number not
|
* we can determine the softirq raise to run latency.
|
||||||
* softirq_action. When used in combination with the softirq_entry tracepoint
|
|
||||||
* we can determine the softirq raise latency.
|
|
||||||
*/
|
*/
|
||||||
DEFINE_EVENT(softirq, softirq_raise,
|
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 */
|
#endif /* _TRACE_IRQ_H */
|
||||||
|
|
|
@ -212,18 +212,20 @@ restart:
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (pending & 1) {
|
if (pending & 1) {
|
||||||
|
unsigned int vec_nr = h - softirq_vec;
|
||||||
int prev_count = preempt_count();
|
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);
|
h->action(h);
|
||||||
trace_softirq_exit(h, softirq_vec);
|
trace_softirq_exit(vec_nr);
|
||||||
if (unlikely(prev_count != preempt_count())) {
|
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,"
|
"with preempt_count %08x,"
|
||||||
" exited with %08x?\n", h - softirq_vec,
|
" exited with %08x?\n", vec_nr,
|
||||||
softirq_to_name[h - softirq_vec],
|
softirq_to_name[vec_nr], h->action,
|
||||||
h->action, prev_count, preempt_count());
|
prev_count, preempt_count());
|
||||||
preempt_count() = prev_count;
|
preempt_count() = prev_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue