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 <jrajaha...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev