昨天合并到 Linux 6.19 Git 代码库中的 “core/uaccess” 拉取请求引入了新的受限用户模式访问功能,具备自动清理功能。这可以减少在需要访问用户模式内存时遇到的推测屏障数量,从而避免一些由推测屏障引起的性能损失。
Intel 高级工程师 Thomas Gleixner 推动了 Linux 内核中的受限用户访问功能,目的是避免某些推测屏障的使用,以减少内核热代码路径中的性能开销。
Gleixner 在这个新内核功能的 core/uaccess 拉取请求中解释道:
“带自动清理的受限用户模式访问
在热点代码路径中可能需要访问用户模式内存,但如果必须使用用户控制的指针进行访问,那么该访问将通过推测屏障进行保护,以防止 CPU 绕过地址范围检查进行推测。这些推测屏障对性能有相当大的影响。可以通过“屏蔽”提供的指针,使其保证位于有效的用户内存访问范围内,否则指向一个确定未被填充的地址空间。这样操作必须避免使用分支,从而创建一个地址依赖性,CPU 无法对此进行推测。
这导致了重复且容易出错的编程模式:
if (can_do_masked_user_access())
from = masked_user_read_access_begin((from));
else if (!user_read_access_begin(from, sizeof(*from)))
return -EFAULT;
unsafe_get_user(val, from, Efault);
user_read_access_end();
return 0;
Efault:
user_read_access_end();
return -EFAULT;这可以通过使用作用域和自动清理来替代:
scoped_user_read_access(from, Efault)
unsafe_get_user(val, from, Efault);
return 0;
Efault:
return -EFAULT;”
内核的x86 futex和select代码是此次合并中已适配使用作用域用户访问的用户之一。
转自 Scoped User Access In Linux 6.19 To Reduce Speculation Barriers & Its Performance Hit – Phoronix
Linuxeden开源社区