From patchwork Fri Mar 24 22:30:28 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Beau Belgrave X-Patchwork-Id: 74777 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp71076vqo; Fri, 24 Mar 2023 15:48:21 -0700 (PDT) X-Google-Smtp-Source: AKy350a21y1suOImr955eZHwC9aoa+1Wb6c0wuF7BLCimkbFv9jQ4I4ai/xByMVc5yyrwnBBM3zS X-Received: by 2002:a62:1c57:0:b0:624:f46:7256 with SMTP id c84-20020a621c57000000b006240f467256mr4928822pfc.21.1679698101008; Fri, 24 Mar 2023 15:48:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679698100; cv=none; d=google.com; s=arc-20160816; b=DRdmePSkr/nkNHTFXmPXpfuYLk5tqXXECooMUtOdsD8/g0WzAw8Ia1Ng+Fe8bcAUbP erSH8Jgh+1LJJ6RZe0EmPXKDh7ge1ibN8CsqGrKVFpxZOiV6yzeSDSGKK75F0KdUgv1b gyvkqcL3qGypCChblR95At3+bciDOSmRUaI+N+PrEF8IoIPpmdmI5nO1drvPx4k6S+zA oJmP7EYGFHsTUWcfONZfAIkUHZoXB0yjTAC4HL4gVEmlAwjYJqKUY8lVFrBoQoRkJBHH ttot/TtEekCXBfY9D95sZyHISa5O3wQyxVPguI0uYg2DUNxYuJiVthJ9FqegsgopIZkG H4Hw== 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:dkim-filter; bh=9hn7lg9dudknRxZST2EvcXuTZnhH2Dpn1zkQtZUpKR0=; b=PPkGRYFg/axqo3VcXcARO+1tRmhUMoYpi67lXEfnpRG4ZxySGSMSKXcvJ2EK+K85Na TIERH8EpJXJni+QzjW/HX+k0E2ypmnUY6WwgVXXymoiUUc2ALTmErZIao0ZE7EPCf91A zTGwWQniJsm26eDpimDqmAlyOyQiEzT+foxv80lGDdGpQnyqgWId+LvkN0loJXHgMvvE v2QwlIzMtJt7Lu8VjS2bApn/paPMLtvlHa/+rp/ASDWUfK+H//yXTIucnzKbpR/wOWhY Bxb8MLxNpTVcsQ59XRECYOTyyNAHXV88mNoeWBgf8P2daWCxflAtpJiE5STV9U54447q wo6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=FiFa0lj4; 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=linux.microsoft.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ei19-20020a056a0080d300b00627ed0fa77csi16067573pfb.188.2023.03.24.15.48.08; Fri, 24 Mar 2023 15:48:20 -0700 (PDT) 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=@linux.microsoft.com header.s=default header.b=FiFa0lj4; 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=linux.microsoft.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232442AbjCXWbR (ORCPT + 99 others); Fri, 24 Mar 2023 18:31:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43230 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232123AbjCXWao (ORCPT ); Fri, 24 Mar 2023 18:30:44 -0400 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 8B05117CF0; Fri, 24 Mar 2023 15:30:42 -0700 (PDT) Received: from W11-BEAU-MD.localdomain (unknown [76.135.27.212]) by linux.microsoft.com (Postfix) with ESMTPSA id C98CD20FC4FA; Fri, 24 Mar 2023 15:30:41 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com C98CD20FC4FA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1679697042; bh=9hn7lg9dudknRxZST2EvcXuTZnhH2Dpn1zkQtZUpKR0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FiFa0lj4u0e+Ncsfd5AUeJfL964Tk6p0G1c6Bp/6p7o7ZptOxS7NqaVNgYvxsX814 uyUEsOSMgRPHo8IBeiPvPTHbXGzKwnhAAOiKTnIoGz9esjUu721Zcbbgt6s5YAdK/B +8yreuxzE1R2hXNL6IR3qji9QLfg6iJG+rQv16ik= From: Beau Belgrave To: rostedt@goodmis.org, mhiramat@kernel.org, mathieu.desnoyers@efficios.com, dcook@linux.microsoft.com, alanau@linux.microsoft.com, brauner@kernel.org, akpm@linux-foundation.org, ebiederm@xmission.com, keescook@chromium.org, tglx@linutronix.de Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v9 11/11] tracing/user_events: Limit global user_event count Date: Fri, 24 Mar 2023 15:30:28 -0700 Message-Id: <20230324223028.172-12-beaub@linux.microsoft.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230324223028.172-1-beaub@linux.microsoft.com> References: <20230324223028.172-1-beaub@linux.microsoft.com> MIME-Version: 1.0 X-Spam-Status: No, score=-17.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_MED,SPF_HELO_PASS, SPF_PASS,USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761291115967591250?= X-GMAIL-MSGID: =?utf-8?q?1761291115967591250?= Operators want to be able to ensure enough tracepoints exist on the system for kernel components as well as for user components. Since there are only up to 64K events, by default allow up to half to be used by user events. Add a kernel sysctl parameter (kernel.user_events_max) to set a global limit that is honored among all groups on the system. This ensures hard limits can be setup to prevent user processes from consuming all event IDs on the system. Signed-off-by: Beau Belgrave --- kernel/trace/trace_events_user.c | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/kernel/trace/trace_events_user.c b/kernel/trace/trace_events_user.c index 222f2eb59c7c..11922f7cf496 100644 --- a/kernel/trace/trace_events_user.c +++ b/kernel/trace/trace_events_user.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "trace.h" #include "trace_dynevent.h" @@ -61,6 +62,12 @@ struct user_event_group { /* Group for init_user_ns mapping, top-most group */ static struct user_event_group *init_group; +/* Max allowed events for the whole system */ +static unsigned int max_user_events = 32768; + +/* Current number of events on the whole system */ +static unsigned int current_user_events; + /* * Stores per-event properties, as users register events * within a file a user_event might be created if it does not @@ -1241,6 +1248,8 @@ static int destroy_user_event(struct user_event *user) { int ret = 0; + lockdep_assert_held(&event_mutex); + /* Must destroy fields before call removal */ user_event_destroy_fields(user); @@ -1257,6 +1266,11 @@ static int destroy_user_event(struct user_event *user) kfree(EVENT_NAME(user)); kfree(user); + if (current_user_events > 0) + current_user_events--; + else + pr_alert("BUG: Bad current_user_events\n"); + return ret; } @@ -1744,6 +1758,11 @@ static int user_event_parse(struct user_event_group *group, char *name, mutex_lock(&event_mutex); + if (current_user_events >= max_user_events) { + ret = -EMFILE; + goto put_user_lock; + } + ret = user_event_trace_register(user); if (ret) @@ -1755,6 +1774,7 @@ static int user_event_parse(struct user_event_group *group, char *name, dyn_event_init(&user->devent, &user_event_dops); dyn_event_add(&user->devent, &user->call); hash_add(group->register_table, &user->node, key); + current_user_events++; mutex_unlock(&event_mutex); @@ -2386,6 +2406,31 @@ static int create_user_tracefs(void) return -ENODEV; } +static int set_max_user_events_sysctl(struct ctl_table *table, int write, + void *buffer, size_t *lenp, loff_t *ppos) +{ + int ret; + + mutex_lock(&event_mutex); + + ret = proc_douintvec(table, write, buffer, lenp, ppos); + + mutex_unlock(&event_mutex); + + return ret; +} + +static struct ctl_table user_event_sysctls[] = { + { + .procname = "user_events_max", + .data = &max_user_events, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = set_max_user_events_sysctl, + }, + {} +}; + static int __init trace_events_user_init(void) { int ret; @@ -2415,6 +2460,8 @@ static int __init trace_events_user_init(void) if (dyn_event_register(&user_event_dops)) pr_warn("user_events could not register with dyn_events\n"); + register_sysctl_init("kernel", user_event_sysctls); + return 0; }