[ovs-dev] [PATCH 06/10] lib: Add prefetch support (for GCC)
Jarno Rajahalme
jrajahalme at nicira.com
Fri Apr 18 19:41:57 UTC 2014
Define OVS_PREFETCH() and OVS_PREFETCH_WRITE() using builtin prefetch
for GCC, and ovs_prefetch_range() for prefetching a range of addresses.
Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
---
lib/compiler.h | 8 ++++++++
lib/util.h | 14 ++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/lib/compiler.h b/lib/compiler.h
index 3b59813..981605c 100644
--- a/lib/compiler.h
+++ b/lib/compiler.h
@@ -206,4 +206,12 @@
static void f(void)
#endif
+#if __GNUC__
+#define OVS_PREFETCH(addr) __builtin_prefetch((addr))
+#define OVS_PREFETCH_WRITE(addr) __builtin_prefetch((addr), 1)
+#else
+#define OVS_PREFETCH(addr)
+#define OVS_PREFETCH_WRITE(addr)
+#endif
+
#endif /* compiler.h */
diff --git a/lib/util.h b/lib/util.h
index aff17a5..5c3668a 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -151,6 +151,19 @@ is_pow2(uintmax_t x)
#define CACHE_LINE_SIZE 64
BUILD_ASSERT_DECL(IS_POW2(CACHE_LINE_SIZE));
+#define CACHE_LINE_SIZE 64 /* Correct for most CPUs. */
+
+static inline void
+ovs_prefetch_range(const void *start, size_t size)
+{
+ const char *addr = (const char *)start;
+ size_t ofs;
+
+ for (ofs = 0; ofs < size; ofs += CACHE_LINE_SIZE) {
+ OVS_PREFETCH(addr + ofs);
+ }
+}
+
#ifndef MIN
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
#endif
@@ -503,6 +516,7 @@ uint64_t bitwise_get(const void *src, unsigned int src_len,
unsigned int src_ofs, unsigned int n_bits);
void xsleep(unsigned int seconds);
+
#ifdef _WIN32
char *ovs_format_message(int error);
--
1.7.10.4
More information about the dev
mailing list