aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-benchmark/stressapptest/stressapptest/read_sysfs_for_cachesize.patch
blob: 8c251aeb97fddb86032a23960961c7cb2fa91b30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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();