xref: /linux-6.15/include/linux/prefetch.h (revision c8afaa1b)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *  Generic cache management functions. Everything is arch-specific,
41da177e4SLinus Torvalds  *  but this header exists to make sure the defines/functions can be
51da177e4SLinus Torvalds  *  used in a generic way.
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  *  2000-11-13  Arjan van de Ven   <[email protected]>
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  */
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #ifndef _LINUX_PREFETCH_H
121da177e4SLinus Torvalds #define _LINUX_PREFETCH_H
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds #include <linux/types.h>
151da177e4SLinus Torvalds #include <asm/processor.h>
161da177e4SLinus Torvalds #include <asm/cache.h>
171da177e4SLinus Torvalds 
181fa5cef2SLi RongQing struct page;
191da177e4SLinus Torvalds /*
201da177e4SLinus Torvalds 	prefetch(x) attempts to pre-emptively get the memory pointed to
211da177e4SLinus Torvalds 	by address "x" into the CPU L1 cache.
221da177e4SLinus Torvalds 	prefetch(x) should not cause any kind of exception, prefetch(0) is
231da177e4SLinus Torvalds 	specifically ok.
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds 	prefetch() should be defined by the architecture, if not, the
261da177e4SLinus Torvalds 	#define below provides a no-op define.
271da177e4SLinus Torvalds 
28*c8afaa1bSMateusz Guzik 	There are 2 prefetch() macros:
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds 	prefetch(x)  	- prefetches the cacheline at "x" for read
311da177e4SLinus Torvalds 	prefetchw(x)	- prefetches the cacheline at "x" for write
321da177e4SLinus Torvalds 
3325985edcSLucas De Marchi 	there is also PREFETCH_STRIDE which is the architecure-preferred
341da177e4SLinus Torvalds 	"lookahead" size for prefetching streamed operations.
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds */
371da177e4SLinus Torvalds 
381da177e4SLinus Torvalds #ifndef ARCH_HAS_PREFETCH
39ab483570SAndi Kleen #define prefetch(x) __builtin_prefetch(x)
401da177e4SLinus Torvalds #endif
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds #ifndef ARCH_HAS_PREFETCHW
43ab483570SAndi Kleen #define prefetchw(x) __builtin_prefetch(x,1)
441da177e4SLinus Torvalds #endif
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds #ifndef PREFETCH_STRIDE
471da177e4SLinus Torvalds #define PREFETCH_STRIDE (4*L1_CACHE_BYTES)
481da177e4SLinus Torvalds #endif
491da177e4SLinus Torvalds 
prefetch_range(void * addr,size_t len)501da177e4SLinus Torvalds static inline void prefetch_range(void *addr, size_t len)
511da177e4SLinus Torvalds {
521da177e4SLinus Torvalds #ifdef ARCH_HAS_PREFETCH
531da177e4SLinus Torvalds 	char *cp;
541da177e4SLinus Torvalds 	char *end = addr + len;
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds 	for (cp = addr; cp < end; cp += PREFETCH_STRIDE)
571da177e4SLinus Torvalds 		prefetch(cp);
581da177e4SLinus Torvalds #endif
591da177e4SLinus Torvalds }
601da177e4SLinus Torvalds 
prefetch_page_address(struct page * page)611fa5cef2SLi RongQing static inline void prefetch_page_address(struct page *page)
621fa5cef2SLi RongQing {
631fa5cef2SLi RongQing #if defined(WANT_PAGE_VIRTUAL) || defined(HASHED_PAGE_VIRTUAL)
641fa5cef2SLi RongQing 	prefetch(page);
651fa5cef2SLi RongQing #endif
661fa5cef2SLi RongQing }
671fa5cef2SLi RongQing 
681da177e4SLinus Torvalds #endif
69