]> xenbits.xensource.com Git - people/jgross/linux.git/commitdiff
trace: Add trace_ipi_send_cpu()
authorPeter Zijlstra <peterz@infradead.org>
Wed, 22 Mar 2023 10:28:36 +0000 (11:28 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Fri, 24 Mar 2023 10:01:29 +0000 (11:01 +0100)
Because copying cpumasks around when targeting a single CPU is a bit
daft...

Tested-and-reviewed-by: Valentin Schneider <vschneid@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20230322103004.GA571242%40hirez.programming.kicks-ass.net
include/linux/smp.h
include/trace/events/ipi.h
kernel/irq_work.c
kernel/sched/core.c
kernel/smp.c

index c036a2228d8d0e3c916db0653806ba7896ab9f7b..ed8f344ba627d27ef0715fe0aa648ba5fba85527 100644 (file)
@@ -130,9 +130,9 @@ extern void arch_smp_send_reschedule(int cpu);
  * scheduler_ipi() is inline so can't be passed as callback reason, but the
  * callsite IP should be sufficient for root-causing IPIs sent from here.
  */
-#define smp_send_reschedule(cpu) ({                              \
-       trace_ipi_send_cpumask(cpumask_of(cpu), _RET_IP_, NULL);  \
-       arch_smp_send_reschedule(cpu);                            \
+#define smp_send_reschedule(cpu) ({              \
+       trace_ipi_send_cpu(cpu, _RET_IP_, NULL);  \
+       arch_smp_send_reschedule(cpu);            \
 })
 
 /*
index b1125dc27682cb53a55938a8eea637b88bf478a8..3de9bfc982cea396b2937f282a14ebe28c25c403 100644 (file)
@@ -35,6 +35,28 @@ TRACE_EVENT(ipi_raise,
        TP_printk("target_mask=%s (%s)", __get_bitmask(target_cpus), __entry->reason)
 );
 
+TRACE_EVENT(ipi_send_cpu,
+
+       TP_PROTO(const unsigned int cpu, unsigned long callsite, void *callback),
+
+       TP_ARGS(cpu, callsite, callback),
+
+       TP_STRUCT__entry(
+               __field(unsigned int, cpu)
+               __field(void *, callsite)
+               __field(void *, callback)
+       ),
+
+       TP_fast_assign(
+               __entry->cpu = cpu;
+               __entry->callsite = (void *)callsite;
+               __entry->callback = callback;
+       ),
+
+       TP_printk("cpu=%u callsite=%pS callback=%pS",
+                 __entry->cpu, __entry->callsite, __entry->callback)
+);
+
 TRACE_EVENT(ipi_send_cpumask,
 
        TP_PROTO(const struct cpumask *cpumask, unsigned long callsite, void *callback),
index c33e88e32a67ad13f55211d6dc439521ced4db52..2f4fb336dda17d173d0a1dcccd81cf9609bd09ce 100644 (file)
@@ -78,10 +78,8 @@ void __weak arch_irq_work_raise(void)
 
 static __always_inline void irq_work_raise(struct irq_work *work)
 {
-       if (trace_ipi_send_cpumask_enabled() && arch_irq_work_has_interrupt())
-               trace_ipi_send_cpumask(cpumask_of(smp_processor_id()),
-                                      _RET_IP_,
-                                      work->func);
+       if (trace_ipi_send_cpu_enabled() && arch_irq_work_has_interrupt())
+               trace_ipi_send_cpu(smp_processor_id(), _RET_IP_, work->func);
 
        arch_irq_work_raise();
 }
index b0a48cfc0a22f814e596bb335ef2aeddcef83ea3..ad40755ddc119888bb63e264dc901d4d964d9edf 100644 (file)
@@ -96,6 +96,7 @@
 #include "../../io_uring/io-wq.h"
 #include "../smpboot.h"
 
+EXPORT_TRACEPOINT_SYMBOL_GPL(ipi_send_cpu);
 EXPORT_TRACEPOINT_SYMBOL_GPL(ipi_send_cpumask);
 
 /*
index 37e9613a08890da66ceee523d2984e5910916448..43f0796ecdb25e3d992a05c512b2c6715dd082b6 100644 (file)
@@ -107,7 +107,7 @@ static __always_inline void
 send_call_function_single_ipi(int cpu, smp_call_func_t func)
 {
        if (call_function_single_prep_ipi(cpu)) {
-               trace_ipi_send_cpumask(cpumask_of(cpu), _RET_IP_, func);
+               trace_ipi_send_cpu(cpu, _RET_IP_, func);
                arch_send_call_function_single_ipi(cpu);
        }
 }
@@ -346,7 +346,7 @@ void __smp_call_single_queue(int cpu, struct llist_node *node)
         * even if we haven't sent the smp_call IPI yet (e.g. the stopper
         * executes migration_cpu_stop() on the remote CPU).
         */
-       if (trace_ipi_send_cpumask_enabled()) {
+       if (trace_ipi_send_cpu_enabled()) {
                call_single_data_t *csd;
                smp_call_func_t func;