perf llvm: Pass number of configured CPUs to clang compiler
This patch introduces a new macro "__NR_CPUS__" to perf's embedded clang compiler, which represent the number of configured CPUs in this system. BPF programs can use this macro to create a map with the same number of system CPUs. For example: struct bpf_map_def SEC("maps") pmu_map = { .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY, .key_size = sizeof(int), .value_size = sizeof(u32), .max_entries = __NR_CPUS__, }; Signed-off-by: Wang Nan <wangnan0@huawei.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1446636007-239722-2-git-send-email-wangnan0@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
98916392a0
commit
59f41af980
|
@ -11,10 +11,11 @@
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
|
||||||
#define CLANG_BPF_CMD_DEFAULT_TEMPLATE \
|
#define CLANG_BPF_CMD_DEFAULT_TEMPLATE \
|
||||||
"$CLANG_EXEC -D__KERNEL__ $CLANG_OPTIONS " \
|
"$CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS "\
|
||||||
"$KERNEL_INC_OPTIONS -Wno-unused-value " \
|
"$CLANG_OPTIONS $KERNEL_INC_OPTIONS " \
|
||||||
"-Wno-pointer-sign -working-directory " \
|
"-Wno-unused-value -Wno-pointer-sign " \
|
||||||
"$WORKING_DIR -c \"$CLANG_SOURCE\" -target bpf -O2 -o -"
|
"-working-directory $WORKING_DIR " \
|
||||||
|
"-c \"$CLANG_SOURCE\" -target bpf -O2 -o -"
|
||||||
|
|
||||||
struct llvm_param llvm_param = {
|
struct llvm_param llvm_param = {
|
||||||
.clang_path = "clang",
|
.clang_path = "clang",
|
||||||
|
@ -326,8 +327,8 @@ get_kbuild_opts(char **kbuild_dir, char **kbuild_include_opts)
|
||||||
int llvm__compile_bpf(const char *path, void **p_obj_buf,
|
int llvm__compile_bpf(const char *path, void **p_obj_buf,
|
||||||
size_t *p_obj_buf_sz)
|
size_t *p_obj_buf_sz)
|
||||||
{
|
{
|
||||||
int err;
|
int err, nr_cpus_avail;
|
||||||
char clang_path[PATH_MAX];
|
char clang_path[PATH_MAX], nr_cpus_avail_str[64];
|
||||||
const char *clang_opt = llvm_param.clang_opt;
|
const char *clang_opt = llvm_param.clang_opt;
|
||||||
const char *template = llvm_param.clang_bpf_cmd_template;
|
const char *template = llvm_param.clang_bpf_cmd_template;
|
||||||
char *kbuild_dir = NULL, *kbuild_include_opts = NULL;
|
char *kbuild_dir = NULL, *kbuild_include_opts = NULL;
|
||||||
|
@ -354,6 +355,17 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
|
||||||
*/
|
*/
|
||||||
get_kbuild_opts(&kbuild_dir, &kbuild_include_opts);
|
get_kbuild_opts(&kbuild_dir, &kbuild_include_opts);
|
||||||
|
|
||||||
|
nr_cpus_avail = sysconf(_SC_NPROCESSORS_CONF);
|
||||||
|
if (nr_cpus_avail <= 0) {
|
||||||
|
pr_err(
|
||||||
|
"WARNING:\tunable to get available CPUs in this system: %s\n"
|
||||||
|
" \tUse 128 instead.\n", strerror(errno));
|
||||||
|
nr_cpus_avail = 128;
|
||||||
|
}
|
||||||
|
snprintf(nr_cpus_avail_str, sizeof(nr_cpus_avail_str), "%d",
|
||||||
|
nr_cpus_avail);
|
||||||
|
|
||||||
|
force_set_env("NR_CPUS", nr_cpus_avail_str);
|
||||||
force_set_env("CLANG_EXEC", clang_path);
|
force_set_env("CLANG_EXEC", clang_path);
|
||||||
force_set_env("CLANG_OPTIONS", clang_opt);
|
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);
|
||||||
|
|
Loading…
Reference in New Issue