bpf: selftests: handle sparse CPU allocations
Subsystems (5)
PATCH v2 1/1 bpf: selftests: handle sparse CPU allocations
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.
---
Testing of the patch: https://gist.github.com/brb/5369b5cfd08babb80cf2c4081dc19762
--- tools/testing/selftests/bpf/bpf_util.h | 31 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-)
tools/testing/selftests/bpf/bpf_util.h +21 -10
@@ -9,11 +9,12 @@static inline unsigned int bpf_num_possible_cpus (void ) { +static const char *fcpu ="/sys/devices/system/cpu/possible" ;unsigned int start, end, possible_cpus =0 ;char buff[128 ];FILE *fp; -int n; +int len, n, i, j =0 ; fp =fopen (fcpu,"r" );if (!fp) {
@@ -21,17 +22,27 @@ 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 ); + } + + len =strlen (buff); +for (i =0 ; i <= len; i++) { +if (buff[i] ==',' || buff[i] =='\0' ) { + buff[i] ='\0' ; + 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;
Signature · 1 line
2.20.1
Quoted 6 lines · Martynas Pumputis
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.
Quoted 7 lines
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 <[email protected]>
Daniel Borkmann
maintainerQuoted 24 lines · Martynas Pumputis
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 <[email protected]>---
Testing of the patch: https://gist.github.com/brb/5369b5cfd08babb80cf2c4081dc19762--- tools/testing/selftests/bpf/bpf_util.h | 31 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-)tools/testing/selftests/bpf/bpf_util.h +0
-0
tools/testing/selftests/bpf/bpf_util.h line 13
Quoted 5 lines
tools/testing/selftests/bpf/bpf_util.h +1
-0@@ -9,11 +9,12 @@static inline unsigned int bpf_num_possible_cpus (void ) { +static const char *fcpu ="/sys/devices/system/cpu/possible" ;
Applied and removed above whitespace while at it, thanks!