| 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: Submitted [https://github.com/stressapptest/stressapptest/pull/100] |
| Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| --- 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(); |
| |