为什么在Linux内核中,radix_tree_preload会禁用抢先进程

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

http://lwn.net/Articles/175432/

在这篇文章中,它提到了radix_tree_preload分配足够的内存,以便在树中的后续插入不会失败。 尽pipe它在每个CPU的基础上分配结构,因此该function在禁用抢占的情况下返回。 调用者的权限是调用radix_tree_preload_end以启用抢占。

我的问题是:

1)为什么radix_tree_preload在每个CPU的基础上分配结构?

2)用户何时应该调用radix_tree_preload_end? 紧跟在radix_tree_insert之后吗?

3)基数树是否被用于页面caching操作,不会影响性能,因此任何插入都会导致抢占被禁用? 如果我的理解错误,请纠正我。

(1)为确保您的请求按要求执行,一个CPU将处理整个插入顺序。 如果在完全初始化结构之前将进程移动到另一个CPU,则另一个CPU将从它自己的每个CPU副本(针对每个CPU变量的优点,另请参阅,例如, 这里 )工作,如果某些已经完成了最初的CPU。

(2)所以你想留出足够的内存,禁用抢占,插入/删除,然后重新启用抢占,所有在最初启动序列的上下文中。 这意味着,是的,您_preload,_insert,然后_preload_end立即让您的系统再次从抢先受益。

(3)性能下降很小,但为了确保数据的完整性,如果选择每个CPU变量,这是很难避免的。 内核开发者必须判断比弊端更重要的好处,而且他们一般是正确的。