xref: /linux/include/linux/cache.h (revision 4af57b787b4be09419a2bb48aa705fa87ef41cca)
11da177e4SLinus Torvalds #ifndef __LINUX_CACHE_H
21da177e4SLinus Torvalds #define __LINUX_CACHE_H
31da177e4SLinus Torvalds 
41da177e4SLinus Torvalds #include <linux/kernel.h>
51da177e4SLinus Torvalds #include <asm/cache.h>
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds #ifndef L1_CACHE_ALIGN
81da177e4SLinus Torvalds #define L1_CACHE_ALIGN(x) ALIGN(x, L1_CACHE_BYTES)
91da177e4SLinus Torvalds #endif
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #ifndef SMP_CACHE_BYTES
121da177e4SLinus Torvalds #define SMP_CACHE_BYTES L1_CACHE_BYTES
131da177e4SLinus Torvalds #endif
141da177e4SLinus Torvalds 
15804f1594SKyle McMartin #ifndef __read_mostly
166c036527SChristoph Lameter #define __read_mostly
176c036527SChristoph Lameter #endif
186c036527SChristoph Lameter 
191da177e4SLinus Torvalds #ifndef ____cacheline_aligned
201da177e4SLinus Torvalds #define ____cacheline_aligned __attribute__((__aligned__(SMP_CACHE_BYTES)))
211da177e4SLinus Torvalds #endif
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds #ifndef ____cacheline_aligned_in_smp
241da177e4SLinus Torvalds #ifdef CONFIG_SMP
251da177e4SLinus Torvalds #define ____cacheline_aligned_in_smp ____cacheline_aligned
261da177e4SLinus Torvalds #else
271da177e4SLinus Torvalds #define ____cacheline_aligned_in_smp
281da177e4SLinus Torvalds #endif /* CONFIG_SMP */
291da177e4SLinus Torvalds #endif
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds #ifndef __cacheline_aligned
321da177e4SLinus Torvalds #define __cacheline_aligned					\
331da177e4SLinus Torvalds   __attribute__((__aligned__(SMP_CACHE_BYTES),			\
34*4af57b78STim Abbott 		 __section__(".data..cacheline_aligned")))
351da177e4SLinus Torvalds #endif /* __cacheline_aligned */
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds #ifndef __cacheline_aligned_in_smp
381da177e4SLinus Torvalds #ifdef CONFIG_SMP
391da177e4SLinus Torvalds #define __cacheline_aligned_in_smp __cacheline_aligned
401da177e4SLinus Torvalds #else
411da177e4SLinus Torvalds #define __cacheline_aligned_in_smp
421da177e4SLinus Torvalds #endif /* CONFIG_SMP */
431da177e4SLinus Torvalds #endif
441da177e4SLinus Torvalds 
4522fc6eccSRavikiran G Thirumalai /*
4622fc6eccSRavikiran G Thirumalai  * The maximum alignment needed for some critical structures
4722fc6eccSRavikiran G Thirumalai  * These could be inter-node cacheline sizes/L3 cacheline
4822fc6eccSRavikiran G Thirumalai  * size etc.  Define this in asm/cache.h for your arch
4922fc6eccSRavikiran G Thirumalai  */
5022fc6eccSRavikiran G Thirumalai #ifndef INTERNODE_CACHE_SHIFT
5122fc6eccSRavikiran G Thirumalai #define INTERNODE_CACHE_SHIFT L1_CACHE_SHIFT
5222fc6eccSRavikiran G Thirumalai #endif
5322fc6eccSRavikiran G Thirumalai 
5422fc6eccSRavikiran G Thirumalai #if !defined(____cacheline_internodealigned_in_smp)
551da177e4SLinus Torvalds #if defined(CONFIG_SMP)
5622fc6eccSRavikiran G Thirumalai #define ____cacheline_internodealigned_in_smp \
5722fc6eccSRavikiran G Thirumalai 	__attribute__((__aligned__(1 << (INTERNODE_CACHE_SHIFT))))
581da177e4SLinus Torvalds #else
5922fc6eccSRavikiran G Thirumalai #define ____cacheline_internodealigned_in_smp
601da177e4SLinus Torvalds #endif
611da177e4SLinus Torvalds #endif
621da177e4SLinus Torvalds 
631b27d05bSPekka Enberg #ifndef CONFIG_ARCH_HAS_CACHE_LINE_SIZE
641b27d05bSPekka Enberg #define cache_line_size()	L1_CACHE_BYTES
651b27d05bSPekka Enberg #endif
661b27d05bSPekka Enberg 
671da177e4SLinus Torvalds #endif /* __LINUX_CACHE_H */
68