Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp35262ybt; Thu, 9 Jul 2020 14:44:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzZeIOvvDcVu98XPxgCQkJ6TeW9EEp64n3TYIQkxY6/iZsHZ4WU0iU40nvUhhr2ola7b408 X-Received: by 2002:a17:907:212b:: with SMTP id qo11mr57412257ejb.452.1594331057026; Thu, 09 Jul 2020 14:44:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594331057; cv=none; d=google.com; s=arc-20160816; b=sEAuRhmTAgIBWWLYDNx1Dv3QavMdX4iK06COM0WQWYVw+E+xyFBnK4oonia4dUwcyg +/EbFq7ow9EHS9zXR6bcQfeuL4BQDSJ0BUd4HN4hhuBKo9sNn0iMarLzNm2+dFHmjt8r 69V7NuTleRYyIbYaZDypf4b1c6tPYcd5M7nKczOP1/3bwGiB/b9CUAC03AD/UJ9lbvM3 e3NWdM+5wMKJD7rhq6X3HgDwWkAOGQCQ+B1gt2z3HdDU7a9NeoxCATZTYlatPElywQqn SURbX1Wto/Gr+mWLvz/mnKnya/gz+BkpIScdgODApiVxc6Js9UsQSFVaTMulKyZfyM3J Eqyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date; bh=WrDXgosh1rGnqyW5AHnK8CHY1xIVHe0mPr5u1dkxxwU=; b=G+xA3NoTNPd2gsr+06HrTnqsh2orBG9X3SmQ4abLjsajBRZiZPEfAjJum4RnkCX9Tm 8m0h4KfVa4L7SV3A12hAxfoMBjyibsJwpWCGrh0jqqQhlvuadj2JwbLA3TJi31yxUsDw TFbSuPS7QvVafyjonO3tF6KKWvVPKyYzwo5Ro1d9u6ZNu2JFlvqB2PfGl78K3gr9yI4d byIiwzosqWk5NaPB7m+afcsi6TbuhBF4u08V3+ZgUrWioFoD9D8SURWohJr6m7mj/EfT Laaf5TmJRKqwJKlv5LlKNZT8Bnr+huJtiDxodd1xu7TabaTtJF2ViYsnedCiK6TuCPIr K2kg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bx8si2636885edb.170.2020.07.09.14.43.54; Thu, 09 Jul 2020 14:44:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726761AbgGIVlZ (ORCPT + 99 others); Thu, 9 Jul 2020 17:41:25 -0400 Received: from mail.kernel.org ([198.145.29.99]:38636 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726196AbgGIVlY (ORCPT ); Thu, 9 Jul 2020 17:41:24 -0400 Received: from oasis.local.home (cpe-66-24-58-225.stny.res.rr.com [66.24.58.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2E8B920708; Thu, 9 Jul 2020 21:41:22 +0000 (UTC) Date: Thu, 9 Jul 2020 17:41:20 -0400 From: Steven Rostedt To: Alan Maguire Cc: mingo@redhat.com, ast@kernel.org, daniel@iogearbox.net, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andriin@fb.com, john.fastabend@gmail.com, kpsingh@chromium.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org Subject: Re: [PATCH bpf-next 1/2] bpf: use dedicated bpf_trace_printk event instead of trace_printk() Message-ID: <20200709174120.0ae45ca4@oasis.local.home> In-Reply-To: <1593787468-29931-2-git-send-email-alan.maguire@oracle.com> References: <1593787468-29931-1-git-send-email-alan.maguire@oracle.com> <1593787468-29931-2-git-send-email-alan.maguire@oracle.com> X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 3 Jul 2020 15:44:27 +0100 Alan Maguire wrote: > The bpf helper bpf_trace_printk() uses trace_printk() under the hood. > This leads to an alarming warning message originating from trace > buffer allocation which occurs the first time a program using > bpf_trace_printk() is loaded. > > We can instead create a trace event for bpf_trace_printk() and enable > it in-kernel when/if we encounter a program using the > bpf_trace_printk() helper. With this approach, trace_printk() > is not used directly and no warning message appears. > > This work was started by Steven (see Link) and finished by Alan; added > Steven's Signed-off-by with his permission. > > Link: https://lore.kernel.org/r/20200628194334.6238b933@oasis.local.home > Signed-off-by: Steven Rostedt (VMware) > Signed-off-by: Alan Maguire > --- > kernel/trace/Makefile | 2 ++ > kernel/trace/bpf_trace.c | 41 +++++++++++++++++++++++++++++++++++++---- > kernel/trace/bpf_trace.h | 34 ++++++++++++++++++++++++++++++++++ > 3 files changed, 73 insertions(+), 4 deletions(-) > create mode 100644 kernel/trace/bpf_trace.h > > diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile > index 6575bb0..aeba5ee 100644 > --- a/kernel/trace/Makefile > +++ b/kernel/trace/Makefile > @@ -31,6 +31,8 @@ ifdef CONFIG_GCOV_PROFILE_FTRACE > GCOV_PROFILE := y > endif > > +CFLAGS_bpf_trace.o := -I$(src) > + > CFLAGS_trace_benchmark.o := -I$(src) > CFLAGS_trace_events_filter.o := -I$(src) > > diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c > index 1d874d8..cdbafc4 100644 > --- a/kernel/trace/bpf_trace.c > +++ b/kernel/trace/bpf_trace.c > @@ -2,6 +2,10 @@ > /* Copyright (c) 2011-2015 PLUMgrid, http://plumgrid.com > * Copyright (c) 2016 Facebook > */ > +#define CREATE_TRACE_POINTS > + > +#include "bpf_trace.h" > + Note, it's probably best to include the above after all the other headers. The CREATE_TRACE_POINTS might cause issues if a header has other trace event headers included. > #include > #include > #include > @@ -11,6 +15,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -374,6 +379,28 @@ static void bpf_trace_copy_string(char *buf, void *unsafe_ptr, char fmt_ptype, > } > } > > +static DEFINE_SPINLOCK(trace_printk_lock); I wonder if we should make this a RAW_SPINLOCK(). That way it wont cause any issues on PREEMPT_RT if a bpf trace event is called within other raw spinlocks. > + > +#define BPF_TRACE_PRINTK_SIZE 1024 > + > +static inline int bpf_do_trace_printk(const char *fmt, ...) > +{ > + static char buf[BPF_TRACE_PRINTK_SIZE]; > + unsigned long flags; > + va_list ap; > + int ret; > + > + spin_lock_irqsave(&trace_printk_lock, flags); > + va_start(ap, fmt); > + ret = vsnprintf(buf, BPF_TRACE_PRINTK_SIZE, fmt, ap); > + va_end(ap); > + if (ret > 0) > + trace_bpf_trace_printk(buf); > + spin_unlock_irqrestore(&trace_printk_lock, flags); > + > + return ret; > +} > + > /* > * Only limited trace_printk() conversion specifiers allowed: > * %d %i %u %x %ld %li %lu %lx %lld %lli %llu %llx %p %pB %pks %pus %s > @@ -483,8 +510,7 @@ static void bpf_trace_copy_string(char *buf, void *unsafe_ptr, char fmt_ptype, > */ > #define __BPF_TP_EMIT() __BPF_ARG3_TP() > #define __BPF_TP(...) \ > - __trace_printk(0 /* Fake ip */, \ > - fmt, ##__VA_ARGS__) > + bpf_do_trace_printk(fmt, ##__VA_ARGS__) > > #define __BPF_ARG1_TP(...) \ > ((mod[0] == 2 || (mod[0] == 1 && __BITS_PER_LONG == 64)) \ > @@ -518,13 +544,20 @@ static void bpf_trace_copy_string(char *buf, void *unsafe_ptr, char fmt_ptype, > .arg2_type = ARG_CONST_SIZE, > }; > > +int bpf_trace_printk_enabled; > + > const struct bpf_func_proto *bpf_get_trace_printk_proto(void) > { > /* > * this program might be calling bpf_trace_printk, > - * so allocate per-cpu printk buffers > + * so enable the associated bpf_trace/bpf_trace_printk event. > */ > - trace_printk_init_buffers(); > + if (!bpf_trace_printk_enabled) { > + if (trace_set_clr_event("bpf_trace", "bpf_trace_printk", 1)) If you just keep it enabled, it may be best to always call this. It doesn't hurt if you call it when it is already enabled. This is because if someone were to disable the bpf_trace_printk via tracefs, and then load another bpf program with another bpf_trace_printk in it, that program wont re-enable the bpf_trace_printk trace event again do to this check. The rest looks fine to me. -- Steve > + pr_warn_ratelimited("could not enable bpf_trace_printk events"); > + else > + bpf_trace_printk_enabled = 1; > + } > > return &bpf_trace_printk_proto; > } > diff --git a/kernel/trace/bpf_trace.h b/kernel/trace/bpf_trace.h > new file mode 100644 > index 0000000..9acbc11 > --- /dev/null > +++ b/kernel/trace/bpf_trace.h > @@ -0,0 +1,34 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM bpf_trace > + > +#if !defined(_TRACE_BPF_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) > + > +#define _TRACE_BPF_TRACE_H > + > +#include > + > +TRACE_EVENT(bpf_trace_printk, > + > + TP_PROTO(const char *bpf_string), > + > + TP_ARGS(bpf_string), > + > + TP_STRUCT__entry( > + __string(bpf_string, bpf_string) > + ), > + > + TP_fast_assign( > + __assign_str(bpf_string, bpf_string); > + ), > + > + TP_printk("%s", __get_str(bpf_string)) > +); > + > +#endif /* _TRACE_BPF_TRACE_H */ > + > +#undef TRACE_INCLUDE_PATH > +#define TRACE_INCLUDE_PATH . > +#define TRACE_INCLUDE_FILE bpf_trace > + > +#include