From patchwork Tue Dec 6 07:13:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 86685 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp1880353qgi; Mon, 5 Dec 2016 23:15:31 -0800 (PST) X-Received: by 10.84.179.165 with SMTP id b34mr133330522plc.162.1481008531115; Mon, 05 Dec 2016 23:15:31 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1si18328139plv.49.2016.12.05.23.15.30; Mon, 05 Dec 2016 23:15:31 -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 S1752715AbcLFHOw (ORCPT + 25 others); Tue, 6 Dec 2016 02:14:52 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:46223 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752549AbcLFHOr (ORCPT ); Tue, 6 Dec 2016 02:14:47 -0500 Received: from 172.24.1.47 (EHLO szxeml431-hub.china.huawei.com) ([172.24.1.47]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DRT24880; Tue, 06 Dec 2016 15:14:25 +0800 (CST) Received: from linux-4hy3.site (10.107.193.248) by szxeml431-hub.china.huawei.com (10.82.67.208) with Microsoft SMTP Server id 14.3.235.1; Tue, 6 Dec 2016 15:14:12 +0800 From: Wang Nan To: CC: , , Wang Nan , Arnaldo Carvalho de Melo , "Alexei Starovoitov" , He Kuang , Jiri Olsa , Zefan Li , Subject: [PATCH v4 12/18] perf clang jit: Retrive fd of BPF map from its offset Date: Tue, 6 Dec 2016 07:13:50 +0000 Message-ID: <20161206071356.5312-13-wangnan0@huawei.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161206071356.5312-1-wangnan0@huawei.com> References: <20161206071356.5312-1-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.193.248] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org bpf__map_fd() is introduced to retrive fd of a BPF map through its offset in BPF object. This function is going be used in further commits which allow scripts jitted by builtin clang access BPF maps. Signed-off-by: Wang Nan Cc: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov Cc: He Kuang Cc: Jiri Olsa Cc: Zefan Li Cc: pi3orama@163.com --- tools/perf/util/bpf-loader.c | 37 +++++++++++++++++++++++++++++++++++++ tools/perf/util/bpf-loader.h | 19 +++++++++++++++++++ 2 files changed, 56 insertions(+) -- 2.10.1 diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c index 9a0c33d..3eb420e 100644 --- a/tools/perf/util/bpf-loader.c +++ b/tools/perf/util/bpf-loader.c @@ -19,6 +19,7 @@ #include "parse-events.h" #include "llvm-utils.h" #include "c++/clang-c.h" +#include "asm/bug.h" // for WARN_ONCE #define DEFINE_PRINT_FN(name, level) \ static int libbpf_##name(const char *fmt, ...) \ @@ -1644,6 +1645,28 @@ int bpf__setup_stdout(struct perf_evlist *evlist __maybe_unused) return 0; } +int bpf__map_fd(struct bpf_object *obj, void *jit_map) +{ + struct bpf_obj_priv *priv = bpf_object__priv(obj); + struct bpf_map *map; + size_t map_offset; + void *map_base; + + if (IS_ERR(priv)) + return PTR_ERR(priv); + if (!priv) + return -EINVAL; + + map_base = priv->map_base; + map_offset = jit_map - map_base; + map = bpf_object__find_map_by_offset(obj, map_offset); + WARN_ONCE(IS_ERR(map), "can't find map offset %zu from '%s'\n", + map_offset, bpf_object__name(obj)); + if (IS_ERR(map)) + return -ENOENT; + return bpf_map__fd(map); +} + #define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START) #define ERRCODE_OFFSET(c) ERRNO_OFFSET(BPF_LOADER_ERRNO__##c) #define NR_ERRNO (__BPF_LOADER_ERRNO__END - __BPF_LOADER_ERRNO__START) @@ -1825,3 +1848,17 @@ int bpf__strerror_setup_stdout(struct perf_evlist *evlist __maybe_unused, bpf__strerror_end(buf, size); return 0; } + +int bpf__strerror_map_fd(struct bpf_object *obj, void *jit_map, + int err, char *buf, size_t size) +{ + struct bpf_obj_priv *priv = bpf_object__priv(obj); + ptrdiff_t offset = priv ? jit_map - priv->map_base : jit_map - NULL; + + bpf__strerror_head(err, buf, size); + bpf__strerror_entry(EINVAL, "No map in BPF object %s", bpf_object__name(obj)); + bpf__strerror_entry(ENOENT, "Can't find map offset %lx in BPF object %s", + (unsigned long)offset, bpf_object__name(obj)); + bpf__strerror_end(buf, size); + return 0; +} diff --git a/tools/perf/util/bpf-loader.h b/tools/perf/util/bpf-loader.h index f2b737b..c40812b 100644 --- a/tools/perf/util/bpf-loader.h +++ b/tools/perf/util/bpf-loader.h @@ -84,6 +84,9 @@ int bpf__setup_stdout(struct perf_evlist *evlist); int bpf__strerror_setup_stdout(struct perf_evlist *evlist, int err, char *buf, size_t size); +int bpf__map_fd(struct bpf_object *obj, void *jit_map); +int bpf__strerror_map_fd(struct bpf_object *obj, void *jit_map, + int err, char *buf, size_t size); #else static inline struct bpf_object * bpf__prepare_load(const char *filename __maybe_unused, @@ -136,6 +139,13 @@ bpf__setup_stdout(struct perf_evlist *evlist __maybe_unused) } static inline int +bpf__map_fd(struct bpf_object *obj __maybe_unused, + void *map_ptr __maybe_unused) +{ + return -ENOTSUP; +} + +static inline int __bpf_strerror(char *buf, size_t size) { if (!size) @@ -196,5 +206,14 @@ bpf__strerror_setup_stdout(struct perf_evlist *evlist __maybe_unused, { return __bpf_strerror(buf, size); } + +static inline int +bpf__strerror_map_fd(struct bpf_object *obj __maybe_unused, + void *jit_map __maybe_unused, + int err __maybe_unused, + char *buf, size_t size); +{ + return __bpf_strerror(buf, size); +} #endif #endif