1#ifndef __LINUX_CACHE_H 2#define __LINUX_CACHE_H 3 4#include <uapi/linux/kernel.h> 5#include <asm/cache.h> 6 7#ifndef L1_CACHE_ALIGN 8#define L1_CACHE_ALIGN(x) __ALIGN_KERNEL(x, L1_CACHE_BYTES) 9#endif 10 11#ifndef SMP_CACHE_BYTES 12#define SMP_CACHE_BYTES L1_CACHE_BYTES 13#endif 14 15/* 16 * __read_mostly is used to keep rarely changing variables out of frequently 17 * updated cachelines. If an architecture doesn't support it, ignore the 18 * hint. 19 */ 20#ifndef __read_mostly 21#define __read_mostly 22#endif 23 24/* 25 * __ro_after_init is used to mark things that are read-only after init (i.e. 26 * after mark_rodata_ro() has been called). These are effectively read-only, 27 * but may get written to during init, so can't live in .rodata (via "const"). 28 */ 29#ifndef __ro_after_init 30#define __ro_after_init __attribute__((__section__(".data..ro_after_init"))) 31#endif 32 33#ifndef ____cacheline_aligned 34#define ____cacheline_aligned __attribute__((__aligned__(SMP_CACHE_BYTES))) 35#endif 36 37#ifndef ____cacheline_aligned_in_smp 38#ifdef CONFIG_SMP 39#define ____cacheline_aligned_in_smp ____cacheline_aligned 40#else 41#define ____cacheline_aligned_in_smp 42#endif /* CONFIG_SMP */ 43#endif 44 45#ifndef __cacheline_aligned 46#define __cacheline_aligned \ 47 __attribute__((__aligned__(SMP_CACHE_BYTES), \ 48 __section__(".data..cacheline_aligned"))) 49#endif /* __cacheline_aligned */ 50 51#ifndef __cacheline_aligned_in_smp 52#ifdef CONFIG_SMP 53#define __cacheline_aligned_in_smp __cacheline_aligned 54#else 55#define __cacheline_aligned_in_smp 56#endif /* CONFIG_SMP */ 57#endif 58 59/* 60 * The maximum alignment needed for some critical structures 61 * These could be inter-node cacheline sizes/L3 cacheline 62 * size etc. Define this in asm/cache.h for your arch 63 */ 64#ifndef INTERNODE_CACHE_SHIFT 65#define INTERNODE_CACHE_SHIFT L1_CACHE_SHIFT 66#endif 67 68#if !defined(____cacheline_internodealigned_in_smp) 69#if defined(CONFIG_SMP) 70#define ____cacheline_internodealigned_in_smp \ 71 __attribute__((__aligned__(1 << (INTERNODE_CACHE_SHIFT)))) 72#else 73#define ____cacheline_internodealigned_in_smp 74#endif 75#endif 76 77#ifndef CONFIG_ARCH_HAS_CACHE_LINE_SIZE 78#define cache_line_size() L1_CACHE_BYTES 79#endif 80 81#endif /* __LINUX_CACHE_H */ 82