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

Reply via email to