@@ -5032,11 +5032,18 @@ look_sysfscpu(struct hwloc_topology *topology,
50325032
50335033 /* look at the caches */
50345034 if (topology -> want_some_cpu_caches ) {
5035- for (j = 0 ; j < 10 ; j ++ ) {
5035+ DIR * cachesdir ;
5036+ struct dirent * dirent ;
5037+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/" , i );
5038+ cachesdir = hwloc_opendir (str , data -> root_fd );
5039+ if (cachesdir ) {
5040+ while ((dirent = readdir (cachesdir )) != NULL ) {
50365041 char str2 [20 ]; /* enough for a level number (one digit) or a type (Data/Instruction/Unified) */
50375042 hwloc_bitmap_t cacheset ;
50385043
5039- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d/shared_cpu_map" , i , j );
5044+ if (strncmp (dirent -> d_name , "index" , 5 ))
5045+ continue ;
5046+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s/shared_cpu_map" , i , dirent -> d_name );
50405047 cacheset = hwloc__alloc_read_path_as_cpumask (str , data -> root_fd );
50415048 if (cacheset ) {
50425049 if (hwloc_bitmap_iszero (cacheset )) {
@@ -5066,14 +5073,14 @@ look_sysfscpu(struct hwloc_topology *topology,
50665073 struct hwloc_obj * cache ;
50675074
50685075 /* get the cache level depth */
5069- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d /level" , i , j ); /* contains %u at least up to 4.19 */
5076+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s /level" , i , dirent -> d_name ); /* contains %u at least up to 4.19 */
50705077 if (hwloc_read_path_as_uint (str , & depth , data -> root_fd ) < 0 ) {
50715078 hwloc_bitmap_free (cacheset );
50725079 continue ;
50735080 }
50745081
50755082 /* cache type */
5076- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d /type" , i , j );
5083+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s /type" , i , dirent -> d_name );
50775084 if (hwloc_read_path_by_length (str , str2 , sizeof (str2 ), data -> root_fd ) > 0 ) {
50785085 if (!strncmp (str2 , "Data" , 4 ))
50795086 ctype = HWLOC_OBJ_CACHE_DATA ;
@@ -5084,7 +5091,7 @@ look_sysfscpu(struct hwloc_topology *topology,
50845091 }
50855092
50865093 /* cache id */
5087- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d /id" , i , j );
5094+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s /id" , i , dirent -> d_name );
50885095 hwloc_read_path_as_uint (str , & id , data -> root_fd );
50895096
50905097 otype = hwloc_cache_type_by_depth_type (depth , ctype );
@@ -5099,7 +5106,7 @@ look_sysfscpu(struct hwloc_topology *topology,
50995106
51005107 /* get the cache size */
51015108 kB = 0 ;
5102- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d /size" , i , j ); /* contains %uK at least up to 4.19 */
5109+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s /size" , i , dirent -> d_name ); /* contains %uK at least up to 4.19 */
51035110 hwloc_read_path_as_uint (str , & kB , data -> root_fd );
51045111 /* KNL reports L3 with size=0 and full cpuset in cpuid.
51055112 * Let hwloc_linux_try_add_knl_mcdram_cache() detect it better.
@@ -5111,19 +5118,19 @@ look_sysfscpu(struct hwloc_topology *topology,
51115118
51125119 /* get the line size */
51135120 linesize = 0 ;
5114- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d /coherency_line_size" , i , j ); /* contains %u at least up to 4.19 */
5121+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s /coherency_line_size" , i , dirent -> d_name ); /* contains %u at least up to 4.19 */
51155122 hwloc_read_path_as_uint (str , & linesize , data -> root_fd );
51165123
51175124 /* get the number of sets and lines per tag.
51185125 * don't take the associativity directly in "ways_of_associativity" because
51195126 * some archs (ia64, ppc) put 0 there when fully-associative, while others (x86) put something like -1 there.
51205127 */
51215128 sets = 0 ;
5122- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d /number_of_sets" , i , j ); /* contains %u at least up to 4.19 */
5129+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s /number_of_sets" , i , dirent -> d_name ); /* contains %u at least up to 4.19 */
51235130 hwloc_read_path_as_uint (str , & sets , data -> root_fd );
51245131
51255132 lines_per_tag = 1 ;
5126- sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/index%d /physical_line_partition" , i , j ); /* contains %u at least up to 4.19 */
5133+ sprintf (str , "/sys/devices/system/cpu/cpu%d/cache/%s /physical_line_partition" , i , dirent -> d_name ); /* contains %u at least up to 4.19 */
51275134 hwloc_read_path_as_uint (str , & lines_per_tag , data -> root_fd );
51285135
51295136 /* first cpu in this cache, add the cache */
@@ -5147,6 +5154,8 @@ look_sysfscpu(struct hwloc_topology *topology,
51475154 }
51485155 hwloc_bitmap_free (cacheset );
51495156 }
5157+ closedir (cachesdir );
5158+ }
51505159 }
51515160
51525161 } hwloc_bitmap_foreach_end ();
0 commit comments