Message ID | 20221007154533.1878285-4-vschneid@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Generic IPI sending tracepoint | expand |
On Fri, 7 Oct 2022 16:45:32 +0100 Valentin Schneider <vschneid@redhat.com> wrote: > } > > +static inline void irq_work_raise(void) > +{ > + if (arch_irq_work_has_interrupt()) > + trace_ipi_send_cpu(_RET_IP_, smp_processor_id()); To save on the branch, let's make the above: if (trace_ipi_send_cpu_enabled() && arch_irq_work_has_interrupt()) As the "trace_*_enabled()" is a static branch that will make it a nop when the tracepoint is not enabled. -- Steve > + > + arch_irq_work_raise(); > +} > + > /* Enqueue on current CPU, work must already be claimed and preempt disabled */
On 08/10/22 15:34, Steven Rostedt wrote: > On Fri, 7 Oct 2022 16:45:32 +0100 > Valentin Schneider <vschneid@redhat.com> wrote: >> } >> >> +static inline void irq_work_raise(void) >> +{ >> + if (arch_irq_work_has_interrupt()) >> + trace_ipi_send_cpu(_RET_IP_, smp_processor_id()); > > To save on the branch, let's make the above: > > if (trace_ipi_send_cpu_enabled() && arch_irq_work_has_interrupt()) > > As the "trace_*_enabled()" is a static branch that will make it a nop > when the tracepoint is not enabled. > Makes sense, thanks for the suggestion. > -- Steve > > >> + >> + arch_irq_work_raise(); >> +} >> + >> /* Enqueue on current CPU, work must already be claimed and preempt disabled */
diff --git a/kernel/irq_work.c b/kernel/irq_work.c index 7afa40fe5cc4..5a550b681878 100644 --- a/kernel/irq_work.c +++ b/kernel/irq_work.c @@ -22,6 +22,8 @@ #include <asm/processor.h> #include <linux/kasan.h> +#include <trace/events/ipi.h> + static DEFINE_PER_CPU(struct llist_head, raised_list); static DEFINE_PER_CPU(struct llist_head, lazy_list); static DEFINE_PER_CPU(struct task_struct *, irq_workd); @@ -74,6 +76,14 @@ void __weak arch_irq_work_raise(void) */ } +static inline void irq_work_raise(void) +{ + if (arch_irq_work_has_interrupt()) + trace_ipi_send_cpu(_RET_IP_, smp_processor_id()); + + arch_irq_work_raise(); +} + /* Enqueue on current CPU, work must already be claimed and preempt disabled */ static void __irq_work_queue_local(struct irq_work *work) { @@ -99,7 +109,7 @@ static void __irq_work_queue_local(struct irq_work *work) /* If the work is "lazy", handle it from next tick if any */ if (!lazy_work || tick_nohz_tick_stopped()) - arch_irq_work_raise(); + irq_work_raise(); } /* Enqueue the irq work @work on the current CPU */
Adding a tracepoint to send_call_function_single_ipi() covers irq_work_queue_on() when the CPU isn't the local one - add a tracepoint to irq_work_raise() to cover the other cases. Signed-off-by: Valentin Schneider <vschneid@redhat.com> --- kernel/irq_work.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)