为什么在linux内核中,基数树预加载返回时禁用了抢占

为什么在linux内核中,基数树预加载返回时禁用了抢占,linux,linux-kernel,preemption,radix-tree,Linux,Linux Kernel,Preemption,Radix Tree,我正在阅读一篇关于linux内核基树实现的文章,文章的链接如下: 在本文中,它提到了radix_tree_preload分配了足够的内存,以便在树中的后续插入不会失败。尽管它基于每个CPU分配结构,因此函数返回时禁用了抢占。调用方有责任调用基数树预加载端以启用抢占 我的问题是: 1) 为什么基数树预加载按每个CPU分配结构 2) 用户应该何时调用基数树预加载结束?它是在基数树插入之后立即进行的吗 3) 它不会影响性能,因为基数树用于页缓存操作,因此任何插入都会导致禁用抢占?如果我的理解有误,请

我正在阅读一篇关于linux内核基树实现的文章,文章的链接如下:

在本文中,它提到了radix_tree_preload分配了足够的内存,以便在树中的后续插入不会失败。尽管它基于每个CPU分配结构,因此函数返回时禁用了抢占。调用方有责任调用基数树预加载端以启用抢占

我的问题是:

1) 为什么基数树预加载按每个CPU分配结构

2) 用户应该何时调用基数树预加载结束?它是在基数树插入之后立即进行的吗

3) 它不会影响性能,因为基数树用于页缓存操作,因此任何插入都会导致禁用抢占?如果我的理解有误,请纠正我。

(1)为确保您的请求按要求执行,一个CPU将处理整个插入序列。如果在结构完全初始化之前将进程移动到另一个CPU,则另一个CPU将从其自己的每CPU副本工作(有关每CPU变量的优点,请参见,例如),如果某些工作已经在初始CPU上完成,则情况将有所不同。

(2) 因此,您需要留出足够的内存,禁用抢占、插入/删除,然后重新启用抢占,所有这些都是在最初启动序列的上下文中进行的。这意味着,是的,您可以预加载、\u插入,然后\u预加载\u结束,以使您的系统尽快从抢占中再次受益。


(3) 对性能的影响很小,但为了确保数据完整性,如果选择每CPU变量,这是很难(不可能)避免的。内核开发人员必须判断哪些优点比哪些缺点更重要,而且他们通常是对的。

感谢您的回答。