Blame view

include/linux/prefetch.h 1.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  /*
   *  Generic cache management functions. Everything is arch-specific,  
   *  but this header exists to make sure the defines/functions can be
   *  used in a generic way.
   *
   *  2000-11-13  Arjan van de Ven   <arjan@fenrus.demon.nl>
   *
   */
  
  #ifndef _LINUX_PREFETCH_H
  #define _LINUX_PREFETCH_H
  
  #include <linux/types.h>
  #include <asm/processor.h>
  #include <asm/cache.h>
  
  /*
  	prefetch(x) attempts to pre-emptively get the memory pointed to
  	by address "x" into the CPU L1 cache. 
  	prefetch(x) should not cause any kind of exception, prefetch(0) is
  	specifically ok.
  
  	prefetch() should be defined by the architecture, if not, the 
  	#define below provides a no-op define.	
  	
  	There are 3 prefetch() macros:
  	
  	prefetch(x)  	- prefetches the cacheline at "x" for read
  	prefetchw(x)	- prefetches the cacheline at "x" for write
521618457   Dave Jones   fix typo in prefe...
30
  	spin_lock_prefetch(x) - prefetches the spinlock *x for taking
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  	
25985edce   Lucas De Marchi   Fix common misspe...
32
  	there is also PREFETCH_STRIDE which is the architecure-preferred 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
  	"lookahead" size for prefetching streamed operations.
  	
  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  #ifndef ARCH_HAS_PREFETCH
ab483570a   Andi Kleen   x86 & generic: ch...
37
  #define prefetch(x) __builtin_prefetch(x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
  #endif
  
  #ifndef ARCH_HAS_PREFETCHW
ab483570a   Andi Kleen   x86 & generic: ch...
41
  #define prefetchw(x) __builtin_prefetch(x,1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  #endif
  
  #ifndef ARCH_HAS_SPINLOCK_PREFETCH
  #define spin_lock_prefetch(x) prefetchw(x)
  #endif
  
  #ifndef PREFETCH_STRIDE
  #define PREFETCH_STRIDE (4*L1_CACHE_BYTES)
  #endif
  
  static inline void prefetch_range(void *addr, size_t len)
  {
  #ifdef ARCH_HAS_PREFETCH
  	char *cp;
  	char *end = addr + len;
  
  	for (cp = addr; cp < end; cp += PREFETCH_STRIDE)
  		prefetch(cp);
  #endif
  }
  
  #endif