Re: [RFC PATCH v6 25/32] perf tools: Add 'bpf.' config section to perf default config

Wangnan (F)
2015-06-11T08:11:05Z

On 2015/6/11 15:45, Namhyung Kim wrote:
> On Tue, Jun 09, 2015 at 04:43:19PM -0700, Alexei Starovoitov wrote:
>> On 6/8/15 10:50 PM, Wang Nan wrote:
>>> perf_bpf_config() is added to parse 'bpf' section in perf config file.
>>> Following is an example:
>>>
>>> [bpf]
>>> clang-path = /llvm/bin/x86_64-linux-clang"
>>> llc-path = /llvm/bin/x86_64-linux-llc"
>>> clang-opt = "-nostdinc -isystem /llvm/lib/clang/include -I/kernel/arch/x86/include ..."
>>> llc-opt = ""
>> a section to specify -I flags to compile prog.c is useful,
>> but users shouldn't be populating it manually for kernel headers.
>> How about adding a script that can figure out $(LINUXINCLUDE)
>> automatically ?
> Maybe a dummy question. For what reason it needs such headers? Is it
> possible to have a (part of?) copy of needed bits in the perf source?
>
> Thanks,
> Namhyung

It is improtant for eBPF script that it should be able to extract
information
from kernel pointers. For example: to extract registers from 'struct
pt_regs' and
to extract fields from 'struct page *'. I believe this is an improtant
reason
why we decide to use C-like language instead of designing a DLS.
Therefore, when
compiling .c to .o, kernel source is mandatory. Since we don't want to
limit the
ability of data accessing of eBPF scripts, we have to give it ability to
access all
kernel headers.

Thank you for reviewing.

>> You can even invoke such flag detector from perf via something like:
>> f = open /tmpdir/Makefile
>> fprintf(f, "obj-y := dummy.o\n");
>> fprintf(f, "$(obj)/%%.o: $(src)/%%.c\n");
>> fprintf(f, "\t@echo -n \"$(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS)\"
>>> %s\n", cachefile);
>> snprintf(cmd, "make -s -C /lib/modules/%s/build M=%s dummy.o",
>> uts_release, tmpdir);
>> system(cmd);
>> read flags from cachefile and cache it for the future.
>> ...
>> or as independent script that populates .perfconfig
>>