Re: [PATCH 0/2] Move bpf_num_possible_cpus() to libbpf_util

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> On Jun 5, 2019, at 4:54 AM, Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote:
>
> On 06/05/2019 02:18 AM, Hechao Li wrote:
>> I looked into current public APIs in libbpf.h and bpf.h. Most of them seem to be directly related to bpf object/program/map. But this function, bpf_num_possible_cpus(), is just a utility used while looking up per-CPU maps. I am not sure if it is appropriate to make it an official API. Yonghong, the author of libbpf_util.h, also asked me to put it into libbpf_util. But I am fine with either way. I can move it to libbpf.h/.c if you all agree.
>
> (please avoid top-posting)
>
> It's a good question, I think it depends how much we want to aide users consuming libbpf
> that are using per-CPU maps, for example. If we only want to reuse it for in-tree selftests,
> it's fine to keep it in an unexposed internal header that selftests would include.
> Other option could be to expose and prefix as libbpf_num_possible_cpus() to denote it's a
> misc helper and perhaps also move f3515b5d0b71 ("bpf: provide a generic macro for percpu
> values for selftests") into libbpf. I'd be fine either way, my preference is to add it
> as an libbpf_ API given users would need something along these lines when walking the value
> anyway. See e00c7b216f34 ("bpf: fix multiple issues in selftest suite and samples") for
> context on why this helper was added and sysconf(_SC_NPROCESSORS_CONF) use would be broken
> in this context.
>
> Thanks,
> Daniel
>
>> Thanks,
>> Hechao
>>
>> On 6/4/19, 5:08 PM, "Daniel Borkmann" <daniel@xxxxxxxxxxxxx> wrote:
>>
>>    On 06/05/2019 01:54 AM, Hechao Li wrote:
>>> I put the implementation in libbpf_util.c mainly because it depends on pr_warning defined in libbpf_internal.h. If including libbpf_internal.h in libbpf_util.h, then the internal stuff will be exposed to whoever include libbpf_util.h. But let me know if there is a better way to print the error messages other than depending on libbpf_internal.
>>>
>>> Thanks,
>>> Hechao
>>>
>>> On 6/4/19, 4:40 PM, "Song Liu" <songliubraving@xxxxxx> wrote:
>>>
>>>
>>>> On Jun 4, 2019, at 3:38 PM, Hechao Li <hechaol@xxxxxx> wrote:
>>>>
>>>> Getting number of possible CPUs is commonly used for per-CPU BPF maps
>>>> and perf_event_maps. Putting it into a common place can avoid duplicate
>>>> implementations.
>>>>
>>>> Hechao Li (2):
>>>> Add bpf_num_possible_cpus to libbpf_util
>>>> Use bpf_num_possible_cpus in bpftool and selftests
>>>>
>>>> tools/bpf/bpftool/common.c                    | 53 ++--------------
>>>> tools/lib/bpf/Build                           |  2 +-
>>>> tools/lib/bpf/libbpf_util.c                   | 61 +++++++++++++++++++
>>>> tools/lib/bpf/libbpf_util.h                   |  7 +++
>>>> tools/testing/selftests/bpf/bpf_util.h        | 42 +++----------
>>>> .../selftests/bpf/prog_tests/l4lb_all.c       |  2 +-
>>>> .../selftests/bpf/prog_tests/xdp_noinline.c   |  2 +-
>>>> tools/testing/selftests/bpf/test_btf.c        |  2 +-
>>>> tools/testing/selftests/bpf/test_lru_map.c    |  2 +-
>>>> tools/testing/selftests/bpf/test_maps.c       |  6 +-
>>>> 10 files changed, 88 insertions(+), 91 deletions(-)
>>>> create mode 100644 tools/lib/bpf/libbpf_util.c
>>>>
>>>> --
>>>> 2.17.1
>>>>
>>>
>>>    The change is mostly straightforward. However, I am not sure whether
>>>    they should be added to libbpf_util.h. Maybe libbpf.h is a better
>>>    place?
>>>
>>>    Daniel and Alexei, what's your recommendation here?
>>
>>    Hm, looks like the patch did not make it to the list (yet?). Agree it makes
>>    sense to move it into libbpf given common use for per-CPU/perf-event maps.
>>    Given from the diff stat it's not added to libbpf.map, is there a reason to
>>    not add it to, say, tools/lib/bpf/libbpf.c and expose it as official API?
>>
>>    Thanks,
>>    Daniel
>>
>>
>

Thanks a lot for the detailed explanation, Daniel. And sorry for the reply format. Sure, I will add it as a libbpf_
API instead. Moving  the macro BPF_DECLARE_PERCPU in selftest util to libbpf also makes sense to me.
However, since bpf_num_possible_cpus in selftest exits the process in case of failures, which is not good for
a user facing API, how about making #CPU a param and define it as

#define BPF_DECLARE_PERCPU(type, name, ncpu) \
             struct { type v; } __bpf_percpu_val_align name[ncpu]

And the user should do
int ncpu = libbpf_num_possible_cpus();
// error handling if ncpu <=0
BPF_DECLARE_PERCPU(long, value, ncpu)

The problem of this method is, the user may still pass sysconf(_SC_NPROCESSORS_CONF) as ncpu.
I think this can be avoided by putting some comments around this macro. Does it make sense?

Thanks,
Hechao





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux