From 124f09c9279ae41eba4bf0d6419387e8ec9a1a78 Mon Sep 17 00:00:00 2001 From: Jarno Rajahalme Date: Tue, 29 Apr 2014 15:50:38 -0700 Subject: [PATCH] lib: Add prefetch support (for GCC) 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 Acked-by: Ethan Jackson --- lib/compiler.h | 14 ++++++++++++++ lib/util.h | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/compiler.h b/lib/compiler.h index 3b59813c9..cfe906660 100644 --- a/lib/compiler.h +++ b/lib/compiler.h @@ -206,4 +206,18 @@ static void f(void) #endif +/* OVS_PREFETCH() can be used to instruct the CPU to fetch the cache + * line containing the given address to a CPU cache. + * OVS_PREFETCH_WRITE() should be used when the memory is going to be + * written to. Depending on the target CPU, this can generate the same + * instruction as OVS_PREFETCH(), or bring the data into the cache in an + * exclusive state. */ +#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 bff6153a8..743b9fea1 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 @@ -486,6 +499,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); -- 2.43.0