sysconf params like _SC_LEVEL1_DCACHE_LINESIZE are not universally implemented, therefore check for them being available, if not there then read the sysfs directly to get the value Upstream-Status: Pending Signed-off-by: Khem Raj --- a/src/sat.cc +++ b/src/sat.cc @@ -1482,15 +1482,47 @@ int Sat::CpuCount() { return sysconf(_SC_NPROCESSORS_CONF); } +int Sat::ReadInt(const char *filename, int *value) { + char line[64]; + int fd = open(filename, O_RDONLY), err = -1; + + if (fd < 0) + return -1; + if (read(fd, line, sizeof(line)) > 0) { + *value = atoi(line); + err = 0; + } + + close(fd); + return err; +} + // Return the worst case (largest) cache line size of the various levels of // cache actually prsent in the machine. int Sat::CacheLineSize() { - int max_linesize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); - int linesize = sysconf(_SC_LEVEL2_CACHE_LINESIZE); + int max_linesize, linesize; +#ifdef _SC_LEVEL1_DCACHE_LINESIZE + max_linesize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); +#else + ReadInt("/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size", &max_linesize); +#endif +#ifdef _SC_LEVEL2_DCACHE_LINESIZE + linesize = sysconf(_SC_LEVEL2_DCACHE_LINESIZE); +#else + ReadInt("/sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size", &linesize); +#endif if (linesize > max_linesize) max_linesize = linesize; - linesize = sysconf(_SC_LEVEL3_CACHE_LINESIZE); +#ifdef _SC_LEVEL3_DCACHE_LINESIZE + linesize = sysconf(_SC_LEVEL3_DCACHE_LINESIZE); +#else + ReadInt("/sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size", &linesize); +#endif if (linesize > max_linesize) max_linesize = linesize; - linesize = sysconf(_SC_LEVEL4_CACHE_LINESIZE); +#ifdef _SC_LEVEL4_DCACHE_LINESIZE + linesize = sysconf(_SC_LEVEL4_DCACHE_LINESIZE); +#else + ReadInt("/sys/devices/system/cpu/cpu0/cache/index3/coherency_line_size", &linesize); +#endif if (linesize > max_linesize) max_linesize = linesize; return max_linesize; } --- a/src/sat.h +++ b/src/sat.h @@ -136,7 +136,8 @@ class Sat { int CpuCount(); // Return the worst-case (largest) cache line size of the system. int CacheLineSize(); - + // Read int values from kernel file system e.g. sysfs + int ReadInt(const char *filename, int *value); // Collect error counts from threads. int64 GetTotalErrorCount();