Browse Source

stressapptest: Implement reading sysfs and use it if sysconf is not there

This helps in building on musl platform where _SC_LEVEL1_DCACHE_LINESIZE
is not available

Signed-off-by: Khem Raj <raj.khem@gmail.com>
Khem Raj 5 years ago
parent
commit
5673dae7b2

+ 72 - 0
meta-oe/recipes-benchmark/stressapptest/stressapptest/read_sysfs_for_cachesize.patch

@@ -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();
+ 

+ 1 - 0
meta-oe/recipes-benchmark/stressapptest/stressapptest_1.0.9.bb

@@ -11,6 +11,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=55ea9d559f985fb4834317d8ed6b9e58"
 
 SRC_URI = "https://github.com/${PN}/${PN}/archive/v${PV}.tar.gz \
            file://libcplusplus-compat.patch \
+           file://read_sysfs_for_cachesize.patch \
           "
 
 SRC_URI[md5sum] = "d3a526c174c049dd7a1068dc74a62be2"