mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-29 05:55:02 +08:00
ded80bda8b
Use a hashmap between a char* string and a double* value. While bpf's hashmap entries are size_t in size, we can't guarantee sizeof(size_t) >= sizeof(double). Avoid a memory allocation when gathering ids by making 0.0 a special value encoded as NULL. Original map suggestion by Andi Kleen: https://lore.kernel.org/lkml/20200224210308.GQ160988@tassilo.jf.intel.com/ and seconded by Jiri Olsa: https://lore.kernel.org/lkml/20200423112915.GH1136647@krava/ Committer notes: There are fixes that need to land upstream before we can use libbpf's headers, for now use our copy unconditionally, since the data structures at this point are exactly the same, no problem. When the fixes for libbpf's hashmap land upstream, we can fix this up. Testing it: Building with LIBBPF=1, i.e. the default: $ perf -vv | grep -i bpf bpf: [ on ] # HAVE_LIBBPF_SUPPORT $ nm ~/bin/perf | grep -i libbpf_ | wc -l 39 $ nm ~/bin/perf | grep -i hashmap_ | wc -l 17 $ Explicitely building without LIBBPF: $ perf -vv | grep -i bpf bpf: [ OFF ] # HAVE_LIBBPF_SUPPORT $ $ nm ~/bin/perf | grep -i libbpf_ | wc -l 0 $ nm ~/bin/perf | grep -i hashmap_ | wc -l 9 $ Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Andi Kleen <ak@linux.intel.com> Cc: Andrii Nakryiko <andriin@fb.com> Cc: Cong Wang <xiyou.wangcong@gmail.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Jin Yao <yao.jin@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: John Fastabend <john.fastabend@gmail.com> Cc: John Garry <john.garry@huawei.com> Cc: Kajol Jain <kjain@linux.ibm.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Kim Phillips <kim.phillips@amd.com> Cc: Leo Yan <leo.yan@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Martin KaFai Lau <kafai@fb.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <songliubraving@fb.com> Cc: Stephane Eranian <eranian@google.com> Cc: Yonghong Song <yhs@fb.com> Cc: bpf@vger.kernel.org Cc: kp singh <kpsingh@chromium.org> Cc: netdev@vger.kernel.org Link: http://lore.kernel.org/lkml/20200515221732.44078-8-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
33 lines
949 B
C
33 lines
949 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef PARSE_CTX_H
|
|
#define PARSE_CTX_H 1
|
|
|
|
// There are fixes that need to land upstream before we can use libbpf's headers,
|
|
// for now use our copy uncoditionally, since the data structures at this point
|
|
// are exactly the same, no problem.
|
|
//#ifdef HAVE_LIBBPF_SUPPORT
|
|
//#include <bpf/hashmap.h>
|
|
//#else
|
|
#include "util/hashmap.h"
|
|
//#endif
|
|
|
|
struct expr_parse_ctx {
|
|
struct hashmap ids;
|
|
};
|
|
|
|
struct expr_scanner_ctx {
|
|
int start_token;
|
|
int runtime;
|
|
};
|
|
|
|
void expr__ctx_init(struct expr_parse_ctx *ctx);
|
|
void expr__ctx_clear(struct expr_parse_ctx *ctx);
|
|
int expr__add_id(struct expr_parse_ctx *ctx, const char *id, double val);
|
|
int expr__get_id(struct expr_parse_ctx *ctx, const char *id, double *val_ptr);
|
|
int expr__parse(double *final_val, struct expr_parse_ctx *ctx,
|
|
const char *expr, int runtime);
|
|
int expr__find_other(const char *expr, const char *one,
|
|
struct expr_parse_ctx *ids, int runtime);
|
|
|
|
#endif
|