优化原理
TLB flush range是arm64芯片在armv8.4-TLBI版本上支持的一种指令集批量处理地址刷新的特性,需要内核配置文件开启CONFIG_ARM64_TLB\_RANGE功能,此外还需要arm64芯片支持armv8.4-TLBI特性。 传统的TLB flush操作方式,以stride为粒度去进行TLB flush, 这种方式存在明显弊端,对于需要刷新大量的地址范围,需要将其拆分为一个个stride粒度去进行刷新,导致耗时较多。TLB flush range的意义在于动态切割地址范围, 按照如下设计思想: 每一次刷新页数目由numa和scale两个变量决定,num值方位为(-1, 31), 通过__TLBI_RANGE_NUM传入的剩余需要刷新的pages数以及scale的值获得num具体的值,当num=-1时,表示刷新完成。
#define TLBI_RANGE_MASK GENMASK_ULL(4, 0)
#define __TLBI_RANGE_NUM(pages, scale) \
((((pages) >> (5 * (scale) + 1)) & TLBI_RANGE_MASK) - 1)
scale的值按照0逐渐递增,结合num值,统计出此次刷新的页数。
#define __TLBI_RANGE_PAGES(num, scale) \
((unsigned long)((num) + 1) << (5 * (scale) + 1))
按照rvale1is格式,将地址start, 以及scale和num值,写入rvale1is寄存器中,对页进行刷新操作。
__TLBI_VADDR_RANGE(start, asid, scale, num, tlb_level);
__tlbi(rvale1is, addr);
__tlbi_user(rvale1is, addr);
使用方法
使用Alinux3.2208及以后版本
Alinux3在2208版本(内核版本5.10.134-12_rc1)已默认启用该特性
文章来源:龙蜥社区
推荐阅读
更多Arm服务器相关技术及移植干货请关注Arm服务器专栏。如要加入Arm Server微信群,请添加极术小姐姐(微信id:aijishu20)备注Arm服务器邀请加入。