On Apr 24, 2014, at 5:55 PM, Ethan Jackson <et...@nicira.com> wrote:
> I think there should be a comment explaining when to use prefetch vs > prefetch_write. I certainly don't know off the top of my head. > I wrote this based on GCC documentation: /* 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. */ > Acked-by: Ethan Jackson <et...@nicira.com> > Thanks, Jarno > > On Fri, Apr 18, 2014 at 12:41 PM, Jarno Rajahalme <jrajaha...@nicira.com> > wrote: >> 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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev