From patchwork Wed Jul 5 18:12:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Valentin Schneider X-Patchwork-Id: 13302551 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 6C296EB64DA for ; Wed, 5 Jul 2023 18:15:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 08D6C8D0005; Wed, 5 Jul 2023 14:15:53 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 03D0C8D0001; Wed, 5 Jul 2023 14:15:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DD2518D0005; Wed, 5 Jul 2023 14:15:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id CB0658D0001 for ; Wed, 5 Jul 2023 14:15:52 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 6FB19405DE for ; Wed, 5 Jul 2023 18:15:52 +0000 (UTC) X-FDA: 80978361744.05.4213411 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf20.hostedemail.com (Postfix) with ESMTP id 851A51C0016 for ; Wed, 5 Jul 2023 18:15:50 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=b+OYW+BX; spf=pass (imf20.hostedemail.com: domain of vschneid@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=vschneid@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1688580950; 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=cr2h91iK1BhRzl41+qr9b8AIAdoW4uuXRZNrsLrfkns=; b=kZGm6XxyiqCQm/lbIj/ib41T3UDTE/scHnstopLoi12BNRFveeu270HoOrSbSGos/dMI62 CDwwzWhMCwPQRpoHl0joSlcXsBYe1gQUH/dsX5dqH2Ee6oE9oRYZ35ehU0ETxxJKul1jTS 0IqkDMpyX/kNyRRr9GxPu+vKEnd1qr8= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1688580950; a=rsa-sha256; cv=none; b=Qy28bRPhIgdq6gdKAVtwH3UrMjo8YfdFaCsNEwtX5AS2F874s2gnHLsmZVuPLOMB+EY+vo Df/tYeryZnE7d6IiiYvUw5ezid5ZS705ITu/+wf69hjokmxkmD8jemVTXy0byhiB23a7Ft L9EFFgRaOy7mfVj/CNzoDPRaand9X8s= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=b+OYW+BX; spf=pass (imf20.hostedemail.com: domain of vschneid@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=vschneid@redhat.com; dmarc=pass (policy=none) header.from=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1688580949; 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=cr2h91iK1BhRzl41+qr9b8AIAdoW4uuXRZNrsLrfkns=; b=b+OYW+BXhwoGj/X27Y79LkB/g9Jbat2JjemWKHAZ3w03oLSIsefgjEiwWMNBv1HtDhsx4I 89fOPmjmTDq1PVKuBOt50rHdmpd/mRz6Zw4AohRRqf9q+pB4D8A8aJTP4kkmDiR5MTYsbU rv0I9+co2x3HvVcZyTF3eXpWhhpzJ1A= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-638-Nhv5uZDOOuONs0L1KaIvxQ-1; Wed, 05 Jul 2023 14:15:46 -0400 X-MC-Unique: Nhv5uZDOOuONs0L1KaIvxQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 5FD79800C7F; Wed, 5 Jul 2023 18:15:44 +0000 (UTC) Received: from vschneid.remote.csb (unknown [10.42.28.164]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0565A18EB4; Wed, 5 Jul 2023 18:15:37 +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 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" , Andrew Morton , Uladzislau Rezki , Christoph Hellwig , Lorenzo Stoakes , Josh Poimboeuf , 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 01/14] tracing/filters: Dynamically allocate filter_pred.regex Date: Wed, 5 Jul 2023 19:12:43 +0100 Message-Id: <20230705181256.3539027-2-vschneid@redhat.com> In-Reply-To: <20230705181256.3539027-1-vschneid@redhat.com> References: <20230705181256.3539027-1-vschneid@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 X-Rspamd-Queue-Id: 851A51C0016 X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: 8z3qwjwg4z6p35oy6kxnjdjrgearb5zi X-HE-Tag: 1688580950-353856 X-HE-Meta: U2FsdGVkX1/TM1X7toMdssz0QXys5hxtrCZ+EjhtvUKsV3WyTsVaYBTVgaIXbErc2Zb8wcplAEipQAP8VKJDfbsrrbezwBkdy7zGVSAyoRHe41pzTy0cjM5IGxAhj0yNQsWBENA7hUX/MPyWgvdBAyV1YSz0xXQfANSkDwFplgGg4Gmse+/ZRmQ9AxedLa8fxgBr6b8Ghw5ysPXkObNku/zu16Aj3kdiwaQ9kfNv7jWB0Yt/nxaLz5gRzwJ+XaIN8qzyCH6Fhlr3+6y3MiLAZ/xplvLcySFJDdX+P0xbomvkduBqC7LMtMwiPwk4/EdrBa/YHRphGiIdigif5owkTc4XEQ1KLW/PHNTfP86KcH6/HOHgVU4jrPBEPxDAUc1T1VIm5avnNX8rATQ2czFiL9Q6Afsfx4LCbaiU8oHQXqXyHO0Kqu28xeHQoqSiBdEoGGy+I4IVNrSZFVmUVP728eS1W/EkhVDcdal/q8ziTo8d+8pZEVje0yBPMYA7nIPVtWm8fVy857nyl/U4sHxKyttPpE/HL7aXKRck723rm1xZFDISlLDMn6XM551UUPrMDs5mqnLvUnAduSgkXvQQjrVuFc29lUjFafeY3lkzTq0gGkiZMXfkzfWYoaV5+G3oatJuDsVz+jluvNTDYmYbIoF2GX6qJcveBoFrjDTs29P74m1aJuK9+A2MXCRtoFws6e/tabCrr3qRhNDoO5NvJwJe3WOTzfbncXx0tqktmIYxZlJvYLRKVAJ0ku7h520gRqRtKyv+m9kOy4CNuJZ8Rqv5BsWHkHFrgx3D2p+fzmiNIFzot1YMeO3a3aLjylWnq//rMjHKPYr+WwKulg9z64AA4faiYNO3Uf8UaIJrUKHPPb4npy5FEDEr8Q9CTTVwgaNYsR0x+yEa6Sfpn4JAJSH/ue47wevraO7FZuvL9VP3nZdOmzXud8inWkwyNQmt4mZ1VcpFFsWelzSCgUM oQa5bgzV HGXkploUzld7k07Ev6JWLsgWz7N/zfE7zAS+eCNQ5KlKW+xWbgPAfzW75siw6zWyjcr+3tavEpf6+GgAmsMNolIYIXtzmx9Q9asl0DeFM6C2Mvh9FvRqs5p65LZY0zlM5KR7Xz5CjjL0HspF/qmZ0qPq7shbgeYO44WP80VfG7rmWqmWOw25ZlqX97qOqTo+K53EeyJwwkG43jq872fTg4KLEQwBP6jAxUUu+ 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 | 62 ++++++++++++++++++------------ 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 1dad64267878c..d999a218fe833 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,12 @@ enum { PROCESS_OR = 4, }; +static void free_predicate(struct filter_pred *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 +629,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 +756,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 +769,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 +819,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 +842,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 +880,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 +1010,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 +1175,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 +1559,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 +1606,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 +1620,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 +1703,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 +2299,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); }