Brad Bishop | c8f4712 | 2019-06-24 09:36:18 -0400 | [diff] [blame] | 1 | sysconf params like _SC_LEVEL1_DCACHE_LINESIZE are not universally |
| 2 | implemented, therefore check for them being available, if not there |
| 3 | then read the sysfs directly to get the value |
| 4 | |
Andrew Geissler | 517393d | 2023-01-13 08:55:19 -0600 | [diff] [blame^] | 5 | Upstream-Status: Submitted [https://github.com/stressapptest/stressapptest/pull/100] |
Brad Bishop | c8f4712 | 2019-06-24 09:36:18 -0400 | [diff] [blame] | 6 | Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| 7 | --- a/src/sat.cc |
| 8 | +++ b/src/sat.cc |
| 9 | @@ -1482,15 +1482,47 @@ int Sat::CpuCount() { |
| 10 | return sysconf(_SC_NPROCESSORS_CONF); |
| 11 | } |
| 12 | |
| 13 | +int Sat::ReadInt(const char *filename, int *value) { |
| 14 | + char line[64]; |
| 15 | + int fd = open(filename, O_RDONLY), err = -1; |
| 16 | + |
| 17 | + if (fd < 0) |
| 18 | + return -1; |
| 19 | + if (read(fd, line, sizeof(line)) > 0) { |
| 20 | + *value = atoi(line); |
| 21 | + err = 0; |
| 22 | + } |
| 23 | + |
| 24 | + close(fd); |
| 25 | + return err; |
| 26 | +} |
| 27 | + |
| 28 | // Return the worst case (largest) cache line size of the various levels of |
| 29 | // cache actually prsent in the machine. |
| 30 | int Sat::CacheLineSize() { |
| 31 | - int max_linesize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); |
| 32 | - int linesize = sysconf(_SC_LEVEL2_CACHE_LINESIZE); |
| 33 | + int max_linesize, linesize; |
| 34 | +#ifdef _SC_LEVEL1_DCACHE_LINESIZE |
| 35 | + max_linesize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); |
| 36 | +#else |
| 37 | + ReadInt("/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size", &max_linesize); |
| 38 | +#endif |
| 39 | +#ifdef _SC_LEVEL2_DCACHE_LINESIZE |
| 40 | + linesize = sysconf(_SC_LEVEL2_DCACHE_LINESIZE); |
| 41 | +#else |
| 42 | + ReadInt("/sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size", &linesize); |
| 43 | +#endif |
| 44 | if (linesize > max_linesize) max_linesize = linesize; |
| 45 | - linesize = sysconf(_SC_LEVEL3_CACHE_LINESIZE); |
| 46 | +#ifdef _SC_LEVEL3_DCACHE_LINESIZE |
| 47 | + linesize = sysconf(_SC_LEVEL3_DCACHE_LINESIZE); |
| 48 | +#else |
| 49 | + ReadInt("/sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size", &linesize); |
| 50 | +#endif |
| 51 | if (linesize > max_linesize) max_linesize = linesize; |
| 52 | - linesize = sysconf(_SC_LEVEL4_CACHE_LINESIZE); |
| 53 | +#ifdef _SC_LEVEL4_DCACHE_LINESIZE |
| 54 | + linesize = sysconf(_SC_LEVEL4_DCACHE_LINESIZE); |
| 55 | +#else |
| 56 | + ReadInt("/sys/devices/system/cpu/cpu0/cache/index3/coherency_line_size", &linesize); |
| 57 | +#endif |
| 58 | if (linesize > max_linesize) max_linesize = linesize; |
| 59 | return max_linesize; |
| 60 | } |
| 61 | --- a/src/sat.h |
| 62 | +++ b/src/sat.h |
| 63 | @@ -136,7 +136,8 @@ class Sat { |
| 64 | int CpuCount(); |
| 65 | // Return the worst-case (largest) cache line size of the system. |
| 66 | int CacheLineSize(); |
| 67 | - |
| 68 | + // Read int values from kernel file system e.g. sysfs |
| 69 | + int ReadInt(const char *filename, int *value); |
| 70 | // Collect error counts from threads. |
| 71 | int64 GetTotalErrorCount(); |
| 72 | |