Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp3169130rdb; Sat, 9 Dec 2023 14:52:20 -0800 (PST) X-Google-Smtp-Source: AGHT+IHDokgYj6bnaypof58Wk6GyMHCtOR2BPfVIxl2zZryRg90RQVEH+8higQGRKqmsC9MdLxPX X-Received: by 2002:a05:6e02:1789:b0:35d:5f8f:9b09 with SMTP id y9-20020a056e02178900b0035d5f8f9b09mr4383960ilu.17.1702162339923; Sat, 09 Dec 2023 14:52:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702162339; cv=none; d=google.com; s=arc-20160816; b=JHE7orZskye4dcYGlnr8tsqMw+ORp6TAd9cCAzXp9K5fHHld8aDSDLMEOCVpz47HYl BOAfBnjx/UDOdnERdXfci2JBnKIY+g5A7rBDwfk4UDro4t8utxjwNcdS7LXpk9h5Wens Q3n/aJyxsll+qBiLmaSWxaqCwoEgd2n1Lj6rkOOFnQijghC0snUyXR80ARNleC0HW0wK vjY+a6DMDdHmBq4+oimiprp0WlF62Hx+KB9+4pPzOEgOYSVHGI1t7N3+v4iqcgYzTaoV aSCI9/x6iFND2ZfGHTYhTIe3Y4pzZDHAB0N+SMHbfQC6eTv7fSdjxRo0H59IxwBHHFsU sPFg== 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 :message-id:subject:cc:to:from:date; bh=UzMOjy5wejn/vJ78+ZCt2nX0vOCJYai0+fqHOsXvuYE=; fh=R8JZsVKDlS7lXIAvTNV55bsjlDBI0i4sqiOYXO4tZQA=; b=wbvCQMupv2mZUuCfTc6I+ct2rZnscGYFhMNiCvcxICGrPJL41gRqX6AnJXMRehRb3y UYb6vKw7BihoShIEwhjvtWcqNSWCGRotd228TidmuJpAx6auBe3LQPzpB/BDBV6xRFM/ iUoNOmFsycz/PgHE9q92o+LDgLWQsfML7HLgB0sy4gFxmCOP+ix+OXs4rBqLuO1QwzR0 5P3HUCTDgPKWcHe6vAkXBlK8FjOAbXor+Okcdol7YeuTA8knlmrA4ob0NaAfZ3Gbw06H o2yk8AQ62YUbRew7+gMR2CKjqvRJJcFf7nZsXrG55jpNfMEa63g0fuY5SKvMlttgWMfc goDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id a6-20020a1709027d8600b001d08c079196si3645503plm.36.2023.12.09.14.52.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 Dec 2023 14:52:19 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) client-ip=2620:137:e000::3:3; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id EF03880787F1; Sat, 9 Dec 2023 14:52:01 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229518AbjLIWtX (ORCPT + 99 others); Sat, 9 Dec 2023 17:49:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44876 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229477AbjLIWtW (ORCPT ); Sat, 9 Dec 2023 17:49:22 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E048F115 for ; Sat, 9 Dec 2023 14:49:28 -0800 (PST) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C2BA1C433C7; Sat, 9 Dec 2023 22:49:27 +0000 (UTC) Date: Sat, 9 Dec 2023 17:50:03 -0500 From: Steven Rostedt To: LKML , Linux Trace Kernel Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers Subject: [PATCH] tracing: Allow for max buffer data size trace_marker writes Message-ID: <20231209175003.63db40ab@gandalf.local.home> X-Mailer: Claws Mail 3.19.1 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Sat, 09 Dec 2023 14:52:02 -0800 (PST) From: "Steven Rostedt (Google)" Allow a trace write to be as big as the ring buffer tracing data will allow. Currently, it only allows writes of 1KB in size, but there's no reason that it cannot allow what the ring buffer can hold. Signed-off-by: Steven Rostedt (Google) --- [ Depends on: https://lore.kernel.org/linux-trace-kernel/20231209170139.33c1b452@gandalf.local.home/ ] include/linux/ring_buffer.h | 1 + kernel/trace/ring_buffer.c | 12 ++++++++++++ kernel/trace/trace.c | 28 +++++++++++++++++++++------- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 782e14f62201..b1b03b2c0f08 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h @@ -141,6 +141,7 @@ int ring_buffer_iter_empty(struct ring_buffer_iter *iter); bool ring_buffer_iter_dropped(struct ring_buffer_iter *iter); unsigned long ring_buffer_size(struct trace_buffer *buffer, int cpu); +unsigned long ring_buffer_max_event_size(struct trace_buffer *buffer); void ring_buffer_reset_cpu(struct trace_buffer *buffer, int cpu); void ring_buffer_reset_online_cpus(struct trace_buffer *buffer); diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 8da1320df51d..3a5026702179 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -5254,6 +5254,18 @@ unsigned long ring_buffer_size(struct trace_buffer *buffer, int cpu) } EXPORT_SYMBOL_GPL(ring_buffer_size); +/** + * ring_buffer_max_event_size - return the max data size of an event + * @buffer: The ring buffer. + * + * Returns the maximum size an event can be. + */ +unsigned long ring_buffer_max_event_size(struct trace_buffer *buffer) +{ + return BUF_MAX_EVENT_SIZE; +} +EXPORT_SYMBOL_GPL(ring_buffer_max_event_size); + static void rb_clear_buffer_page(struct buffer_page *page) { local_set(&page->write, 0); diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 49f388e4fa1d..83393c65ec71 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -7272,6 +7272,7 @@ tracing_mark_write(struct file *filp, const char __user *ubuf, enum event_trigger_type tt = ETT_NONE; struct trace_buffer *buffer; struct print_entry *entry; + int meta_size; ssize_t written; int size; int len; @@ -7286,12 +7287,9 @@ tracing_mark_write(struct file *filp, const char __user *ubuf, if (!(tr->trace_flags & TRACE_ITER_MARKERS)) return -EINVAL; - if (cnt > TRACE_BUF_SIZE) - cnt = TRACE_BUF_SIZE; - - BUILD_BUG_ON(TRACE_BUF_SIZE >= PAGE_SIZE); - - size = sizeof(*entry) + cnt + 2; /* add '\0' and possible '\n' */ + meta_size = sizeof(*entry) + 2; /* add '\0' and possible '\n' */ + again: + size = cnt + meta_size; /* If less than "", then make sure we can still add that */ if (cnt < FAULTED_SIZE) @@ -7300,9 +7298,25 @@ tracing_mark_write(struct file *filp, const char __user *ubuf, buffer = tr->array_buffer.buffer; event = __trace_buffer_lock_reserve(buffer, TRACE_PRINT, size, tracing_gen_ctx()); - if (unlikely(!event)) + if (unlikely(!event)) { + /* + * If the size was greated than what was allowed, then + * make it smaller and try again. + */ + if (size > ring_buffer_max_event_size(buffer)) { + /* cnt < FAULTED size should never be bigger than max */ + if (WARN_ON_ONCE(cnt < FAULTED_SIZE)) + return -EBADF; + cnt = ring_buffer_max_event_size(buffer) - meta_size; + /* The above should only happen once */ + if (WARN_ON_ONCE(cnt + meta_size == size)) + return -EBADF; + goto again; + } + /* Ring buffer disabled, return as if not open for write */ return -EBADF; + } entry = ring_buffer_event_data(event); entry->ip = _THIS_IP_; -- 2.42.0