From patchwork Tue Jan 10 22:19:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13095713 X-Patchwork-Delegate: bpf@iogearbox.net 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 41F13C54EBC for ; Tue, 10 Jan 2023 22:20:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233556AbjAJWUc (ORCPT ); Tue, 10 Jan 2023 17:20:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37690 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233693AbjAJWU1 (ORCPT ); Tue, 10 Jan 2023 17:20:27 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA0135D8B5 for ; Tue, 10 Jan 2023 14:20:25 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id k204-20020a256fd5000000b007b8b040bc50so12642609ybc.1 for ; Tue, 10 Jan 2023 14:20:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=7v/gEXdtTx+UxkZcAUgCVgz4MqYf6krsrfnmQSxx5Nk=; b=PVrvr2OhQFTUO9zDrH5+2bNwVFqzBYaqjf4hDvEr10wr+zRc5//vzbPS9ggZSCWPfC 36TUo5BG7B8TkedHGtGVN2hi3FKU0/0IPbtRMt6oLWxVbgyfiBi/JwhyOQ9mrRzQ+rmn U0DRvEz36y6B+ETuwktmXn/HAr2e4DC7uDZ17DROPT89WL6WZa3Q5woCWaCwOIKp+ep7 rA8MJ/3ZD7oa6ukMV9OmnaQ0IzvWquQc/+RCW1cJJN5pz4NzTHh14Tjt4c7U82HtGv1k QabcgkXXuEptpfHctVAR8MIzbxgVBLAYpU14CFESsjoWuv0T+Eo4zNIMmKB/cGnUXsWh utwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7v/gEXdtTx+UxkZcAUgCVgz4MqYf6krsrfnmQSxx5Nk=; b=5bC0ANFYL87d+njsxA1/xBfpyWEh4H5RxSqc552J18xn9ySSHCLPrXA8yrnOBzw6mg Q5wwAE3+r156ba2Iaq8TI0s6Opst8RD/CNzLNum4mgaDa8W5Ivw5Th6eUB9uiea8Q39N NEeS85L/+RY31s1+9uZVEsVWLmcaxGWifYliRh4tYQ9AbSxjEHK9xQbNJOgzJ6cVNl6+ ePDRu6O1jRAgGArw32/7iF0ONf3UHFYJtKtBOamcQLGjunvYsz08TY5T6rnNihGkBj5y 1Yttz9729LdVsCRi/7ceIdwY/29uLQE3HphASd3BE4U5T7w9PnV24QF8TmmXOyq7STcb H9vg== X-Gm-Message-State: AFqh2kqJ8cTyu55ryrD8oDn/DRIB3gLoPeJGboxLejs+9qZ2FdbjBQSi NBwZ2Oc2nSEZZB5O69D6I5+4U7mt8Zye X-Google-Smtp-Source: AMrXdXuLSIM1R2M2WKOVVqSZXBrLkDMxsBuumbJODjFU7Qxn1OGo2/6wdDF991wspJJd0u54TfIqk1msGa0+ X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:cebf:c37e:8184:56]) (user=irogers job=sendgmr) by 2002:a0d:d583:0:b0:3ec:a0cb:550 with SMTP id x125-20020a0dd583000000b003eca0cb0550mr1240169ywd.3.1673389225104; Tue, 10 Jan 2023 14:20:25 -0800 (PST) Date: Tue, 10 Jan 2023 14:19:57 -0800 In-Reply-To: <20230110222003.1591436-1-irogers@google.com> Message-Id: <20230110222003.1591436-2-irogers@google.com> Mime-Version: 1.0 References: <20230110222003.1591436-1-irogers@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Subject: [PATCH v1 1/7] perf llvm: Fix inadvertent file creation From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Nathan Chancellor , Nick Desaulniers , Tom Rix , Nicolas Schier , Masahiro Yamada , Athira Rajeev , Christy Lee , Andrii Nakryiko , Ravi Bangoria , Leo Yan , Yang Jihong , Qi Liu , James Clark , Adrian Hunter , "Masami Hiramatsu (Google)" , Kan Liang , Sean Christopherson , Zhengjun Xing , Rob Herring , Xin Gao , Zechuan Chen , Jason Wang , Christophe JAILLET , Stephane Eranian , German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, llvm@lists.linux.dev Cc: Ian Rogers Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org The LLVM template is first echo-ed into command_out and then command_out executed. The echo surrounds the template with double quotes, however, the template itself may contain quotes. This is generally innocuous but in tools/perf/tests/bpf-script-test-prologue.c we see: ... SEC("func=null_lseek file->f_mode offset orig") ... where the first double quote ends the double quote of the echo, then the > redirects output into a file called f_mode. To avoid this inadvertent behavior substitute redirects and similar characters to be ASCII control codes, then substitute the output in the echo back again. Fixes: 5eab5a7ee032 ("perf llvm: Display eBPF compiling command in debug output") Signed-off-by: Ian Rogers --- tools/perf/util/llvm-utils.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c index 650ffe336f3a..4e8e243a6e4b 100644 --- a/tools/perf/util/llvm-utils.c +++ b/tools/perf/util/llvm-utils.c @@ -531,14 +531,37 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, pr_debug("llvm compiling command template: %s\n", template); + /* + * Below, substitute control characters for values that can cause the + * echo to misbehave, then substitute the values back. + */ err = -ENOMEM; - if (asprintf(&command_echo, "echo -n \"%s\"", template) < 0) + if (asprintf(&command_echo, "echo -n \a%s\a", template) < 0) goto errout; +#define SWAP_CHAR(a, b) do { if (*p == a) *p = b; } while (0) + for (char *p = command_echo; *p; p++) { + SWAP_CHAR('<', '\001'); + SWAP_CHAR('>', '\002'); + SWAP_CHAR('"', '\003'); + SWAP_CHAR('\'', '\004'); + SWAP_CHAR('|', '\005'); + SWAP_CHAR('&', '\006'); + SWAP_CHAR('\a', '"'); + } err = read_from_pipe(command_echo, (void **) &command_out, NULL); if (err) goto errout; + for (char *p = command_out; *p; p++) { + SWAP_CHAR('\001', '<'); + SWAP_CHAR('\002', '>'); + SWAP_CHAR('\003', '"'); + SWAP_CHAR('\004', '\''); + SWAP_CHAR('\005', '|'); + SWAP_CHAR('\006', '&'); + } +#undef SWAP_CHAR pr_debug("llvm compiling command : %s\n", command_out); err = read_from_pipe(template, &obj_buf, &obj_buf_sz); From patchwork Tue Jan 10 22:19:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13095714 X-Patchwork-Delegate: bpf@iogearbox.net 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BDFC1C46467 for ; Tue, 10 Jan 2023 22:20:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234920AbjAJWUs (ORCPT ); Tue, 10 Jan 2023 17:20:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37812 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234716AbjAJWUi (ORCPT ); Tue, 10 Jan 2023 17:20:38 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D944A631BA for ; Tue, 10 Jan 2023 14:20:36 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-4597b0ff5e9so143312907b3.10 for ; Tue, 10 Jan 2023 14:20:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=wXlKtQGeWTp7vou3jM8pEXClHMn0X8ibzVPnBb6ixuM=; b=hjTIUiM3nzSYOud7leDVomzWDX3omcRH7XxTp1cWtIJhcikMVufN+ADzaTNdzeYkj3 HC8m5Q1q0N4tWXzZdz62Ir1LPgLAO+IhU/NZoaVR4GFeUM6+9gdxTBxUG6xXuEsppqxe 4vnw6QbBUijTFsZg9n4sHratLsuRyEm4BjeV3UDRMt9++3Yh3Cq54hMnLSk3/4AROLWi fsELZGJJQe97BgTCi3vctbH4g6noIJFn734K3HKJyuYmN0ckIZ3X1C+cnuvxMG2MVHUU +jYZGmTxMrdoDqn9BRXhS5pXUVJNJf1poMGdTSp9IsSQGq4MmAoB+vrv5a5KcpnoI+PE Ogzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=wXlKtQGeWTp7vou3jM8pEXClHMn0X8ibzVPnBb6ixuM=; b=R42xOgimp4hrpIu/f4y/hxyR9LwN4zvhjI5illmi6TnwLg2Oyo5SV1jz9gJJa69ANs KLSvJzuIpLj8Fbf7bzcs+25P8fG02LrivHqe8w3tovxvxhuTsS8NhZPrPZcYDkaRkXeL fFbUy2RT2vvshBwDJhKZjLiWeBg95lg34GCyK2oznQgdttAJxLFXVAD9D+ul97mBmkbJ 73VNZv2iSBBtq+KAzCsOzPzTu+MVrAzR1dRyb4KCXkH7ygWFEPl4QKACkEDDD21z75KW dyDMENuh2XV5Cxy9WzB6HkP3VoyEeDsyaSPQOiMxrwlVPCP9eAxHArWLmxzon3FsLbK0 +brQ== X-Gm-Message-State: AFqh2kpYdil9XJJR+xrC/XmCyxG195DJaxD0HFLNF+aNHuYWhBJJzAft gsVTV8TKNv/qr1rvX+Sq8IvFDlhT7ASO X-Google-Smtp-Source: AMrXdXtsOl1f0Fb5fgvGa0gNKl1sLtoEETV+mVGmD2eGj8R7T4gSvIGR7mJ2SG2Ofoi48bTKkMaSZ7HQKeQj X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:cebf:c37e:8184:56]) (user=irogers job=sendgmr) by 2002:a0d:e60b:0:b0:3ec:2e89:409c with SMTP id p11-20020a0de60b000000b003ec2e89409cmr1362309ywe.20.1673389236102; Tue, 10 Jan 2023 14:20:36 -0800 (PST) Date: Tue, 10 Jan 2023 14:19:58 -0800 In-Reply-To: <20230110222003.1591436-1-irogers@google.com> Message-Id: <20230110222003.1591436-3-irogers@google.com> Mime-Version: 1.0 References: <20230110222003.1591436-1-irogers@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Subject: [PATCH v1 2/7] tools lib: Move strbuf to libapi From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Nathan Chancellor , Nick Desaulniers , Tom Rix , Nicolas Schier , Masahiro Yamada , Athira Rajeev , Christy Lee , Andrii Nakryiko , Ravi Bangoria , Leo Yan , Yang Jihong , Qi Liu , James Clark , Adrian Hunter , "Masami Hiramatsu (Google)" , Kan Liang , Sean Christopherson , Zhengjun Xing , Rob Herring , Xin Gao , Zechuan Chen , Jason Wang , Christophe JAILLET , Stephane Eranian , German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, llvm@lists.linux.dev Cc: Ian Rogers Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Move strbuf, appendable C strings, to libapi so that other libraries may use it. Signed-off-by: Ian Rogers --- tools/lib/api/Build | 1 + tools/lib/api/Makefile | 2 +- tools/{perf/util => lib/api}/strbuf.c | 5 +++-- tools/{perf/util => lib/api}/strbuf.h | 0 tools/perf/bench/evlist-open-close.c | 2 +- tools/perf/builtin-help.c | 2 +- tools/perf/builtin-list.c | 2 +- tools/perf/util/Build | 1 - tools/perf/util/cache.h | 2 +- tools/perf/util/dwarf-aux.c | 2 +- tools/perf/util/env.c | 2 +- tools/perf/util/header.c | 2 +- tools/perf/util/metricgroup.c | 2 +- tools/perf/util/pfm.c | 2 +- tools/perf/util/pmu.c | 2 +- tools/perf/util/probe-event.c | 2 +- tools/perf/util/probe-file.c | 2 +- tools/perf/util/probe-finder.c | 2 +- tools/perf/util/sort.c | 2 +- 19 files changed, 19 insertions(+), 18 deletions(-) rename tools/{perf/util => lib/api}/strbuf.c (97%) rename tools/{perf/util => lib/api}/strbuf.h (100%) diff --git a/tools/lib/api/Build b/tools/lib/api/Build index 6e2373db5598..2eab5abbad50 100644 --- a/tools/lib/api/Build +++ b/tools/lib/api/Build @@ -3,6 +3,7 @@ libapi-y += fs/ libapi-y += cpu.o libapi-y += debug.o libapi-y += str_error_r.o +libapi-y += strbuf.o $(OUTPUT)str_error_r.o: ../str_error_r.c FORCE $(call rule_mkdir) diff --git a/tools/lib/api/Makefile b/tools/lib/api/Makefile index 044860ac1ed1..dc2d810dfbad 100644 --- a/tools/lib/api/Makefile +++ b/tools/lib/api/Makefile @@ -99,7 +99,7 @@ install_lib: $(LIBFILE) $(call do_install_mkdir,$(libdir_SQ)); \ cp -fpR $(LIBFILE) $(DESTDIR)$(libdir_SQ) -HDRS := cpu.h debug.h io.h +HDRS := cpu.h debug.h io.h strbuf.h FD_HDRS := fd/array.h FS_HDRS := fs/fs.h fs/tracing_path.h INSTALL_HDRS_PFX := $(DESTDIR)$(prefix)/include/api diff --git a/tools/perf/util/strbuf.c b/tools/lib/api/strbuf.c similarity index 97% rename from tools/perf/util/strbuf.c rename to tools/lib/api/strbuf.c index a64a37628f12..4639b2d02e62 100644 --- a/tools/perf/util/strbuf.c +++ b/tools/lib/api/strbuf.c @@ -1,6 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -#include "cache.h" -#include "debug.h" +#include "debug-internal.h" #include "strbuf.h" #include #include @@ -43,6 +42,7 @@ char *strbuf_detach(struct strbuf *sb, size_t *sz) return res; } +#define alloc_nr(x) (((x)+16)*3/2) int strbuf_grow(struct strbuf *sb, size_t extra) { char *buf; @@ -69,6 +69,7 @@ int strbuf_grow(struct strbuf *sb, size_t extra) sb->alloc = nr; return 0; } +#undef alloc_nr int strbuf_addch(struct strbuf *sb, int c) { diff --git a/tools/perf/util/strbuf.h b/tools/lib/api/strbuf.h similarity index 100% rename from tools/perf/util/strbuf.h rename to tools/lib/api/strbuf.h diff --git a/tools/perf/bench/evlist-open-close.c b/tools/perf/bench/evlist-open-close.c index 5a27691469ed..d8a8fcadb9ca 100644 --- a/tools/perf/bench/evlist-open-close.c +++ b/tools/perf/bench/evlist-open-close.c @@ -8,7 +8,7 @@ #include "../util/stat.h" #include "../util/evlist.h" #include "../util/evsel.h" -#include "../util/strbuf.h" +#include #include "../util/record.h" #include "../util/parse-events.h" #include "internal/threadmap.h" diff --git a/tools/perf/builtin-help.c b/tools/perf/builtin-help.c index 3976aebe3677..8874e1e0335b 100644 --- a/tools/perf/builtin-help.c +++ b/tools/perf/builtin-help.c @@ -6,7 +6,7 @@ */ #include "util/cache.h" #include "util/config.h" -#include "util/strbuf.h" +#include #include "builtin.h" #include #include "common-cmds.h" diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c index 137d73edb541..ca52227f311c 100644 --- a/tools/perf/builtin-list.c +++ b/tools/perf/builtin-list.c @@ -17,7 +17,7 @@ #include "util/metricgroup.h" #include "util/string2.h" #include "util/strlist.h" -#include "util/strbuf.h" +#include #include #include #include diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 79b9498886a2..5c68ab8c69f8 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -37,7 +37,6 @@ perf-y += libstring.o perf-y += bitmap.o perf-y += hweight.o perf-y += smt.o -perf-y += strbuf.o perf-y += string.o perf-y += strlist.o perf-y += strfilter.o diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 9f2e36ef5072..19e60decb24c 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -2,7 +2,7 @@ #ifndef __PERF_CACHE_H #define __PERF_CACHE_H -#include "strbuf.h" +#include #include #include "../ui/ui.h" diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c index b07414409771..673ddfeb938d 100644 --- a/tools/perf/util/dwarf-aux.c +++ b/tools/perf/util/dwarf-aux.c @@ -9,7 +9,7 @@ #include #include "debug.h" #include "dwarf-aux.h" -#include "strbuf.h" +#include #include "string2.h" /** diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c index 5b8cf6a421a4..3dc1c51a8335 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -10,7 +10,7 @@ #include #include #include -#include "strbuf.h" +#include struct perf_env perf_env; diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 404d816ca124..35067c22a47f 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -38,7 +38,7 @@ #include "cpumap.h" #include "pmu.h" #include "vdso.h" -#include "strbuf.h" +#include #include "build-id.h" #include "data.h" #include diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index b9c273ed080a..d1d21605715a 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -9,7 +9,7 @@ #include "debug.h" #include "evlist.h" #include "evsel.h" -#include "strbuf.h" +#include #include "pmu.h" #include "pmu-hybrid.h" #include "print-events.h" diff --git a/tools/perf/util/pfm.c b/tools/perf/util/pfm.c index ac3227ba769c..c82e7bc7c5ea 100644 --- a/tools/perf/util/pfm.c +++ b/tools/perf/util/pfm.c @@ -12,7 +12,7 @@ #include "util/parse-events.h" #include "util/pmu.h" #include "util/pfm.h" -#include "util/strbuf.h" +#include #include #include diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 2bdeb89352e7..4648ccf0b50a 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -27,7 +27,7 @@ #include "print-events.h" #include "header.h" #include "string2.h" -#include "strbuf.h" +#include #include "fncache.h" #include "pmu-hybrid.h" diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 0c24bc7afbca..e609970e2113 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -38,7 +38,7 @@ #include "probe-file.h" #include "session.h" #include "string2.h" -#include "strbuf.h" +#include #include #include diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index 3d50de3217d5..c1f1ef3f48d4 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -20,7 +20,7 @@ #include "dso.h" #include "color.h" #include "symbol.h" -#include "strbuf.h" +#include #include #include #include "probe-event.h" diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 54b49ce85c9f..4368a9dffc35 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -24,7 +24,7 @@ #include "dso.h" #include "debug.h" #include "intlist.h" -#include "strbuf.h" +#include #include "strlist.h" #include "symbol.h" #include "probe-finder.h" diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index e188f74698dd..32f00a340c0d 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -21,7 +21,7 @@ #include "evlist.h" #include "srcline.h" #include "strlist.h" -#include "strbuf.h" +#include #include "mem-events.h" #include "annotate.h" #include "event.h" From patchwork Tue Jan 10 22:19:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13095715 X-Patchwork-Delegate: bpf@iogearbox.net 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98ABBC54EBE for ; Tue, 10 Jan 2023 22:20:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234798AbjAJWUt (ORCPT ); Tue, 10 Jan 2023 17:20:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37908 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234797AbjAJWUq (ORCPT ); Tue, 10 Jan 2023 17:20:46 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F89363F4D for ; Tue, 10 Jan 2023 14:20:45 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id r8-20020a252b08000000b007b989d5e105so10838699ybr.11 for ; Tue, 10 Jan 2023 14:20:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=e+OL21tRhOI5FC8OP8rOHe4TMF297jaFfbFeRu1wlqg=; b=pAopMpFhTfX0jzenqkNBx67vQjfjd9TY0dEwmq4dnUUW/5FoxhH/tVN7EA6o41wxrx rsUBnMfLZxm5PQ3Gm0Z5qpVo9n/Dnw2t+GjNw3fXdMd4EbvEybnsF61808WRKPLXGEPX BP/2/BT6IOMQEJFjn/Laru90RARJ4roIZIz7Einhd/Z0P1NaLFrKvEfC1eWc4LMqSZvs b0T7fdriG8IC3vY8yB0wM/np9pfhaT10oOvYNSasEBMAIwRVJOVL3zjz2LA6Lhv6zmQq XBNkFoUi1yjwG7YzAhVBeRgAhvFBI7sfazm/WV9x3buWT4x5HgobueNTp6jLXWkx3t0D 8dBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=e+OL21tRhOI5FC8OP8rOHe4TMF297jaFfbFeRu1wlqg=; b=yXSfMn/c9/RdngNGcXCHdNNv5AHIPtNouqRoqU/5bmOwSn8h968XpTSjsNU9/r0+Ef 81G+0pqqbk1BB4cW2Q4aIbgfbmlY7U3dHosVGR6ie9XJqINYO2RQ8cFYxDYKqePfdpKL NBb9q2BIcZj4piaiR8evM6jbxllXGCOh3pjxuEpIRWdfcN7D5Q67WKJ6RT6UtBysTxIo peXjoPim2PibApdvMg7EQ+PoB6DWFfRX3JI/+mfESddzN1z2nmL84z1PhZgHlMIMxUC8 p84zWqNYXjEKLauUJ5olpOFvqWSkqaXXYkhB4AwMEmTQVPGmvmbUYzm1qNq9kJK2omfD Srag== X-Gm-Message-State: AFqh2koCBaNUyBG6qhx+iRb36rC//W3jHvE1v3Reo8xbbF5NvTBidI0x /f9+3VfIW5nU+nXgzqhfSULve0JYkhVG X-Google-Smtp-Source: AMrXdXulQqaqr6Cu/NW8mUaEtU/19rWhPKAZID8kQpT+uofH5KiblfeW6JI4Cfz9L3ukAKsgfkHBgFGgaTTP X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:cebf:c37e:8184:56]) (user=irogers job=sendgmr) by 2002:a25:804:0:b0:767:3057:9533 with SMTP id 4-20020a250804000000b0076730579533mr8371214ybi.454.1673389244250; Tue, 10 Jan 2023 14:20:44 -0800 (PST) Date: Tue, 10 Jan 2023 14:19:59 -0800 In-Reply-To: <20230110222003.1591436-1-irogers@google.com> Message-Id: <20230110222003.1591436-4-irogers@google.com> Mime-Version: 1.0 References: <20230110222003.1591436-1-irogers@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Subject: [PATCH v1 3/7] tools lib subcmd: Add run_command_strbuf From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Nathan Chancellor , Nick Desaulniers , Tom Rix , Nicolas Schier , Masahiro Yamada , Athira Rajeev , Christy Lee , Andrii Nakryiko , Ravi Bangoria , Leo Yan , Yang Jihong , Qi Liu , James Clark , Adrian Hunter , "Masami Hiramatsu (Google)" , Kan Liang , Sean Christopherson , Zhengjun Xing , Rob Herring , Xin Gao , Zechuan Chen , Jason Wang , Christophe JAILLET , Stephane Eranian , German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, llvm@lists.linux.dev Cc: Ian Rogers Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Often a command wants to be run in a shell with stdout placed in a string. This API mimics that of stdio's popen, running the given command (not argv array) with "/bin/sh -c" then appending the output from stdout to the buf argument. Signed-off-by: Ian Rogers --- tools/lib/subcmd/Makefile | 32 +++++++++++++++++++++++++++++--- tools/lib/subcmd/run-command.c | 30 ++++++++++++++++++++++++++++++ tools/lib/subcmd/run-command.h | 14 ++++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/tools/lib/subcmd/Makefile b/tools/lib/subcmd/Makefile index b87213263a5e..23174d013519 100644 --- a/tools/lib/subcmd/Makefile +++ b/tools/lib/subcmd/Makefile @@ -13,6 +13,7 @@ CC ?= $(CROSS_COMPILE)gcc LD ?= $(CROSS_COMPILE)ld AR ?= $(CROSS_COMPILE)ar +MKDIR = mkdir RM = rm -f MAKEFLAGS += --no-print-directory @@ -55,6 +56,17 @@ CFLAGS += -I$(srctree)/tools/include/ CFLAGS += $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) +LIBAPI_DIR = $(srctree)/tools/lib/api/ +ifneq ($(OUTPUT),) + LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi +else + LIBAPI_OUTPUT = $(CURDIR)/libapi +endif +LIBAPI_DESTDIR = $(LIBAPI_OUTPUT) +LIBAPI_INCLUDE = $(LIBAPI_DESTDIR)/include +LIBAPI = $(LIBAPI_OUTPUT)/libapi.a +CFLAGS += -I$(LIBAPI_OUTPUT)/include + SUBCMD_IN := $(OUTPUT)libsubcmd-in.o ifeq ($(LP64), 1) @@ -76,7 +88,9 @@ include $(srctree)/tools/build/Makefile.include all: fixdep $(LIBFILE) -$(SUBCMD_IN): FORCE +prepare: $(LIBAPI) + +$(SUBCMD_IN): FORCE prepare @$(MAKE) $(build)=libsubcmd $(LIBFILE): $(SUBCMD_IN) @@ -113,10 +127,22 @@ install_headers: $(INSTALL_HDRS) install: install_lib install_headers -clean: +$(LIBAPI_OUTPUT): + $(Q)$(MKDIR) -p $@ + +$(LIBAPI): FORCE | $(LIBAPI_OUTPUT) + $(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \ + DESTDIR=$(LIBAPI_DESTDIR) prefix= \ + $@ install_headers + +$(LIBAPI)-clean: + $(call QUIET_CLEAN, libapi) + $(Q)$(RM) -r -- $(LIBAPI_OUTPUT) + +clean: $(LIBAPI)-clean $(call QUIET_CLEAN, libsubcmd) $(RM) $(LIBFILE); \ find $(or $(OUTPUT),.) -name \*.o -or -name \*.o.cmd -or -name \*.o.d | xargs $(RM) FORCE: -.PHONY: clean FORCE +.PHONY: clean FORCE prepare diff --git a/tools/lib/subcmd/run-command.c b/tools/lib/subcmd/run-command.c index 5cdac2162532..e90b285b6720 100644 --- a/tools/lib/subcmd/run-command.c +++ b/tools/lib/subcmd/run-command.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "subcmd-util.h" #include "run-command.h" #include "exec-cmd.h" @@ -227,3 +228,32 @@ int run_command_v_opt(const char **argv, int opt) prepare_run_command_v_opt(&cmd, argv, opt); return run_command(&cmd); } + +int run_command_strbuf(const char *cmd, struct strbuf *buf) +{ + const char *argv[4] = { + "/bin/sh", + "-c", + cmd, + NULL + }; + struct child_process child = { + .argv = argv, + .out = -1, + }; + int err; + ssize_t read_sz; + + err = start_command(&child); + if (err) + return err; + + read_sz = strbuf_read(buf, child.out, 0); + + err = finish_command(&child); + close(child.out); + if (read_sz < 0) + return (int)read_sz; + + return err; +} diff --git a/tools/lib/subcmd/run-command.h b/tools/lib/subcmd/run-command.h index 17d969c6add3..1f7a2af9248c 100644 --- a/tools/lib/subcmd/run-command.h +++ b/tools/lib/subcmd/run-command.h @@ -58,4 +58,18 @@ int run_command(struct child_process *); #define RUN_COMMAND_STDOUT_TO_STDERR 4 int run_command_v_opt(const char **argv, int opt); +struct strbuf; +/** + * run_command_strbuf() - Run cmd using /bin/sh and place stdout in strbuf. + * @cmd: The command to run by "/bin/sh -c". + * @buf: The strbuf appended to by reading stdout. + * + * Similar to popen with fread, run the given command reading the stdout output + * to buf. As with popen, stderr output goes to the current processes stderr but + * may be redirected in cmd by using "2>&1". + * + * Return: 0 on success or a negative error code on failure. + */ +int run_command_strbuf(const char *cmd, struct strbuf *buf); + #endif /* __SUBCMD_RUN_COMMAND_H */ From patchwork Tue Jan 10 22:20:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13095716 X-Patchwork-Delegate: bpf@iogearbox.net 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3BD2C54EBC for ; Tue, 10 Jan 2023 22:21:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235238AbjAJWVv (ORCPT ); Tue, 10 Jan 2023 17:21:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38740 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235251AbjAJWVV (ORCPT ); Tue, 10 Jan 2023 17:21:21 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0777910B44 for ; Tue, 10 Jan 2023 14:20:57 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-434eb7c6fa5so143081087b3.14 for ; Tue, 10 Jan 2023 14:20:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=b4cDFSVYG43croOnEV27nNQKcdSJ0iRzIK+gxT25DWQ=; b=oWwqPFHv+dZCSeNo+f2delVO4bkS5CysJ1Fb9cTlI9zPxRA7uKaiJ7fzrQAE/gTePN yQdJfBq26Z53aSri1L4flICMFvFNUevMxBBdhNvHv8Ijb0Oku7b8R3i1GIZwAS7jcJ22 jMmWxbFtkBzDL/R9uaLOc+rwZEKLhEkSnycWiK+bJoz5ZUvP8k/r3gzwpyc58iJZ/qIR uFv/RK4kFlujjtJHI9F8csecrHrl/8oIz/UTVfp75WDyghQbB2noKVROCgEIL9/hytzp 05/J55rtJDAGcO6Q4BwMKuBUc0CZ06wbMj2tK5aFbb8NTedwer0JBGvwhthbuu/kH2CO qRSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=b4cDFSVYG43croOnEV27nNQKcdSJ0iRzIK+gxT25DWQ=; b=BbPV/gU/C9tzONg1XTk+nGq9m8fCHCxGXjXN48MxiyF1sVUhhQ7NjpGr5vsqGxIF9k iT1W1weDOAWqOuAconHF/3MWktt7AHJlTp1w/uW4eDomiAmqpeJtC8x8z3Muig52X0Gk pQqbzjyZyuR+rErwmxtjU/xKSfYRnl5yZ+91j7ndNhlEjN5eGNIO6MUOUsYvF/PeMnxX isAAooZ/NlIZBllBy+KKOMSKjCPfmG+6hd3jXfDDL6grhs5KYitqvu0tNCr293Ozf1Ji TCbry73nvYHi4Jvbo1+3qiKXS8HaC25O2Mexnne3H11JTPBGUS26z7C0VrCNsS1BiHaQ Rclg== X-Gm-Message-State: AFqh2kree/bZACQdqrJaCSkRaNEsffh3suFhKAp1m6JdQywP4R+3xWnL BMCChGMMDpaarbj/Q2P3W4qtzpfi+RxY X-Google-Smtp-Source: AMrXdXvI95ryIYv3mYiLaEW52Mjy6G2g6DQ8MwrTjJmJYfZaK+uEyVB7Y9YgTbG/z/1GFMv0iQnxIls+z2Xi X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:cebf:c37e:8184:56]) (user=irogers job=sendgmr) by 2002:a25:9a02:0:b0:7ba:f028:b325 with SMTP id x2-20020a259a02000000b007baf028b325mr1547877ybn.452.1673389256480; Tue, 10 Jan 2023 14:20:56 -0800 (PST) Date: Tue, 10 Jan 2023 14:20:00 -0800 In-Reply-To: <20230110222003.1591436-1-irogers@google.com> Message-Id: <20230110222003.1591436-5-irogers@google.com> Mime-Version: 1.0 References: <20230110222003.1591436-1-irogers@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Subject: [PATCH v1 4/7] tools lib api: Minor strbuf_read improvements From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Nathan Chancellor , Nick Desaulniers , Tom Rix , Nicolas Schier , Masahiro Yamada , Athira Rajeev , Christy Lee , Andrii Nakryiko , Ravi Bangoria , Leo Yan , Yang Jihong , Qi Liu , James Clark , Adrian Hunter , "Masami Hiramatsu (Google)" , Kan Liang , Sean Christopherson , Zhengjun Xing , Rob Herring , Xin Gao , Zechuan Chen , Jason Wang , Christophe JAILLET , Stephane Eranian , German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, llvm@lists.linux.dev Cc: Ian Rogers Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org If a read is smaller than the remaining space, don't grow the buffer as it is likely we've reached the end of the file. Make the grow amounts a single page rather than just over 2 once the null terminator is included. Signed-off-by: Ian Rogers --- tools/lib/api/strbuf.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/tools/lib/api/strbuf.c b/tools/lib/api/strbuf.c index 4639b2d02e62..eafa2c01f46a 100644 --- a/tools/lib/api/strbuf.c +++ b/tools/lib/api/strbuf.c @@ -143,25 +143,28 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint) size_t oldalloc = sb->alloc; int ret; - ret = strbuf_grow(sb, hint ? hint : 8192); + ret = strbuf_grow(sb, hint ? hint : 4095); if (ret) return ret; for (;;) { - ssize_t cnt; + ssize_t read_size; + size_t sb_remaining = sb->alloc - sb->len - 1; - cnt = read(fd, sb->buf + sb->len, sb->alloc - sb->len - 1); - if (cnt < 0) { + read_size = read(fd, sb->buf + sb->len, sb_remaining); + if (read_size < 0) { if (oldalloc == 0) strbuf_release(sb); else strbuf_setlen(sb, oldlen); - return cnt; + return read_size; } - if (!cnt) + if (read_size == 0) break; - sb->len += cnt; - ret = strbuf_grow(sb, 8192); + sb->len += read_size; + if ((size_t)read_size < sb_remaining) + continue; + ret = strbuf_grow(sb, 4095); if (ret) return ret; } From patchwork Tue Jan 10 22:20:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13095717 X-Patchwork-Delegate: bpf@iogearbox.net 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A5D80C54EBC for ; Tue, 10 Jan 2023 22:22:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234860AbjAJWV7 (ORCPT ); Tue, 10 Jan 2023 17:21:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38948 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234837AbjAJWV3 (ORCPT ); Tue, 10 Jan 2023 17:21:29 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B1A92F791 for ; Tue, 10 Jan 2023 14:21:05 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id r8-20020a252b08000000b007b989d5e105so10839411ybr.11 for ; Tue, 10 Jan 2023 14:21:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=4sg2Aa5uCHWcDC8jm9J4EAv2OJFGtXnNHMXMT9mO4Gw=; b=AW29Ki0ipdxS14sshMxXhqz4FZFcNVmZ3WvoBGdx8Bla7+yjxNrYSNmR1ihsyWRsrf X60XFLMewiYm9IGefUm4eEzu+c8CeyIivN4qFu4JpwnYwB3jA2QMO7bOOM3Ko7g1jq8K C5RnWXn1KhH66oHffsmy/GqlYcVahiBR3eqjUSNwhLqIpkauqFmAyRmy+3bD+cnZC0dZ KFqMPnIG2GLgHMH6PYQiwuTfPPwsF8vA5I0JxA/flSZfhMIfeqXMaRE2xMVljQClk+CN NAwV6KvZTl/6ClD/vaGcAe7VaWC8QwAk0u7Hs7wmIUwxTE33GdGdAYSdTQfnpepXNN/1 khRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4sg2Aa5uCHWcDC8jm9J4EAv2OJFGtXnNHMXMT9mO4Gw=; b=s4OfmQBsfI9SVhV/oOoBY3JCn5uO8wKSsV45e1eGfHDmMcxSVcftRvVRQUaxC2of85 2e616CfsMFdbkwZ7LT2XVsm8WmY5SFwtQTJtK0r82FxhnRb7ABhIUdjw+UzHxTin5GEB mLAM7pFfba8cbCOyUysW548/co8PV6O397Jv9K8pqZAmI3ZrLBWinU04UWoQCdRWinr+ JFsQEH4gfb5JSP7bud6kR9jnQlzTewN815HbWMdOLsAC3y1pKRPcdW66yU4gJ/5E+9Ze q2y1+yaLbCN6l+VjgKyi9xQ9mzXIb0I7NNWM6TjBz9OVesATSw1Fu++j/8ejICnF7s9X I1eg== X-Gm-Message-State: AFqh2kpaWVv+Ucs+S77MyUgyMyZqX7AOG22XT82Zl4N2y0Wee4v9hqKm xsCkGuXvH3V2wNosxHrzVTaIX2RnfcYE X-Google-Smtp-Source: AMrXdXul//OabQOCLWyx1Luc6Hl+ueTmgO396xd2lzHTTOh6r4Z7uBXUeTt67VSekVDq2442YXd8T9SPuWGF X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:cebf:c37e:8184:56]) (user=irogers job=sendgmr) by 2002:a25:449:0:b0:7b6:f8d5:82f4 with SMTP id 70-20020a250449000000b007b6f8d582f4mr2181307ybe.646.1673389264926; Tue, 10 Jan 2023 14:21:04 -0800 (PST) Date: Tue, 10 Jan 2023 14:20:01 -0800 In-Reply-To: <20230110222003.1591436-1-irogers@google.com> Message-Id: <20230110222003.1591436-6-irogers@google.com> Mime-Version: 1.0 References: <20230110222003.1591436-1-irogers@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Subject: [PATCH v1 5/7] tools lib api: Tweak strbuf allocation size computation From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Nathan Chancellor , Nick Desaulniers , Tom Rix , Nicolas Schier , Masahiro Yamada , Athira Rajeev , Christy Lee , Andrii Nakryiko , Ravi Bangoria , Leo Yan , Yang Jihong , Qi Liu , James Clark , Adrian Hunter , "Masami Hiramatsu (Google)" , Kan Liang , Sean Christopherson , Zhengjun Xing , Rob Herring , Xin Gao , Zechuan Chen , Jason Wang , Christophe JAILLET , Stephane Eranian , German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, llvm@lists.linux.dev Cc: Ian Rogers Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org alloc_nr gives an estimate of the actual memory behind an allocation but isn't accurate. Use malloc_usable_size to accurately set the strbuf alloc, which potentially avoids realloc calls. Signed-off-by: Ian Rogers --- tools/lib/api/strbuf.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tools/lib/api/strbuf.c b/tools/lib/api/strbuf.c index eafa2c01f46a..a3d7f96d8b9f 100644 --- a/tools/lib/api/strbuf.c +++ b/tools/lib/api/strbuf.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,6 @@ char *strbuf_detach(struct strbuf *sb, size_t *sz) return res; } -#define alloc_nr(x) (((x)+16)*3/2) int strbuf_grow(struct strbuf *sb, size_t extra) { char *buf; @@ -54,9 +54,6 @@ int strbuf_grow(struct strbuf *sb, size_t extra) if (nr <= sb->len) return -E2BIG; - if (alloc_nr(sb->alloc) > nr) - nr = alloc_nr(sb->alloc); - /* * Note that sb->buf == strbuf_slopbuf if sb->alloc == 0, and it is * a static variable. Thus we have to avoid passing it to realloc. @@ -66,10 +63,9 @@ int strbuf_grow(struct strbuf *sb, size_t extra) return -ENOMEM; sb->buf = buf; - sb->alloc = nr; + sb->alloc = malloc_usable_size(buf); return 0; } -#undef alloc_nr int strbuf_addch(struct strbuf *sb, int c) { From patchwork Tue Jan 10 22:20:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13095718 X-Patchwork-Delegate: bpf@iogearbox.net 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 57823C54EBC for ; Tue, 10 Jan 2023 22:22:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235152AbjAJWWt (ORCPT ); Tue, 10 Jan 2023 17:22:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235080AbjAJWWJ (ORCPT ); Tue, 10 Jan 2023 17:22:09 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BF6A02020 for ; Tue, 10 Jan 2023 14:21:21 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id a4-20020a5b0004000000b006fdc6aaec4fso14341446ybp.20 for ; Tue, 10 Jan 2023 14:21:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=/FtIYr0/RheXwrssHV0cFATW8LMtUvVk/N1uI6ptIqc=; b=RNYP627ovo2gwEzsZZbFylrtQb+tRstmx8+kwVlpER/K5C5tNb2oBe50zVPZpE1xuZ NU9zXXblOxx6EAKLVYDrvaw3SP0ZyRrbegvCU8UFWhy7tdpYKJsjdqHS8Q8fCYTB2AA1 XfxIcjNfCJVewHShT9ogfUdkxa5rGgTTPcO795wa5pyopE3PY7OwUHSfWNK2py18qEHb lU9rAZ5slO3ij3YjOrOQ5FnhJPYOoz0FdvRAzlSJcgOtT3Q85Tvra/8+nQofX8xCCpMS FEo/8EYdWVgxNvEjlwcyYar4md8dE1bKiVeg7zyJe6xTPO25BRQ85Hz4YMsQr4Ew/YJj ifFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=/FtIYr0/RheXwrssHV0cFATW8LMtUvVk/N1uI6ptIqc=; b=0bnM8FPuAs2xt4a7097ukaguJY5j/3inWe4iCH0Hfgh3Y2htse6wmyFBh2i/DKeCjg CFlgOPJtQbQ5Q0e70ahplgPTrEaMse9Yxg+9HfHyz3revrLOKROYw0Es5yFJDUWTrbfd tQC54VNM5W755ZoQeoqRxyGVW3PkFkhnauj0ojQ4DWy7yo5Ep1kUTVB1x8RBGh7mEvXw k9HMAnt05YGA4cGvOqi7TkybFsZ20yP6CHT65lSeB30WfxpyFK2CQk+6C9qA7IYO8x10 eH7fEGF26nv7EerkSZVOM8xEW0qammLvD9A9Wv2EJbs+jgHhp28yY7P3tXoTnm3NvmpO UJ4Q== X-Gm-Message-State: AFqh2kpvjbGio1eEZKpcNG0NSQtpIo8/Cwbb7xx9NZyAnNPf0fOE4yLH p5I6Ihfu+V04W4K0/HZzg73sbJx2oduc X-Google-Smtp-Source: AMrXdXt8x+kd9UlLPbZYhu5Ooy9hNfxVHcOZmgh4OR3ywtB1lSBt3xtVEtTcEV9ZxG+DMlVpkAwMcWwdvcU8 X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:cebf:c37e:8184:56]) (user=irogers job=sendgmr) by 2002:a25:8110:0:b0:6f6:ec71:8ede with SMTP id o16-20020a258110000000b006f6ec718edemr5909003ybk.422.1673389272586; Tue, 10 Jan 2023 14:21:12 -0800 (PST) Date: Tue, 10 Jan 2023 14:20:02 -0800 In-Reply-To: <20230110222003.1591436-1-irogers@google.com> Message-Id: <20230110222003.1591436-7-irogers@google.com> Mime-Version: 1.0 References: <20230110222003.1591436-1-irogers@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Subject: [PATCH v1 6/7] perf help: Use run_command_strbuf From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Nathan Chancellor , Nick Desaulniers , Tom Rix , Nicolas Schier , Masahiro Yamada , Athira Rajeev , Christy Lee , Andrii Nakryiko , Ravi Bangoria , Leo Yan , Yang Jihong , Qi Liu , James Clark , Adrian Hunter , "Masami Hiramatsu (Google)" , Kan Liang , Sean Christopherson , Zhengjun Xing , Rob Herring , Xin Gao , Zechuan Chen , Jason Wang , Christophe JAILLET , Stephane Eranian , German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, llvm@lists.linux.dev Cc: Ian Rogers Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Remove boiler plate by using library routine. Signed-off-by: Ian Rogers --- tools/perf/builtin-help.c | 47 ++++++++++++--------------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/tools/perf/builtin-help.c b/tools/perf/builtin-help.c index 8874e1e0335b..1cb87358cd20 100644 --- a/tools/perf/builtin-help.c +++ b/tools/perf/builtin-help.c @@ -70,46 +70,27 @@ static const char *get_man_viewer_info(const char *name) static int check_emacsclient_version(void) { struct strbuf buffer = STRBUF_INIT; - struct child_process ec_process; - const char *argv_ec[] = { "emacsclient", "--version", NULL }; - int version; int ret = -1; - /* emacsclient prints its version number on stderr */ - memset(&ec_process, 0, sizeof(ec_process)); - ec_process.argv = argv_ec; - ec_process.err = -1; - ec_process.stdout_to_stderr = 1; - if (start_command(&ec_process)) { - fprintf(stderr, "Failed to start emacsclient.\n"); - return -1; - } - if (strbuf_read(&buffer, ec_process.err, 20) < 0) { - fprintf(stderr, "Failed to read emacsclient version\n"); - goto out; - } - close(ec_process.err); - /* - * Don't bother checking return value, because "emacsclient --version" - * seems to always exits with code 1. + * emacsclient may print its version number on stderr. Don't bother + * checking return value, because some "emacsclient --version" commands + * seem to always exits with code 1. */ - finish_command(&ec_process); + run_command_strbuf("emacsclient --version 2>&1", &buffer); - if (!strstarts(buffer.buf, "emacsclient")) { + if (!strstarts(buffer.buf, "emacsclient")) fprintf(stderr, "Failed to parse emacsclient version.\n"); - goto out; - } - - version = atoi(buffer.buf + strlen("emacsclient")); + else { + int version = atoi(buffer.buf + strlen("emacsclient")); - if (version < 22) { - fprintf(stderr, - "emacsclient version '%d' too old (< 22).\n", - version); - } else - ret = 0; -out: + if (version < 22) { + fprintf(stderr, + "emacsclient version '%d' too old (< 22).\n", + version); + } else + ret = 0; + } strbuf_release(&buffer); return ret; } From patchwork Tue Jan 10 22:20:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13095719 X-Patchwork-Delegate: bpf@iogearbox.net 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A2477C46467 for ; Tue, 10 Jan 2023 22:22:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233014AbjAJWWu (ORCPT ); Tue, 10 Jan 2023 17:22:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38020 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234773AbjAJWWL (ORCPT ); Tue, 10 Jan 2023 17:22:11 -0500 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 52517630B for ; Tue, 10 Jan 2023 14:21:26 -0800 (PST) Received: by mail-pl1-x649.google.com with SMTP id f8-20020a170902ce8800b00190c6518e21so9192558plg.1 for ; Tue, 10 Jan 2023 14:21:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=kvPH1BN0wc7R6CBYDwvNtRpXbxlXsspJN7UfOLukVhk=; b=XtuABPKvMijNQr9fb8jkyGTZ/KLwAHAmMrQd/RXO5du+uXQNtal+CFXdNPElXfFRfq Yil7XJbmdb4gkUwZGETai6Xd3/w7NaCTqYiScLj43krV4Tr2qCVjRPs+wN0MoLj3Lnbi HYD69GprkAHubvAoU9hkO4t79fGtf7ApeUGgOOofTHQNaYzKRffHUuKJF0vhdivE5JZp qlyK2l1QnqzLZso72zbqC0VMrpPUBaXPJraf+c/Jnhrg/MkduX8srZ+oHs3KJ4FW1acv 5hTxwj6tQUEVMmqcfxqU9iUdy/eUxkc+GC6xYg5qwA9Bnkwlu+5BbOAL19kFVEDTBaAG 78VQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=kvPH1BN0wc7R6CBYDwvNtRpXbxlXsspJN7UfOLukVhk=; b=yC6LDwmMUO5yAS2sQ9mc1OJ8/OW8Mr0o7mjqHmb/zUgnwrjkRSCflOIbXwFBXOJmJm oe67SfWXkHbDzCkMC7q70Yz324daVkJ2TRk6yGQFCdfkvJt0ADrE8qoTLfu8Eijcw4kU +jwpf97t9WilMACCHRFpIxXGBR9yVBzP6BbFtmEJXl6MVNM1ENRXRyHHcMIhEcELwBRQ w+0i4FviLRAS1EtFiokoWQwkizfK0WteODVdIKWWSD6K5yQzIgr9ZXVGW9Y9WVWUmHWy 7OoAN2S9CvNWKIr1OoB56nwvvis02lZN7IQgLL8l0pw/ZD7ul0s2KKP1mj/PIvBB7Ryw 14fA== X-Gm-Message-State: AFqh2kp3oUsj2ptQ4Z9bnc+tfeUR38ACYynwRH+JhPx5ksVECe1emvsm ii0U2rL9Bfw6jXDxSd3DiLP6AYkWZb/f X-Google-Smtp-Source: AMrXdXvrnniASyZKrOQ+MkQJEuuDdxB/fg2o3J0uy7i19QShKpKxfZQ+SqWs2hqFU1HTTOwDbX7aIkA6oKCk X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:cebf:c37e:8184:56]) (user=irogers job=sendgmr) by 2002:a05:6a00:1630:b0:586:906e:4dd5 with SMTP id e16-20020a056a00163000b00586906e4dd5mr1350224pfc.80.1673389281412; Tue, 10 Jan 2023 14:21:21 -0800 (PST) Date: Tue, 10 Jan 2023 14:20:03 -0800 In-Reply-To: <20230110222003.1591436-1-irogers@google.com> Message-Id: <20230110222003.1591436-8-irogers@google.com> Mime-Version: 1.0 References: <20230110222003.1591436-1-irogers@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Subject: [PATCH v1 7/7] perf llvm: Remove read_from_pipe From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Nathan Chancellor , Nick Desaulniers , Tom Rix , Nicolas Schier , Masahiro Yamada , Athira Rajeev , Christy Lee , Andrii Nakryiko , Ravi Bangoria , Leo Yan , Yang Jihong , Qi Liu , James Clark , Adrian Hunter , "Masami Hiramatsu (Google)" , Kan Liang , Sean Christopherson , Zhengjun Xing , Rob Herring , Xin Gao , Zechuan Chen , Jason Wang , Christophe JAILLET , Stephane Eranian , German Gomez , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, bpf@vger.kernel.org, llvm@lists.linux.dev Cc: Ian Rogers Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Switch to the common run_command_strbuf utility. Signed-off-by: Ian Rogers --- tools/perf/tests/bpf.c | 12 +-- tools/perf/tests/llvm.c | 18 ++-- tools/perf/tests/llvm.h | 3 +- tools/perf/util/bpf-loader.c | 9 +- tools/perf/util/llvm-utils.c | 184 +++++++---------------------------- tools/perf/util/llvm-utils.h | 6 +- 6 files changed, 61 insertions(+), 171 deletions(-) diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c index 17c023823713..b4a6afb41e40 100644 --- a/tools/perf/tests/bpf.c +++ b/tools/perf/tests/bpf.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include "tests.h" @@ -216,14 +217,13 @@ prepare_bpf(void *obj_buf, size_t obj_buf_sz, const char *name) static int __test__bpf(int idx) { int ret; - void *obj_buf; - size_t obj_buf_sz; + struct strbuf obj_buf = STRBUF_INIT; struct bpf_object *obj; - ret = test_llvm__fetch_bpf_obj(&obj_buf, &obj_buf_sz, + ret = test_llvm__fetch_bpf_obj(&obj_buf, bpf_testcase_table[idx].prog_id, false, NULL); - if (ret != TEST_OK || !obj_buf || !obj_buf_sz) { + if (ret != TEST_OK || !obj_buf.len) { pr_debug("Unable to get BPF object, %s\n", bpf_testcase_table[idx].msg_compile_fail); if ((idx == 0) || (ret == TEST_SKIP)) @@ -232,7 +232,7 @@ static int __test__bpf(int idx) return TEST_FAIL; } - obj = prepare_bpf(obj_buf, obj_buf_sz, + obj = prepare_bpf(obj_buf.buf, obj_buf.len, bpf_testcase_table[idx].name); if ((!!bpf_testcase_table[idx].target_func) != (!!obj)) { if (!obj) @@ -274,7 +274,7 @@ static int __test__bpf(int idx) } out: - free(obj_buf); + strbuf_release(&obj_buf); bpf__clear(); return ret; } diff --git a/tools/perf/tests/llvm.c b/tools/perf/tests/llvm.c index 0bc25a56cfef..97090850b7f9 100644 --- a/tools/perf/tests/llvm.c +++ b/tools/perf/tests/llvm.c @@ -4,6 +4,7 @@ #include #include "tests.h" #include "debug.h" +#include #ifdef HAVE_LIBBPF_SUPPORT #include @@ -45,8 +46,7 @@ static struct { }; int -test_llvm__fetch_bpf_obj(void **p_obj_buf, - size_t *p_obj_buf_sz, +test_llvm__fetch_bpf_obj(struct strbuf *obj_buf, enum test_llvm__testcase idx, bool force, bool *should_load_fail) @@ -83,9 +83,6 @@ test_llvm__fetch_bpf_obj(void **p_obj_buf, if (verbose == 0) verbose = -1; - *p_obj_buf = NULL; - *p_obj_buf_sz = 0; - if (!llvm_param.clang_bpf_cmd_template) goto out; @@ -106,7 +103,7 @@ test_llvm__fetch_bpf_obj(void **p_obj_buf, clang_opt_old = llvm_param.clang_opt; llvm_param.clang_opt = clang_opt_new; - err = llvm__compile_bpf("-", p_obj_buf, p_obj_buf_sz); + err = llvm__compile_bpf("-", obj_buf); llvm_param.clang_bpf_cmd_template = tmpl_old; llvm_param.clang_opt = clang_opt_old; @@ -127,24 +124,23 @@ test_llvm__fetch_bpf_obj(void **p_obj_buf, static int test__llvm(int subtest) { int ret; - void *obj_buf = NULL; - size_t obj_buf_sz = 0; + struct strbuf obj_buf = STRBUF_INIT; bool should_load_fail = false; if ((subtest < 0) || (subtest >= __LLVM_TESTCASE_MAX)) return TEST_FAIL; - ret = test_llvm__fetch_bpf_obj(&obj_buf, &obj_buf_sz, + ret = test_llvm__fetch_bpf_obj(&obj_buf, subtest, false, &should_load_fail); if (ret == TEST_OK && !should_load_fail) { - ret = test__bpf_parsing(obj_buf, obj_buf_sz); + ret = test__bpf_parsing(obj_buf.buf, obj_buf.len); if (ret != TEST_OK) { pr_debug("Failed to parse test case '%s'\n", bpf_source_table[subtest].desc); } } - free(obj_buf); + strbuf_release(&obj_buf); return ret; } diff --git a/tools/perf/tests/llvm.h b/tools/perf/tests/llvm.h index f68b0d9b8ae2..2294b66dd0b6 100644 --- a/tools/perf/tests/llvm.h +++ b/tools/perf/tests/llvm.h @@ -22,7 +22,8 @@ enum test_llvm__testcase { __LLVM_TESTCASE_MAX, }; -int test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz, +struct strbuf; +int test_llvm__fetch_bpf_obj(struct strbuf *obj_buf, enum test_llvm__testcase index, bool force, bool *should_load_fail); #ifdef __cplusplus diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c index 6e9b06cf06ee..f3a5cf490141 100644 --- a/tools/perf/util/bpf-loader.c +++ b/tools/perf/util/bpf-loader.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "debug.h" #include "evlist.h" #include "bpf-loader.h" @@ -245,10 +246,14 @@ struct bpf_object *bpf__prepare_load(const char *filename, bool source) err = perf_clang__compile_bpf(filename, &obj_buf, &obj_buf_sz); perf_clang__cleanup(); if (err) { + struct strbuf str_obj_buf = STRBUF_INIT; + pr_debug("bpf: builtin compilation failed: %d, try external compiler\n", err); - err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz); - if (err) + err = llvm__compile_bpf(filename, &str_obj_buf); + if (err < 0) return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE); + obj_buf = str_obj_buf.buf; + obj_buf_sz = str_obj_buf.len; } else pr_debug("bpf: successful builtin compilation\n"); obj = bpf_object__open_mem(obj_buf, obj_buf_sz, &opts); diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c index 4e8e243a6e4b..8a12160320f3 100644 --- a/tools/perf/util/llvm-utils.c +++ b/tools/perf/util/llvm-utils.c @@ -17,7 +17,9 @@ #include "config.h" #include "util.h" #include +#include #include +#include #define CLANG_BPF_CMD_DEFAULT_TEMPLATE \ "$CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS "\ @@ -125,92 +127,6 @@ static int search_program_and_warn(const char *def, const char *name, return ret; } -#define READ_SIZE 4096 -static int -read_from_pipe(const char *cmd, void **p_buf, size_t *p_read_sz) -{ - int err = 0; - void *buf = NULL; - FILE *file = NULL; - size_t read_sz = 0, buf_sz = 0; - char serr[STRERR_BUFSIZE]; - - file = popen(cmd, "r"); - if (!file) { - pr_err("ERROR: unable to popen cmd: %s\n", - str_error_r(errno, serr, sizeof(serr))); - return -EINVAL; - } - - while (!feof(file) && !ferror(file)) { - /* - * Make buf_sz always have obe byte extra space so we - * can put '\0' there. - */ - if (buf_sz - read_sz < READ_SIZE + 1) { - void *new_buf; - - buf_sz = read_sz + READ_SIZE + 1; - new_buf = realloc(buf, buf_sz); - - if (!new_buf) { - pr_err("ERROR: failed to realloc memory\n"); - err = -ENOMEM; - goto errout; - } - - buf = new_buf; - } - read_sz += fread(buf + read_sz, 1, READ_SIZE, file); - } - - if (buf_sz - read_sz < 1) { - pr_err("ERROR: internal error\n"); - err = -EINVAL; - goto errout; - } - - if (ferror(file)) { - pr_err("ERROR: error occurred when reading from pipe: %s\n", - str_error_r(errno, serr, sizeof(serr))); - err = -EIO; - goto errout; - } - - err = WEXITSTATUS(pclose(file)); - file = NULL; - if (err) { - err = -EINVAL; - goto errout; - } - - /* - * If buf is string, give it terminal '\0' to make our life - * easier. If buf is not string, that '\0' is out of space - * indicated by read_sz so caller won't even notice it. - */ - ((char *)buf)[read_sz] = '\0'; - - if (!p_buf) - free(buf); - else - *p_buf = buf; - - if (p_read_sz) - *p_read_sz = read_sz; - return 0; - -errout: - if (file) - pclose(file); - free(buf); - if (p_buf) - *p_buf = NULL; - if (p_read_sz) - *p_read_sz = 0; - return err; -} - static inline void force_set_env(const char *var, const char *value) { @@ -244,7 +160,7 @@ version_notice(void) ); } -static int detect_kbuild_dir(char **kbuild_dir) +static int detect_kbuild_dir(struct strbuf *kbuild_dir) { const char *test_dir = llvm_param.kbuild_dir; const char *prefix_dir = ""; @@ -276,10 +192,9 @@ static int detect_kbuild_dir(char **kbuild_dir) if (access(autoconf_path, R_OK) == 0) { free(autoconf_path); - err = asprintf(kbuild_dir, "%s%s%s", prefix_dir, test_dir, - suffix_dir); + err = (int)strbuf_addf(kbuild_dir, "%s%s%s", prefix_dir, test_dir, suffix_dir); if (err < 0) - return -ENOMEM; + return err; return 0; } pr_debug("%s: Couldn't find \"%s\", missing kernel-devel package?.\n", @@ -315,7 +230,7 @@ static const char *kinc_fetch_script = "rm -rf $TMPDIR\n" "exit $RET\n"; -void llvm__get_kbuild_opts(char **kbuild_dir, char **kbuild_include_opts) +void llvm__get_kbuild_opts(struct strbuf *kbuild_dir, struct strbuf *kbuild_include_opts) { static char *saved_kbuild_dir; static char *saved_kbuild_include_opts; @@ -324,22 +239,14 @@ void llvm__get_kbuild_opts(char **kbuild_dir, char **kbuild_include_opts) if (!kbuild_dir || !kbuild_include_opts) return; - *kbuild_dir = NULL; - *kbuild_include_opts = NULL; - if (saved_kbuild_dir && saved_kbuild_include_opts && !IS_ERR(saved_kbuild_dir) && !IS_ERR(saved_kbuild_include_opts)) { - *kbuild_dir = strdup(saved_kbuild_dir); - *kbuild_include_opts = strdup(saved_kbuild_include_opts); + strbuf_addstr(kbuild_dir, saved_kbuild_dir); + strbuf_addstr(kbuild_include_opts, saved_kbuild_include_opts); - if (*kbuild_dir && *kbuild_include_opts) - return; - - zfree(kbuild_dir); - zfree(kbuild_include_opts); /* - * Don't fall through: it may breaks saved_kbuild_dir and - * saved_kbuild_include_opts if detect them again when + * Don't fallthrough: it may break the saved_kbuild_dir and + * saved_kbuild_include_opts if they are detected again when * memory is low. */ return; @@ -361,28 +268,26 @@ void llvm__get_kbuild_opts(char **kbuild_dir, char **kbuild_include_opts) goto errout; } - pr_debug("Kernel build dir is set to %s\n", *kbuild_dir); - force_set_env("KBUILD_DIR", *kbuild_dir); + pr_debug("Kernel build dir is set to %s\n", kbuild_dir->buf); + force_set_env("KBUILD_DIR", kbuild_dir->buf); force_set_env("KBUILD_OPTS", llvm_param.kbuild_opts); - err = read_from_pipe(kinc_fetch_script, - (void **)kbuild_include_opts, - NULL); + err = run_command_strbuf(kinc_fetch_script, kbuild_include_opts); if (err) { pr_warning( "WARNING:\tunable to get kernel include directories from '%s'\n" "Hint:\tTry set clang include options using 'clang-bpf-cmd-template'\n" " \toption in [llvm] section of ~/.perfconfig and set 'kbuild-dir'\n" " \toption in [llvm] to \"\" to suppress this detection.\n\n", - *kbuild_dir); + kbuild_dir->buf); zfree(kbuild_dir); goto errout; } - pr_debug("include option is set to %s\n", *kbuild_include_opts); + pr_debug("include option is set to %s\n", kbuild_include_opts->buf); - saved_kbuild_dir = strdup(*kbuild_dir); - saved_kbuild_include_opts = strdup(*kbuild_include_opts); + saved_kbuild_dir = strdup(kbuild_dir->buf); + saved_kbuild_include_opts = strdup(kbuild_include_opts->buf); if (!saved_kbuild_dir || !saved_kbuild_include_opts) { zfree(&saved_kbuild_dir); @@ -446,24 +351,23 @@ void llvm__dump_obj(const char *path, void *obj_buf, size_t size) free(obj_path); } -int llvm__compile_bpf(const char *path, void **p_obj_buf, - size_t *p_obj_buf_sz) +int llvm__compile_bpf(const char *path, struct strbuf *obj_buf) { - size_t obj_buf_sz; - void *obj_buf = NULL; int err, nr_cpus_avail; unsigned int kernel_version; char linux_version_code_str[64]; const char *clang_opt = llvm_param.clang_opt; char clang_path[PATH_MAX], llc_path[PATH_MAX], abspath[PATH_MAX], nr_cpus_avail_str[64]; char serr[STRERR_BUFSIZE]; - char *kbuild_dir = NULL, *kbuild_include_opts = NULL, - *perf_bpf_include_opts = NULL; + char *perf_bpf_include_opts = NULL; const char *template = llvm_param.clang_bpf_cmd_template; char *pipe_template = NULL; const char *opts = llvm_param.opts; - char *command_echo = NULL, *command_out; + char *command_echo = NULL; char *libbpf_include_dir = system_path(LIBBPF_INCLUDE_DIR); + struct strbuf kbuild_dir = STRBUF_INIT; + struct strbuf kbuild_include_opts = STRBUF_INIT; + struct strbuf command_out = STRBUF_INIT; if (path[0] != '-' && realpath(path, abspath) == NULL) { err = errno; @@ -501,9 +405,9 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, force_set_env("LINUX_VERSION_CODE", linux_version_code_str); force_set_env("CLANG_EXEC", clang_path); force_set_env("CLANG_OPTIONS", clang_opt); - force_set_env("KERNEL_INC_OPTIONS", kbuild_include_opts); + force_set_env("KERNEL_INC_OPTIONS", kbuild_include_opts.buf); force_set_env("PERF_BPF_INC_OPTIONS", perf_bpf_include_opts); - force_set_env("WORKING_DIR", kbuild_dir ? : "."); + force_set_env("WORKING_DIR", kbuild_dir.len ? kbuild_dir.buf : "."); if (opts) { err = search_program_and_warn(llvm_param.llc_path, "llc", llc_path); @@ -549,11 +453,11 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, SWAP_CHAR('&', '\006'); SWAP_CHAR('\a', '"'); } - err = read_from_pipe(command_echo, (void **) &command_out, NULL); - if (err) + err = run_command_strbuf(command_echo, &command_out); + if (err < 0) goto errout; - for (char *p = command_out; *p; p++) { + for (char *p = command_out.buf; *p; p++) { SWAP_CHAR('\001', '<'); SWAP_CHAR('\002', '>'); SWAP_CHAR('\003', '"'); @@ -562,10 +466,10 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, SWAP_CHAR('\006', '&'); } #undef SWAP_CHAR - pr_debug("llvm compiling command : %s\n", command_out); + pr_debug("llvm compiling command : %s\n", command_out.buf); - err = read_from_pipe(template, &obj_buf, &obj_buf_sz); - if (err) { + err = run_command_strbuf(template, obj_buf); + if (err < 0) { pr_err("ERROR:\tunable to compile %s\n", path); pr_err("Hint:\tCheck error message shown above.\n"); pr_err("Hint:\tYou can also pre-compile it into .o using:\n"); @@ -574,33 +478,15 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, goto errout; } - free(command_echo); - free(command_out); - free(kbuild_dir); - free(kbuild_include_opts); - free(perf_bpf_include_opts); - free(libbpf_include_dir); - - if (!p_obj_buf) - free(obj_buf); - else - *p_obj_buf = obj_buf; - - if (p_obj_buf_sz) - *p_obj_buf_sz = obj_buf_sz; - return 0; + err = 0; errout: free(command_echo); - free(kbuild_dir); - free(kbuild_include_opts); - free(obj_buf); + strbuf_release(&command_out); + strbuf_release(&kbuild_dir); + strbuf_release(&kbuild_include_opts); free(perf_bpf_include_opts); free(libbpf_include_dir); free(pipe_template); - if (p_obj_buf) - *p_obj_buf = NULL; - if (p_obj_buf_sz) - *p_obj_buf_sz = 0; return err; } diff --git a/tools/perf/util/llvm-utils.h b/tools/perf/util/llvm-utils.h index 7878a0e3fa98..0ad25e42aa6e 100644 --- a/tools/perf/util/llvm-utils.h +++ b/tools/perf/util/llvm-utils.h @@ -56,13 +56,15 @@ struct llvm_param { extern struct llvm_param llvm_param; int perf_llvm_config(const char *var, const char *value); -int llvm__compile_bpf(const char *path, void **p_obj_buf, size_t *p_obj_buf_sz); +struct strbuf; +int llvm__compile_bpf(const char *path, struct strbuf *obj_buf); /* This function is for test__llvm() use only */ int llvm__search_clang(void); /* Following functions are reused by builtin clang support */ -void llvm__get_kbuild_opts(char **kbuild_dir, char **kbuild_include_opts); +struct strbuf; +void llvm__get_kbuild_opts(struct strbuf *kbuild_dir, struct strbuf *kbuild_include_opts); int llvm__get_nr_cpus(void); void llvm__dump_obj(const char *path, void *obj_buf, size_t size);