[ My reply somehow rejected by netdev, this is to send it again. ] On Wed, Jan 30, 2019 at 1:19 AM Martynas Pumputis <m...@lambda.lt> wrote: > > Previously, bpf_num_possible_cpus() had a bug when calculating a > number of possible CPUs in the case of sparse CPU allocations, as > it was considering only the first range or element of > /sys/devices/system/cpu/possible. > > E.g. in the case of "0,2-3" (CPU 1 is not available), the function > returned 1 instead of 3. > > This patch fixes the function by making it parse all CPU ranges and > elements. > > Signed-off-by: Martynas Pumputis <m...@lambda.lt> > --- > tools/testing/selftests/bpf/bpf_util.h | 29 +++++++++++++++++--------- > 1 file changed, 19 insertions(+), 10 deletions(-) > > diff --git a/tools/testing/selftests/bpf/bpf_util.h > b/tools/testing/selftests/bpf/bpf_util.h > index 315a44fa32af..8cab50408204 100644 > --- a/tools/testing/selftests/bpf/bpf_util.h > +++ b/tools/testing/selftests/bpf/bpf_util.h > @@ -13,7 +13,7 @@ static inline unsigned int bpf_num_possible_cpus(void) > unsigned int start, end, possible_cpus = 0; > char buff[128]; > FILE *fp; > - int n; > + int n, i, j = 0; > > fp = fopen(fcpu, "r"); > if (!fp) { > @@ -21,17 +21,26 @@ static inline unsigned int bpf_num_possible_cpus(void) > exit(1); > } > > - while (fgets(buff, sizeof(buff), fp)) { > - n = sscanf(buff, "%u-%u", &start, &end); > - if (n == 0) { > - printf("Failed to retrieve # possible CPUs!\n"); > - exit(1); > - } else if (n == 1) { > - end = start; > + if (!fgets(buff, sizeof(buff), fp)) { > + printf("Failed to read %s!\n", fcpu); > + exit(1); > + } > + > + for (i = 0; i <= strlen(buff); i++) { > + if (buff[i] == ',' || buff[i] == '\0') { > + buff[i] = '\0';
This does not sound right. For example, the cpu list "0,2-3", you will change "," to '\0" so buffer becomes "0\02-3". The next iteration you will get strlen(buff) = 1. The "2-3" will be skipped. > + n = sscanf(&buff[j], "%u-%u", &start, &end); > + if (n <= 0) { > + printf("Failed to retrieve # possible > CPUs!\n"); > + exit(1); > + } else if (n == 1) { > + end = start; > + } > + possible_cpus += end - start + 1; > + j = i + 1; > } > - possible_cpus = start == 0 ? end + 1 : 0; > - break; > } > + > fclose(fp); > > return possible_cpus; > -- > 2.20.1 >