summaryrefslogtreecommitdiff
path: root/sys-libs/libhugetlbfs/files/libhugetlbfs-2.23-musl-sc-level2-fix.patch
blob: c42e017abec142ba7e456705e6960ebdc21660c4 (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
# _SC_LEVEL2_CACHE_LINESIZE is most probably Glibc specific define. Hence we
# cannot use it with other libc's. Check if _SC_LEVEL2_CACHE_LINESIZE is
# available or use custom function to get CPU cache size
# Original patch was found here [1]
# [1]: https://cgit.openembedded.org/meta-openembedded/plain/meta-oe/recipes-benchmark/libhugetlbfs/files/0003-alloc.c-Avoid-sysconf-_SC_LEVEL2_CACHE_LINESIZE-on-l.patch
# Closes: https://bugs.gentoo.org/828830
--- a/alloc.c
+++ b/alloc.c
@@ -245,6 +245,24 @@ void free_huge_pages(void *ptr)
 	__free_huge_pages(ptr, 1);
 }

+/*
+ * Avoid sysconf(_SC_LEVEL2_CACHE_LINESIZE) on linux
+ * Taken from the folling patch [1]
+ *
+ * [1]: https://cgit.openembedded.org/meta-openembedded/plain/meta-oe/recipes-benchmark/libhugetlbfs/files/0003-alloc.c-Avoid-sysconf-_SC_LEVEL2_CACHE_LINESIZE-on-l.patch
+ */
+#if !defined(_SC_LEVEL2_CACHE_LINESIZE)
+static size_t get_cacheline_size() {
+	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;
+}
+#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 +279,11 @@ void *cachecolor(void *buf, size_t len, size_t color_bytes)

 	/* Lookup our cacheline size once */
 	if (cacheline_size == 0) {
+#if defined(_SC_LEVEL2_CACHE_LINESIZE)
 		cacheline_size = sysconf(_SC_LEVEL2_CACHE_LINESIZE);
+#else
+		cacheline_size = get_cacheline_size();
+#endif
 		linemod = time(NULL);
 	}