Message ID | 20230307143558.294354-2-vschneid@redhat.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp2484709wrd; Tue, 7 Mar 2023 07:11:57 -0800 (PST) X-Google-Smtp-Source: AK7set/X/3SX4Sc9d5LJI/6LZdJyRF5S3OS/tpbPNoWmhtmrZvUDa1bxFyzNXVknHdf/oA/NffIp X-Received: by 2002:a17:906:1450:b0:8af:ef00:b853 with SMTP id q16-20020a170906145000b008afef00b853mr13243777ejc.73.1678201917592; Tue, 07 Mar 2023 07:11:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1678201917; cv=none; d=google.com; s=arc-20160816; b=PaRJUQzuGvT7w8Fok4kVDfwHRPcL2ZBNTgetzZcuq8CNcC0XX+sYDUeoYl6v2ZgPbV XWH9QFbbwc+Ym/W0/kp3D0Pe4I5OlWGq7fBP6eevAVtT0YkTJ8N8iur2egIWmHj/uip6 h2w7Vd/+V7+lfB7XXscwrSMYOH5tLSeXTpwpMb2yqiPhGKhvbQoVKIzx7WkstPdZ4liz 5CY1NjiLgcCuIc1LjpFkFVG1uTQR5UP4UD9lhjPiJK6UeBcI6GHgMNrvaJu15k8aP3to DQw53qq06iX7P0A5dM2BoOsz5w9abG1Ai+UXkO2pWiPxMtGbja+FUZh92xovXq+3fFTQ FJNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=sqdAC23AFCpafEftyGbYSrYoVeo5kk0ftc/PmTPLnCU=; b=pmMezrTT6ovBut5JV7bkeroGkct5WYP2yd7pfpPnWi85zYH9dWwxtAF2V1vuLGF4YV YSjeJieuYaQCh7zCPlvJ1Lyay7RZR+1HzbVqQ4jlNxncD4eDY71GqKA1jwdOZlWZ/4nl AAlLEi0uvYGykl3zYew0MtkKBERjPoKG0hRTczi1eFP2Oig9JZRUcwfWGUfgHv6lWL8Q 8q64ik7ILxq4aw9d+WnEAu6heSToK92bprO2DIB2Yp38ahLqJ0G9zidnfapsec9DxOpT PQDDYnQLb99+bjCtMUHmvfqNOMIuKt6U9lhxGi7VrYkrUOGEiN9fAMrzJJWqDaHzz2/Y 3e+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=RnC1oS1y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e18-20020a17090658d200b008b194cc10acsi16832404ejs.381.2023.03.07.07.11.33; Tue, 07 Mar 2023 07:11:57 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=RnC1oS1y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229870AbjCGPAm (ORCPT <rfc822;toshivichauhan@gmail.com> + 99 others); Tue, 7 Mar 2023 10:00:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37496 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229940AbjCGPAJ (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 7 Mar 2023 10:00:09 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B50DF92243 for <linux-kernel@vger.kernel.org>; Tue, 7 Mar 2023 06:42:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678200165; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sqdAC23AFCpafEftyGbYSrYoVeo5kk0ftc/PmTPLnCU=; b=RnC1oS1yl0HbZ6NepuOhyPYVwAjK6Mk7qGZXoASawD2ef7nVBqaZ6swRZ0HWFA2cmztZqt qImrU8q6eS3qjV4LXLya5ja/QLYrcd0WUi3zCK+WDsUBEeEUEDh8l8rCy5jMaKPTkSM0zN 8OZ8AZBy8/I6JvGvtDb3ktw1MLPK6/0= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-316--Mbwj-W3NLC_0yM8Mt1Txw-1; Tue, 07 Mar 2023 09:36:31 -0500 X-MC-Unique: -Mbwj-W3NLC_0yM8Mt1Txw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8FCA33C6986A; Tue, 7 Mar 2023 14:36:30 +0000 (UTC) Received: from vschneid.remote.csb (unknown [10.33.37.13]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 79249401B290; Tue, 7 Mar 2023 14:36:26 +0000 (UTC) From: Valentin Schneider <vschneid@redhat.com> To: linux-alpha@vger.kernel.org, linux-kernel@vger.kernel.org, linux-snps-arc@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-csky@vger.kernel.org, linux-hexagon@vger.kernel.org, linux-ia64@vger.kernel.org, loongarch@lists.linux.dev, linux-mips@vger.kernel.org, openrisc@lists.librecores.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-xtensa@linux-xtensa.org, x86@kernel.org Cc: Steven Rostedt <rostedt@goodmis.org>, "Paul E. McKenney" <paulmck@kernel.org>, Peter Zijlstra <peterz@infradead.org>, Thomas Gleixner <tglx@linutronix.de>, Sebastian Andrzej Siewior <bigeasy@linutronix.de>, Juri Lelli <juri.lelli@redhat.com>, Daniel Bristot de Oliveira <bristot@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>, Frederic Weisbecker <frederic@kernel.org>, Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>, Dave Hansen <dave.hansen@linux.intel.com>, "H. Peter Anvin" <hpa@zytor.com>, Marc Zyngier <maz@kernel.org>, Mark Rutland <mark.rutland@arm.com>, Russell King <linux@armlinux.org.uk>, Nicholas Piggin <npiggin@gmail.com>, Guo Ren <guoren@kernel.org>, "David S. Miller" <davem@davemloft.net> Subject: [PATCH v5 1/7] trace: Add trace_ipi_send_cpumask() Date: Tue, 7 Mar 2023 14:35:52 +0000 Message-Id: <20230307143558.294354-2-vschneid@redhat.com> In-Reply-To: <20230307143558.294354-1-vschneid@redhat.com> References: <20230307143558.294354-1-vschneid@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759722253796059812?= X-GMAIL-MSGID: =?utf-8?q?1759722253796059812?= |
Series |
Generic IPI sending tracepoint
|
|
Commit Message
Valentin Schneider
March 7, 2023, 2:35 p.m. UTC
trace_ipi_raise() is unsuitable for generically tracing IPI sources due to its "reason" argument being an uninformative string (on arm64 all you get is "Function call interrupts" for SMP calls). Add a variant of it that exports a target cpumask, a callsite and a callback. Signed-off-by: Valentin Schneider <vschneid@redhat.com> Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> --- include/trace/events/ipi.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
Comments
On Tue, Mar 07, 2023 at 02:35:52PM +0000, Valentin Schneider wrote: > trace_ipi_raise() is unsuitable for generically tracing IPI sources due to > its "reason" argument being an uninformative string (on arm64 all you get > is "Function call interrupts" for SMP calls). > > Add a variant of it that exports a target cpumask, a callsite and a callback. > > Signed-off-by: Valentin Schneider <vschneid@redhat.com> > Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> > --- > include/trace/events/ipi.h | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/include/trace/events/ipi.h b/include/trace/events/ipi.h > index 0be71dad6ec03..b1125dc27682c 100644 > --- a/include/trace/events/ipi.h > +++ b/include/trace/events/ipi.h > @@ -35,6 +35,28 @@ TRACE_EVENT(ipi_raise, > TP_printk("target_mask=%s (%s)", __get_bitmask(target_cpus), __entry->reason) > ); > > +TRACE_EVENT(ipi_send_cpumask, > + > + TP_PROTO(const struct cpumask *cpumask, unsigned long callsite, void *callback), > + > + TP_ARGS(cpumask, callsite, callback), > + > + TP_STRUCT__entry( > + __cpumask(cpumask) > + __field(void *, callsite) > + __field(void *, callback) > + ), > + > + TP_fast_assign( > + __assign_cpumask(cpumask, cpumask_bits(cpumask)); > + __entry->callsite = (void *)callsite; > + __entry->callback = callback; > + ), > + > + TP_printk("cpumask=%s callsite=%pS callback=%pS", > + __get_cpumask(cpumask), __entry->callsite, __entry->callback) > +); Would it make sense to add a variant like: ipi_send_cpu() that records a single cpu instead of a cpumask. A lot of sites seems to do: cpumask_of(cpu) for that first argument, and it seems to me it is quite daft to have to memcpy a full multi-word cpumask in those cases. Remember, nr_possible_cpus > 64 is quite common these days.
On Wed, Mar 22, 2023 at 10:39:55AM +0100, Peter Zijlstra wrote: > On Tue, Mar 07, 2023 at 02:35:52PM +0000, Valentin Schneider wrote: > > trace_ipi_raise() is unsuitable for generically tracing IPI sources due to > > its "reason" argument being an uninformative string (on arm64 all you get > > is "Function call interrupts" for SMP calls). > > > > Add a variant of it that exports a target cpumask, a callsite and a callback. > > > > Signed-off-by: Valentin Schneider <vschneid@redhat.com> > > Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org> > > --- > > include/trace/events/ipi.h | 22 ++++++++++++++++++++++ > > 1 file changed, 22 insertions(+) > > > > diff --git a/include/trace/events/ipi.h b/include/trace/events/ipi.h > > index 0be71dad6ec03..b1125dc27682c 100644 > > --- a/include/trace/events/ipi.h > > +++ b/include/trace/events/ipi.h > > @@ -35,6 +35,28 @@ TRACE_EVENT(ipi_raise, > > TP_printk("target_mask=%s (%s)", __get_bitmask(target_cpus), __entry->reason) > > ); > > > > +TRACE_EVENT(ipi_send_cpumask, > > + > > + TP_PROTO(const struct cpumask *cpumask, unsigned long callsite, void *callback), > > + > > + TP_ARGS(cpumask, callsite, callback), > > + > > + TP_STRUCT__entry( > > + __cpumask(cpumask) > > + __field(void *, callsite) > > + __field(void *, callback) > > + ), > > + > > + TP_fast_assign( > > + __assign_cpumask(cpumask, cpumask_bits(cpumask)); > > + __entry->callsite = (void *)callsite; > > + __entry->callback = callback; > > + ), > > + > > + TP_printk("cpumask=%s callsite=%pS callback=%pS", > > + __get_cpumask(cpumask), __entry->callsite, __entry->callback) > > +); > > Would it make sense to add a variant like: ipi_send_cpu() that records a > single cpu instead of a cpumask. A lot of sites seems to do: > cpumask_of(cpu) for that first argument, and it seems to me it is quite > daft to have to memcpy a full multi-word cpumask in those cases. > > Remember, nr_possible_cpus > 64 is quite common these days. Something we litte bit like so... --- Subject: trace: Add trace_ipi_send_cpu() From: Peter Zijlstra <peterz@infradead.org> Date: Wed Mar 22 11:28:36 CET 2023 Because copying cpumasks around when targeting a single CPU is a bit daft... Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- include/linux/smp.h | 6 +++--- include/trace/events/ipi.h | 22 ++++++++++++++++++++++ kernel/irq_work.c | 6 ++---- kernel/smp.c | 4 ++-- 4 files changed, 29 insertions(+), 9 deletions(-) --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -130,9 +130,9 @@ extern void arch_smp_send_reschedule(int * 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); \ }) /* --- a/include/trace/events/ipi.h +++ b/include/trace/events/ipi.h @@ -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=%s 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), --- a/kernel/irq_work.c +++ b/kernel/irq_work.c @@ -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(); } --- a/kernel/smp.c +++ b/kernel/smp.c @@ -109,7 +109,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); } } @@ -348,7 +348,7 @@ void __smp_call_single_queue(int cpu, st * 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;
On 22/03/23 11:30, Peter Zijlstra wrote: > On Wed, Mar 22, 2023 at 10:39:55AM +0100, Peter Zijlstra wrote: >> On Tue, Mar 07, 2023 at 02:35:52PM +0000, Valentin Schneider wrote: >> > +TRACE_EVENT(ipi_send_cpumask, >> > + >> > + TP_PROTO(const struct cpumask *cpumask, unsigned long callsite, void *callback), >> > + >> > + TP_ARGS(cpumask, callsite, callback), >> > + >> > + TP_STRUCT__entry( >> > + __cpumask(cpumask) >> > + __field(void *, callsite) >> > + __field(void *, callback) >> > + ), >> > + >> > + TP_fast_assign( >> > + __assign_cpumask(cpumask, cpumask_bits(cpumask)); >> > + __entry->callsite = (void *)callsite; >> > + __entry->callback = callback; >> > + ), >> > + >> > + TP_printk("cpumask=%s callsite=%pS callback=%pS", >> > + __get_cpumask(cpumask), __entry->callsite, __entry->callback) >> > +); >> >> Would it make sense to add a variant like: ipi_send_cpu() that records a >> single cpu instead of a cpumask. A lot of sites seems to do: >> cpumask_of(cpu) for that first argument, and it seems to me it is quite >> daft to have to memcpy a full multi-word cpumask in those cases. >> >> Remember, nr_possible_cpus > 64 is quite common these days. > > Something we litte bit like so... > I was wondering whether we could stick with a single trace event, but let ftrace be aware of weight=1 vs weight>1 cpumasks. For weight>1, it would memcpy() as usual, for weight=1, it could write a pointer to a cpu_bit_bitmap[] equivalent embedded in the trace itself. Unfortunately, Ftrace bitmasks are represented as a u32 made of two 16 bit values: [offset in event record, size], so there isn't a straightforward way to point to a "reusable" cpumask. AFAICT the only alternative would be to do that via a different trace event, but then we should just go with a plain old uint - i.e. do what you're doing here, so: Tested-and-reviewed-by: Valentin Schneider <vschneid@redhat.com> (with the tiny typo fix below) > @@ -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=%s callsite=%pS callback=%pS", ^ s/s/u/ > + __entry->cpu, __entry->callsite, __entry->callback) > +); > +
diff --git a/include/trace/events/ipi.h b/include/trace/events/ipi.h index 0be71dad6ec03..b1125dc27682c 100644 --- a/include/trace/events/ipi.h +++ b/include/trace/events/ipi.h @@ -35,6 +35,28 @@ TRACE_EVENT(ipi_raise, TP_printk("target_mask=%s (%s)", __get_bitmask(target_cpus), __entry->reason) ); +TRACE_EVENT(ipi_send_cpumask, + + TP_PROTO(const struct cpumask *cpumask, unsigned long callsite, void *callback), + + TP_ARGS(cpumask, callsite, callback), + + TP_STRUCT__entry( + __cpumask(cpumask) + __field(void *, callsite) + __field(void *, callback) + ), + + TP_fast_assign( + __assign_cpumask(cpumask, cpumask_bits(cpumask)); + __entry->callsite = (void *)callsite; + __entry->callback = callback; + ), + + TP_printk("cpumask=%s callsite=%pS callback=%pS", + __get_cpumask(cpumask), __entry->callsite, __entry->callback) +); + DECLARE_EVENT_CLASS(ipi_handler, TP_PROTO(const char *reason),