[oe] [meta-oe][PATCH 2/3] stressapptest: Implement reading sysfs and use it if sysconf is not there

Khem Raj raj.khem at gmail.com
Mon Jun 17 05:24:39 UTC 2019


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

Signed-off-by: Khem Raj <raj.khem at gmail.com>
---
 .../read_sysfs_for_cachesize.patch            | 72 +++++++++++++++++++
 .../stressapptest/stressapptest_1.0.9.bb      |  1 +
 2 files changed, 73 insertions(+)
 create mode 100644 meta-oe/recipes-benchmark/stressapptest/stressapptest/read_sysfs_for_cachesize.patch

diff --git a/meta-oe/recipes-benchmark/stressapptest/stressapptest/read_sysfs_for_cachesize.patch b/meta-oe/recipes-benchmark/stressapptest/stressapptest/read_sysfs_for_cachesize.patch
new file mode 100644
index 0000000000..8c251aeb97
--- /dev/null
+++ b/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 at 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();
+ 
diff --git a/meta-oe/recipes-benchmark/stressapptest/stressapptest_1.0.9.bb b/meta-oe/recipes-benchmark/stressapptest/stressapptest_1.0.9.bb
index 679201c528..aa1bf1cd32 100644
--- a/meta-oe/recipes-benchmark/stressapptest/stressapptest_1.0.9.bb
+++ b/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"
-- 
2.22.0



More information about the Openembedded-devel mailing list