On Wed, Jun 5, 2019 at 10:46 PM Song Liu <songliubraving@xxxxxx> wrote: > > > > > On Jun 5, 2019, at 4:15 PM, Hechao Li <hechaol@xxxxxx> wrote: > > > > Adding a new API libbpf_num_possible_cpus() that helps user with > > per-CPU map operations. > > > > Signed-off-by: Hechao Li <hechaol@xxxxxx> Your patches didn't get into mailing list. I had this problem before, for me the issue was fixed by trimming the CC list to a minimum, maybe try that? You should also probably include netdev@xxxxxxxxxxxxxxx, btw. > > --- > > tools/lib/bpf/libbpf.c | 49 ++++++++++++++++++++++++++++++++++++++++ > > tools/lib/bpf/libbpf.h | 16 +++++++++++++ > > tools/lib/bpf/libbpf.map | 1 + > > 3 files changed, 66 insertions(+) > > > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > > index ba89d9727137..580b14307237 100644 > > --- a/tools/lib/bpf/libbpf.c > > +++ b/tools/lib/bpf/libbpf.c > > @@ -3827,3 +3827,52 @@ void bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear) > > desc->array_offset, addr); > > } > > } > > + > > +int libbpf_num_possible_cpus(void) > > +{ > > + static const char *fcpu = "/sys/devices/system/cpu/possible"; > > + static int cpus; > > + char buf[128]; > > + int len = 0, n = 0, il = 0, ir = 0; > > + int fd = -1; > > + unsigned int start = 0, end = 0; Please sort from longest line length to shortest (so-called "reverse Christmas tree"). > > + > > + if (cpus > 0) > > + return cpus; > > + > > + fd = open(fcpu, O_RDONLY); > > + if (fd < 0) { > > + pr_warning("Failed to open file %s\n", fcpu); > > + return -errno; pr_warning can call into user-specified callback function, which can perform some actions that will clobber errno variable. So you should save errno before pr_warning. Also, it's useful to include errno in error message itself. > > + } > > + len = read(fd, buf, sizeof(buf)); > > + close(fd); > > + if (len <= 0) { > > + pr_warning("Failed to read number of possible cpus from %s\n", > > + fcpu); > > + return -errno; Same about errno saving. > > + } > > + if (len == sizeof(buf)) { > > + pr_warning("File: %s size overflow\n", fcpu); > > + return -EOVERFLOW; > > + } > > + buf[len] = '\0'; > > + > > + for (ir = 0, cpus = 0; ir <= len; ir++) { > > + /* Each sub string separated by ',' has format \d+-\d+ or \d+ */ > > + if (buf[ir] == ',' || buf[ir] == '\0') { > > + buf[ir] = '\0'; > > + n = sscanf(&buf[il], "%u-%u", &start, &end); > > + if (n <= 0) { > > + pr_warning("Failed to get # CPUs from %s\n", > > + &buf[il]); > > + return -EINVAL; > > + } else if (n == 1) { > > + end = start; > > + } > > + cpus += end - start + 1; > > + il = ir + 1; > > + } > > + } > > + return cpus; > > +} > > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > > index 1af0d48178c8..f5e82eb2e5d4 100644 > > --- a/tools/lib/bpf/libbpf.h > > +++ b/tools/lib/bpf/libbpf.h > > @@ -454,6 +454,22 @@ bpf_program__bpil_addr_to_offs(struct bpf_prog_info_linear *info_linear); > > LIBBPF_API void > > bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear); > > > > +/* > > + * A helper function to get the number of possible CPUs before looking up > > + * per-CPU maps. Negative errno is returned on failure. > > + * > > + * Example usage: > > + * > > + * int ncpus = libbpf_num_possible_cpus(); > > + * if (ncpus <= 0) { > > + * // error handling > > + * } > > + * long values[ncpus]; > > + * bpf_map_lookup_elem(per_cpu_map_fd, key, values); > > + * > > + */ > > +LIBBPF_API int libbpf_num_possible_cpus(void); > > + > > #ifdef __cplusplus > > } /* extern "C" */ > > #endif > > diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map > > index 46dcda89df21..7f76d19cb02b 100644 > > --- a/tools/lib/bpf/libbpf.map > > +++ b/tools/lib/bpf/libbpf.map > > @@ -172,4 +172,5 @@ LIBBPF_0.0.4 { > > btf_dump__new; > > btf__parse_elf; > > bpf_object__load_xattr; > > + libbpf_num_possible_cpus; > > Please indent with tab instead of space. > > Thanks, > Song > > > } LIBBPF_0.0.3; > > -- > > 2.17.1 > > >