Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1385127ybv; Thu, 20 Feb 2020 19:16:57 -0800 (PST) X-Google-Smtp-Source: APXvYqzlKLZBIM4W4loGTsHD//jqEKKtSJhp2EcKXrKoR1dvGnS8t+7yze2yYyGCVySzSy21pBtT X-Received: by 2002:aca:4ad8:: with SMTP id x207mr264050oia.55.1582255016997; Thu, 20 Feb 2020 19:16:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582255016; cv=none; d=google.com; s=arc-20160816; b=HNCkD1O+m+UPyZANb5puKRA4Yh5dplws1FEna+irGNhk2FkRudP/9B6r3fNqBJYEn8 x7fcCQ/xGX834RlW23v/xjhPcSs3V5AeNv7581RQX2cxvmH8Xa+TX0gEV/+u+l0lbsWX krmqqk5w4izimeMZ/I26L0uatv+B8ko3+0HmURf5XzfM4uM8MlqZxTG7hzkUbUu5Ch7g O72LCrILAvNNd/eBDBpWFyZHImAUSO4iG32ortXjhbFib50+FHF4BPWtJbiPeptdQGvv CN7ZopBwyxp4+XAFIrynp6SCACqR+rVB3G2CWcUIVcWzR+2LEQ/EacCJaR4UDMlIoE3S 0DeQ== 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:date:subject:cc:to:from; bh=Lnbr+9mopaBW4MUL5Sd2oUwzebAMqjuNstRTIzvigNY=; b=GR0kWM9r4vMntnZTakVjL0gsTYrv4gNg7OfyTrHdfVwkzGNZBx/y2YvgaVG+lW7a5O 5WhhV6d4DeOXg+7dpcAkF7YOTKZ3C/h/qCAI2gGlId6IdPz02umYpmMVj3vBtx7wFyQ1 q9k0KmXSh0a26fJ9dao2PTtqH4cZbqNNx6KkoKRA0nXRv/3T4GnaaPK2sMGSt9q5oFbI M8k/vFt25DMiYKS4FbrxM+wYr21QamaEWFywLON0ruASCWRHEwP1TUWJvgS8BDOHbf+7 IG/Y83x392u3XWDMXQupQHTogARmQBnjElZtxiH56fBskUlY0aBQQG64+IeTa7duesdb +EWQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h11si774429otr.197.2020.02.20.19.16.44; Thu, 20 Feb 2020 19:16:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729671AbgBUDQ2 (ORCPT + 99 others); Thu, 20 Feb 2020 22:16:28 -0500 Received: from mx2.suse.de ([195.135.220.15]:59522 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727488AbgBUDQ1 (ORCPT ); Thu, 20 Feb 2020 22:16:27 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 68BF4B202; Fri, 21 Feb 2020 03:16:24 +0000 (UTC) From: Michal Rostecki To: bpf@vger.kernel.org Cc: Michal Rostecki , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andrii Nakryiko , Quentin Monnet , Jakub Kicinski , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Shuah Khan , linux-kselftest@vger.kernel.org (open list:KERNEL SELFTEST FRAMEWORK) Subject: [PATCH bpf-next v2 2/5] bpftool: Make probes which emit dmesg warnings optional Date: Fri, 21 Feb 2020 04:16:57 +0100 Message-Id: <20200221031702.25292-3-mrostecki@opensuse.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200221031702.25292-1-mrostecki@opensuse.org> References: <20200221031702.25292-1-mrostecki@opensuse.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Probes related to bpf_probe_write_user and bpf_trace_printk helpers emit dmesg warnings which might be confusing for people running bpftool on production environments. This change filters them out by default and introduces the new positional argument "full" which enables all available probes. Signed-off-by: Michal Rostecki --- tools/bpf/bpftool/feature.c | 80 +++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/tools/bpf/bpftool/feature.c b/tools/bpf/bpftool/feature.c index 345e4a2b4f53..0731804b8160 100644 --- a/tools/bpf/bpftool/feature.c +++ b/tools/bpf/bpftool/feature.c @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -22,6 +23,9 @@ # define PROC_SUPER_MAGIC 0x9fa0 #endif +/* Regex pattern for filtering out probes which emit dmesg warnings */ +#define FILTER_OUT_PATTERN "(trace|write_user)" + enum probe_component { COMPONENT_UNSPEC, COMPONENT_KERNEL, @@ -57,6 +61,35 @@ static void uppercase(char *str, size_t len) str[i] = toupper(str[i]); } +/* Filtering utility functions */ + +static bool +check_filters(const char *name, regex_t *filter_out) +{ + char err_buf[100]; + int ret; + + /* Do not probe if filter_out was defined and string matches against the + * pattern. + */ + if (filter_out) { + ret = regexec(filter_out, name, 0, NULL, 0); + switch (ret) { + case 0: + return false; + case REG_NOMATCH: + break; + default: + regerror(ret, filter_out, err_buf, ARRAY_SIZE(err_buf)); + p_err("could not match regex: %s", err_buf); + free(filter_out); + exit(1); + } + } + + return true; +} + /* Printing utility functions */ static void @@ -515,7 +548,8 @@ probe_map_type(enum bpf_map_type map_type, const char *define_prefix, static void probe_helpers_for_progtype(enum bpf_prog_type prog_type, bool supported_type, - const char *define_prefix, __u32 ifindex) + const char *define_prefix, regex_t *filter_out, + __u32 ifindex) { const char *ptype_name = prog_type_name[prog_type]; char feat_name[128]; @@ -542,6 +576,9 @@ probe_helpers_for_progtype(enum bpf_prog_type prog_type, bool supported_type, } for (id = 1; id < ARRAY_SIZE(helper_name); id++) { + if (!check_filters(helper_name[id], filter_out)) + continue; + if (!supported_type) res = false; else @@ -634,7 +671,8 @@ section_program_types(bool *supported_types, const char *define_prefix, define_prefix); for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++) - probe_prog_type(i, supported_types, define_prefix, ifindex); + probe_prog_type(i, supported_types, define_prefix, + ifindex); print_end_section(); } @@ -655,7 +693,8 @@ static void section_map_types(const char *define_prefix, __u32 ifindex) } static void -section_helpers(bool *supported_types, const char *define_prefix, __u32 ifindex) +section_helpers(bool *supported_types, const char *define_prefix, + regex_t *filter_out, __u32 ifindex) { unsigned int i; @@ -681,7 +720,7 @@ section_helpers(bool *supported_types, const char *define_prefix, __u32 ifindex) define_prefix); for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++) probe_helpers_for_progtype(i, supported_types[i], - define_prefix, ifindex); + define_prefix, filter_out, ifindex); print_end_section(); } @@ -701,8 +740,13 @@ static int do_probe(int argc, char **argv) enum probe_component target = COMPONENT_UNSPEC; const char *define_prefix = NULL; bool supported_types[128] = {}; + regex_t *filter_out = NULL; + bool full_mode = false; + char regerror_buf[100]; __u32 ifindex = 0; char *ifname; + int reg_ret; + int ret = 0; /* Detection assumes user has sufficient privileges (CAP_SYS_ADMIN). * Let's approximate, and restrict usage to root user only. @@ -740,6 +784,9 @@ static int do_probe(int argc, char **argv) strerror(errno)); return -1; } + } else if (is_prefix(*argv, "full")) { + full_mode = true; + NEXT_ARG(); } else if (is_prefix(*argv, "macros") && !define_prefix) { define_prefix = ""; NEXT_ARG(); @@ -764,6 +811,22 @@ static int do_probe(int argc, char **argv) } } + /* If full mode is not acivated, filter out probes which emit dmesg + * messages. + */ + if (!full_mode) { + filter_out = malloc(sizeof(regex_t)); + reg_ret = regcomp(filter_out, FILTER_OUT_PATTERN, REG_EXTENDED); + if (reg_ret) { + regerror(reg_ret, filter_out, regerror_buf, + ARRAY_SIZE(regerror_buf)); + p_err("could not compile regex: %s", + regerror_buf); + ret = -1; + goto cleanup; + } + } + if (json_output) { define_prefix = NULL; jsonw_start_object(json_wtr); @@ -775,7 +838,7 @@ static int do_probe(int argc, char **argv) goto exit_close_json; section_program_types(supported_types, define_prefix, ifindex); section_map_types(define_prefix, ifindex); - section_helpers(supported_types, define_prefix, ifindex); + section_helpers(supported_types, define_prefix, filter_out, ifindex); section_misc(define_prefix, ifindex); exit_close_json: @@ -783,7 +846,10 @@ static int do_probe(int argc, char **argv) /* End root object */ jsonw_end_object(json_wtr); - return 0; +cleanup: + free(filter_out); + + return ret; } static int do_help(int argc, char **argv) @@ -794,7 +860,7 @@ static int do_help(int argc, char **argv) } fprintf(stderr, - "Usage: %s %s probe [COMPONENT] [macros [prefix PREFIX]]\n" + "Usage: %s %s probe [COMPONENT] [full] [macros [prefix PREFIX]]\n" " %s %s help\n" "\n" " COMPONENT := { kernel | dev NAME }\n" -- 2.25.0