From 9ff04d7acc700387e3837f8ab11a41efea5ee8b0 Mon Sep 17 00:00:00 2001
|
From: Khem Raj <raj.khem@gmail.com>
|
Date: Thu, 21 Jun 2018 19:44:26 -0700
|
Subject: [PATCH] alloc.c: Avoid sysconf(_SC_LEVEL2_CACHE_LINESIZE) on linux
|
|
musl does not have it
|
|
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
|
---
|
alloc.c | 15 ++++++++++++++-
|
1 file changed, 14 insertions(+), 1 deletion(-)
|
|
diff --git a/alloc.c b/alloc.c
|
index bce9464..cf7eb40 100644
|
--- a/alloc.c
|
+++ b/alloc.c
|
@@ -245,6 +245,19 @@ void free_huge_pages(void *ptr)
|
__free_huge_pages(ptr, 1);
|
}
|
|
+static size_t get_cacheline_size() {
|
+#if defined(__linux__)
|
+ FILE * fp = fopen("/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size", "r");
|
+ unsigned int line_size = 0;
|
+ if (fp) {
|
+ fscanf(fp, "%d", &line_size);
|
+ fclose(fp);
|
+ }
|
+ return line_size;
|
+#else
|
+ return sysconf(_SC_LEVEL2_CACHE_LINESIZE);
|
+#endif
|
+}
|
/*
|
* Offset the buffer using bytes wasted due to alignment to avoid using the
|
* same cache lines for the start of every buffer returned by
|
@@ -261,7 +274,7 @@ void *cachecolor(void *buf, size_t len, size_t color_bytes)
|
|
/* Lookup our cacheline size once */
|
if (cacheline_size == 0) {
|
- cacheline_size = sysconf(_SC_LEVEL2_CACHE_LINESIZE);
|
+ cacheline_size = get_cacheline_size();
|
linemod = time(NULL);
|
}
|
|