Message ID | 20221202155817.2102944-4-vschneid@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Generic IPI sending tracepoint | expand |
* Valentin Schneider <vschneid@redhat.com> wrote: > send_call_function_single_ipi() is the thing that sends IPIs at the bottom > of smp_call_function*() via either generic_exec_single() or > smp_call_function_many_cond(). Give it an IPI-related tracepoint. > > Note that this ends up tracing any IPI sent via __smp_call_single_queue(), > which covers __ttwu_queue_wakelist() and irq_work_queue_on() "for free". > > Signed-off-by: Valentin Schneider <vschneid@redhat.com> > Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> Acked-by: Ingo Molnar <mingo@kernel.org> Patch series logistics: - No objections from the scheduler side, this feature looks pretty useful. - Certain patches are incomplete, others are noted as being merged separately, so I presume you'll send an updated/completed series eventually? - We can merge this via the scheduler tree I suspect, as most callbacks affected relate to tip:sched/core and tmp:smp/core - but if you have some other preferred tree that's fine too. Thanks, Ingo
On 07/01/23 12:04, Ingo Molnar wrote: > * Valentin Schneider <vschneid@redhat.com> wrote: > >> send_call_function_single_ipi() is the thing that sends IPIs at the bottom >> of smp_call_function*() via either generic_exec_single() or >> smp_call_function_many_cond(). Give it an IPI-related tracepoint. >> >> Note that this ends up tracing any IPI sent via __smp_call_single_queue(), >> which covers __ttwu_queue_wakelist() and irq_work_queue_on() "for free". >> >> Signed-off-by: Valentin Schneider <vschneid@redhat.com> >> Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> > > Acked-by: Ingo Molnar <mingo@kernel.org> > > Patch series logistics: > > - No objections from the scheduler side, this feature looks pretty useful. > Thanks! > - Certain patches are incomplete, others are noted as being merged > separately, so I presume you'll send an updated/completed series > eventually? > The first patch from Steve is now in, so can drop it. The other patches are complete, though I need to rebase them and regenerate the treewide patch to catch any changes that came with 6.2. I'll do that this week. The "incompleteness" pointed out in the cover letter is about the types of IPIs that can be traced. This series covers the ones that end up invoking some core code (coincidentally those are the most common ones), others such as e.g. tick_broadcast() for arm, arm64, riscv and hexagon remain unaffected. I'm not that much interested in these (other than maybe the tick broadcast one they are all fairly unfrequent), but I'm happy to have a shot at them for the sake of completeness - either in that series or in a followup, up to you. > - We can merge this via the scheduler tree I suspect, as most callbacks > affected relate to tip:sched/core and tmp:smp/core - but if you have > some other preferred tree that's fine too. > Either sound good to me. > Thanks, > > Ingo
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 978db2d96b446..3b280d55c1c40 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -48,9 +48,6 @@ #include <asm/mach/arch.h> #include <asm/mpu.h> -#define CREATE_TRACE_POINTS -#include <trace/events/ipi.h> - /* * as from 2.5, kernels no longer have an init_tasks structure * so we need some other way of telling a new secondary core diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index ffc5d76cf6955..937d2623e06ba 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c @@ -51,7 +51,6 @@ #include <asm/ptrace.h> #include <asm/virt.h> -#define CREATE_TRACE_POINTS #include <trace/events/ipi.h> DEFINE_PER_CPU_READ_MOSTLY(int, cpu_number); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index daff72f003858..40587b0d99329 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -81,6 +81,7 @@ #include <linux/sched/rseq_api.h> #include <trace/events/sched.h> #undef CREATE_TRACE_POINTS +#include <trace/events/ipi.h> #include "sched.h" #include "stats.h" @@ -3746,10 +3747,12 @@ void send_call_function_single_ipi(int cpu) { struct rq *rq = cpu_rq(cpu); - if (!set_nr_if_polling(rq->idle)) + if (!set_nr_if_polling(rq->idle)) { + trace_ipi_send_cpumask(cpumask_of(cpu), _RET_IP_, NULL); arch_send_call_function_single_ipi(cpu); - else + } else { trace_sched_wake_idle_without_ipi(cpu); + } } /* diff --git a/kernel/smp.c b/kernel/smp.c index 06a413987a14a..e2ca1e2f31274 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -26,6 +26,10 @@ #include <linux/sched/debug.h> #include <linux/jump_label.h> +#define CREATE_TRACE_POINTS +#include <trace/events/ipi.h> +#undef CREATE_TRACE_POINTS + #include "smpboot.h" #include "sched/smp.h"