|
@@ -0,0 +1,72 @@
|
|
|
+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 <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();
|
|
|
+
|