From patchwork Thu Jul 20 16:30:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Valentin Schneider X-Patchwork-Id: 13320785 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 90DDDEB64DC for ; Thu, 20 Jul 2023 16:31:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1DBF728012F; Thu, 20 Jul 2023 12:31:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1654E28004C; Thu, 20 Jul 2023 12:31:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id ED24D28012F; Thu, 20 Jul 2023 12:31:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id D6D7A28004C for ; Thu, 20 Jul 2023 12:31:57 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 7C591B0EA3 for ; Thu, 20 Jul 2023 16:31:57 +0000 (UTC) X-FDA: 81032531874.22.A1586E4 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf12.hostedemail.com (Postfix) with ESMTP id 923D74000D for ; Thu, 20 Jul 2023 16:31:55 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LhrWsx++; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf12.hostedemail.com: domain of vschneid@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=vschneid@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689870715; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=FgooZspr4TQIjuc/tHX/XT4D8n/wo2nwvhkclMi4+iU=; b=bNwd+hHITwFKQQf+3FOZcj1EDY7Wv+DdLICfwT3TEA1V2nufLlRnCeYbpLSnCZr4GCPT2r d7mdZPQu4U6ycfmC9XBeLMhgsCzIUlrQBnuBTh1LjUu4atKeZMt4M97E3ul6LFdF4TZs6z UHsSpCN6TpZ7nibPizC37b8eGItBq90= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LhrWsx++; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf12.hostedemail.com: domain of vschneid@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=vschneid@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689870715; a=rsa-sha256; cv=none; b=eiFPWXf3VVmAku3oarG2BFVyrfe1uHdnBLp8OGn1xAiQRBgV4NcWGGydxsQ5Bo2CVwZQHe nWi1Zb35nyiqll4zTs5mJTd6ifPkAO9ymjqOGomuHKsge1DVdkil5RZ17KqhekEN9LNfLs AUKpNPgDTDC3d8bCdHui1Vln2nvgFrs= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1689870714; 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=FgooZspr4TQIjuc/tHX/XT4D8n/wo2nwvhkclMi4+iU=; b=LhrWsx++trxf0wDP9Oo+0WuzdhIrPKJZa2A2ROrJP9nIC8exZpk5F5wfhfq9qtW/pwRtni OL2MCauiwYPCkdacwkcByKoDtk4UGjIGjCiYGOfoI0npMrEfO79eFD0nCe2N0FGQ6Y9SCT hJPpGkE7lACQOFhzAFsyzmlCfmIhAsw= Received: from mimecast-mx02.redhat.com (66.187.233.73 [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-558-fsF-jKQQP5yEcGDp2gQ-Yw-1; Thu, 20 Jul 2023 12:31:53 -0400 X-MC-Unique: fsF-jKQQP5yEcGDp2gQ-Yw-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 986C22812951; Thu, 20 Jul 2023 16:31:49 +0000 (UTC) Received: from vschneid.remote.csb (unknown [10.42.28.48]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6C05640C206F; Thu, 20 Jul 2023 16:31:40 +0000 (UTC) From: Valentin Schneider To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kvm@vger.kernel.org, linux-mm@kvack.org, bpf@vger.kernel.org, x86@kernel.org, rcu@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Steven Rostedt , Masami Hiramatsu , Jonathan Corbet , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Paolo Bonzini , Wanpeng Li , Vitaly Kuznetsov , Andy Lutomirski , Peter Zijlstra , Frederic Weisbecker , "Paul E. McKenney" , Neeraj Upadhyay , Joel Fernandes , Josh Triplett , Boqun Feng , Mathieu Desnoyers , Lai Jiangshan , Zqiang , Andrew Morton , Uladzislau Rezki , Christoph Hellwig , Lorenzo Stoakes , Josh Poimboeuf , Jason Baron , Kees Cook , Sami Tolvanen , Ard Biesheuvel , Nicholas Piggin , Juerg Haefliger , Nicolas Saenz Julienne , "Kirill A. Shutemov" , Nadav Amit , Dan Carpenter , Chuang Wang , Yang Jihong , Petr Mladek , "Jason A. Donenfeld" , Song Liu , Julian Pidancet , Tom Lendacky , Dionna Glaze , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Juri Lelli , Daniel Bristot de Oliveira , Marcelo Tosatti , Yair Podemsky Subject: [RFC PATCH v2 01/20] tracing/filters: Dynamically allocate filter_pred.regex Date: Thu, 20 Jul 2023 17:30:37 +0100 Message-Id: <20230720163056.2564824-2-vschneid@redhat.com> In-Reply-To: <20230720163056.2564824-1-vschneid@redhat.com> References: <20230720163056.2564824-1-vschneid@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Rspamd-Queue-Id: 923D74000D X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: 1jj96rt4x1eekw7ucnwu5i5okkk9suu7 X-HE-Tag: 1689870715-31811 X-HE-Meta: U2FsdGVkX1/NcvHAJHSTTzElbzH2E39TAhZG4/lai0G51/0HaAfHpR1fTL0Xmm02GpYj5ArujmgxDv5IoBRjFAseiHF3hPfqulYPCXOqDpMOQ2iUfQolRcQxyhf0piWNzln6h4AiFczm15cROpVhNEC/Hyp1+k8AmPuXB5sprmsypzzvU0cfPhxT3etd2UM3mrhxPfPWQVO7R2upsvOgtkmeDxokz97YgCHmmi8hwH79s2IVVOZfAy8MWcQUB0nP9dQgoTUIT1jof6bZ6zBhW06nPeXEvBMDo6GlErtsmr6Ux19bk/YkIYqQxQgH9WxwHwQyuA7aHDUMrx+UbiT4qq7iUCb0T0pAjXP64XO8N5bvkEY7CALZxLkK7GDCaR8qNZClaHpRksXnRkpd0Za0zBMkoA8rrE3xpjS/tRJveY6rbKQSeI5KXjYLUlZ9yyuFZi+KqWWmWgKcmNWp9fLI8CR/PjmyIgZ0OHEROCfM1jAQ9oZ3hRCCDXPWbnxOiAfGUL/7WDemqxvZltEzy015UCoFUbBPXyEpy1Qy9FpGNxlcnJBtmJPlXzF7Hx/vc0IjBAXGP4M6Da+YFFC0/zi8yYlqCXi0IJg+EmJoJxmVVbWNqcIL6ff9kelcLpvLSgcFvWyfxAd+5xgED6D0+Qu5zVrJhO9Cqkxdo5qMFtJtmSlbcZL7w2lwoy5sj4QqtF4ARixqUXUzjHCibrKX/qAD7AvlK6Zl2ixT6mdNkko2VvGCyZJKhrDkcH6UjLJboYnLpNx24M1Cei1iH/T1B5+/AvBa/ScGIdNgh/I4ySGBdkJyAgCqGuwJNtOfRD2pxsCDapF6BiUECrsU+nEc77GQBbvQL5GNTaRx0zRNi7EibtHTh5FYYyLMFmMXDaBIk/22iyNTTA+URp6USrFm9EorQAS1kECvihUip3Zyhe1tGD5a41lBGTto/pltE+m/0QJM63v4P2XnXSKcIqUkXoL 6ZyNB6Hx VB7zwTq3AhSoxTq+DDsa7/3FHha5l4l4DQ9+9hz2MMW1mPY8/MxHVLuKYnmo3P67+HKeIV7ZcnyZ82YCW1/Zz5zLa9QTEt4ek86ur5b4D3perxoq5QmegxUe6AF1MI3Fo2ULoBraMV99GgIyspxv2kR93p2AXJ2VSRKKdh9s8J/eExC9MW5w5/BR/G9Z3YUFX4tSGjbiE/40aY1LrthJ4m8BHe2MfgTOtMu+oVwje2EGknl+kk1zG34q8Nwrngi6YRgY0gg8V1BX1Zz4+NH5k89Det5m3vAx12PzB X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Every predicate allocation includes a MAX_FILTER_STR_VAL (256) char array in the regex field, even if the predicate function does not use the field. A later commit will introduce a dynamically allocated cpumask to struct filter_pred, which will require a dedicated freeing function. Bite the bullet and make filter_pred.regex dynamically allocated. While at it, reorder the fields of filter_pred to fill in the byte holes. The struct now fits on a single cacheline. No change in behaviour intended. The kfree()'s were patched via Coccinelle: @@ struct filter_pred *pred; @@ -kfree(pred); +free_predicate(pred); Signed-off-by: Valentin Schneider --- kernel/trace/trace_events_filter.c | 64 ++++++++++++++++++------------ 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 1dad64267878c..91fc9990107f1 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -70,15 +70,15 @@ enum filter_pred_fn { }; struct filter_pred { - enum filter_pred_fn fn_num; - u64 val; - u64 val2; - struct regex regex; + struct regex *regex; unsigned short *ops; struct ftrace_event_field *field; - int offset; + u64 val; + u64 val2; + enum filter_pred_fn fn_num; + int offset; int not; - int op; + int op; }; /* @@ -186,6 +186,14 @@ enum { PROCESS_OR = 4, }; +static void free_predicate(struct filter_pred *pred) +{ + if (pred) { + kfree(pred->regex); + kfree(pred); + } +} + /* * Without going into a formal proof, this explains the method that is used in * parsing the logical expressions. @@ -623,7 +631,7 @@ predicate_parse(const char *str, int nr_parens, int nr_preds, kfree(inverts); if (prog_stack) { for (i = 0; prog_stack[i].pred; i++) - kfree(prog_stack[i].pred); + free_predicate(prog_stack[i].pred); kfree(prog_stack); } return ERR_PTR(ret); @@ -750,7 +758,7 @@ static int filter_pred_string(struct filter_pred *pred, void *event) char *addr = (char *)(event + pred->offset); int cmp, match; - cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len); + cmp = pred->regex->match(addr, pred->regex, pred->regex->field_len); match = cmp ^ pred->not; @@ -763,7 +771,7 @@ static __always_inline int filter_pchar(struct filter_pred *pred, char *str) int len; len = strlen(str) + 1; /* including tailing '\0' */ - cmp = pred->regex.match(str, &pred->regex, len); + cmp = pred->regex->match(str, pred->regex, len); match = cmp ^ pred->not; @@ -813,7 +821,7 @@ static int filter_pred_strloc(struct filter_pred *pred, void *event) char *addr = (char *)(event + str_loc); int cmp, match; - cmp = pred->regex.match(addr, &pred->regex, str_len); + cmp = pred->regex->match(addr, pred->regex, str_len); match = cmp ^ pred->not; @@ -836,7 +844,7 @@ static int filter_pred_strrelloc(struct filter_pred *pred, void *event) char *addr = (char *)(&item[1]) + str_loc; int cmp, match; - cmp = pred->regex.match(addr, &pred->regex, str_len); + cmp = pred->regex->match(addr, pred->regex, str_len); match = cmp ^ pred->not; @@ -874,7 +882,7 @@ static int filter_pred_comm(struct filter_pred *pred, void *event) { int cmp; - cmp = pred->regex.match(current->comm, &pred->regex, + cmp = pred->regex->match(current->comm, pred->regex, TASK_COMM_LEN); return cmp ^ pred->not; } @@ -1004,7 +1012,7 @@ enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not) static void filter_build_regex(struct filter_pred *pred) { - struct regex *r = &pred->regex; + struct regex *r = pred->regex; char *search; enum regex_type type = MATCH_FULL; @@ -1169,7 +1177,7 @@ static void free_prog(struct event_filter *filter) return; for (i = 0; prog[i].pred; i++) - kfree(prog[i].pred); + free_predicate(prog[i].pred); kfree(prog); } @@ -1553,9 +1561,12 @@ static int parse_pred(const char *str, void *data, goto err_free; } - pred->regex.len = len; - strncpy(pred->regex.pattern, str + s, len); - pred->regex.pattern[len] = 0; + pred->regex = kzalloc(sizeof(*pred->regex), GFP_KERNEL); + if (!pred->regex) + goto err_mem; + pred->regex->len = len; + strncpy(pred->regex->pattern, str + s, len); + pred->regex->pattern[len] = 0; /* This is either a string, or an integer */ } else if (str[i] == '\'' || str[i] == '"') { @@ -1597,9 +1608,12 @@ static int parse_pred(const char *str, void *data, goto err_free; } - pred->regex.len = len; - strncpy(pred->regex.pattern, str + s, len); - pred->regex.pattern[len] = 0; + pred->regex = kzalloc(sizeof(*pred->regex), GFP_KERNEL); + if (!pred->regex) + goto err_mem; + pred->regex->len = len; + strncpy(pred->regex->pattern, str + s, len); + pred->regex->pattern[len] = 0; filter_build_regex(pred); @@ -1608,7 +1622,7 @@ static int parse_pred(const char *str, void *data, } else if (field->filter_type == FILTER_STATIC_STRING) { pred->fn_num = FILTER_PRED_FN_STRING; - pred->regex.field_len = field->size; + pred->regex->field_len = field->size; } else if (field->filter_type == FILTER_DYN_STRING) { pred->fn_num = FILTER_PRED_FN_STRLOC; @@ -1691,10 +1705,10 @@ static int parse_pred(const char *str, void *data, return i; err_free: - kfree(pred); + free_predicate(pred); return -EINVAL; err_mem: - kfree(pred); + free_predicate(pred); return -ENOMEM; } @@ -2287,8 +2301,8 @@ static int ftrace_function_set_filter_pred(struct filter_pred *pred, return ret; return __ftrace_function_set_filter(pred->op == OP_EQ, - pred->regex.pattern, - pred->regex.len, + pred->regex->pattern, + pred->regex->len, data); }