From patchwork Tue Nov 15 04:06:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 82226 Delivered-To: patch@linaro.org Received: by 10.140.97.165 with SMTP id m34csp1340906qge; Mon, 14 Nov 2016 20:09:20 -0800 (PST) X-Received: by 10.98.149.140 with SMTP id c12mr43426574pfk.100.1479182960005; Mon, 14 Nov 2016 20:09:20 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j190si11546015pgc.174.2016.11.14.20.09.19; Mon, 14 Nov 2016 20:09:19 -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 S966076AbcKOEI3 (ORCPT + 26 others); Mon, 14 Nov 2016 23:08:29 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:25385 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965914AbcKOEIS (ORCPT ); Mon, 14 Nov 2016 23:08:18 -0500 Received: from 172.24.1.137 (EHLO SZXEML429-HUB.china.huawei.com) ([172.24.1.137]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id CLJ02004; Tue, 15 Nov 2016 12:08:15 +0800 (CST) Received: from linux-4hy3.site (10.107.193.248) by SZXEML429-HUB.china.huawei.com (10.82.67.184) with Microsoft SMTP Server id 14.3.235.1; Tue, 15 Nov 2016 12:08:05 +0800 From: Wang Nan To: , CC: , , , , Wang Nan Subject: [PATCH 28/34] perf clang jit: Access BPF map Date: Tue, 15 Nov 2016 04:06:11 +0000 Message-ID: <20161115040617.69788-29-wangnan0@huawei.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20161115040617.69788-1-wangnan0@huawei.com> References: <20161115040617.69788-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 --- 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 81c6fed..86aa99b 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