使用
//结构体
struct cgroup_subsys memory_cgrp_subsys __read_mostly;
//指针
struct mem_cgroup *root_mem_cgroup __read_mostly;
//数值
int do_swap_account __read_mostly;
作用
会将这些带__read_mostly的变量放入.data…read_mostly这个section中,这个主要在编译的链接阶段起作用,
在链接时会把这些值放在同一个区间块, __read_mostly是在cache.h定义的,猜也能猜出来跟Cache相关了。
kernel-4.14/arch/arm64/include/asm/cache.h
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
/kernel-4.14/include/asm-generic/vmlinux.lds.h
258 #define READ_MOSTLY_DATA(align) \
259 . = ALIGN(align); \
260 *(.data..read_mostly) \
261 . = ALIGN(align);
................
895 #define RW_DATA_SECTION(cacheline, pagealigned, inittask) \
896 . = ALIGN(PAGE_SIZE); \
897 .data : AT(ADDR(.data) - LOAD_OFFSET) { \
898 INIT_TASK_DATA(inittask) \
899 NOSAVE_DATA \
900 PAGE_ALIGNED_DATA(pagealigned) \
901 CACHELINE_ALIGNED_DATA(cacheline) \
902 READ_MOSTLY_DATA(cacheline) \
903 DATA_DATA \
904 CONSTRUCTORS \
905 } \
906 BUG_TABLE
kernel-4.14/arch/arm64/kernel/vmlinux.lds.S#193
187 . = ALIGN(SEGMENT_ALIGN);
188 __initdata_end = .;
189 __init_end = .;
190
191 _data = .;
192 _sdata = .;
193 RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN)
也就是把所有的__read_mostly的变量以大小cacheline的size对齐放到同一个区别,这样CPU读写数据时,会把这些__read_mostl的变量先放到Cache中,会增加Cache hit的概率,使整个系统的性能增加。