1sysconf params like _SC_LEVEL1_DCACHE_LINESIZE are not universally 2implemented, therefore check for them being available, if not there 3then read the sysfs directly to get the value 4 5Upstream-Status: Pending 6Signed-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 73