Linux kernel 我可以知道在Linux内核中,GFP_硬墙标志的用途是什么吗?

Linux kernel 我可以知道在Linux内核中,GFP_硬墙标志的用途是什么吗?,linux-kernel,kernel,Linux Kernel,Kernel,GFP标志用于内存分配。Linux内核中GFP_硬墙标志的用途是什么?我不能确定。您可能指的是\uugfp\uhardwall,这是一个内部符号,您实际上不应该看到它。然而,以下是我的发现 发件人: 评论#定义uu GFP\u硬墙: /*强制硬墙cpuset内存分配*/ 我并不是真的理解hardwall在那句话中的意思,但你可能理解GFP\U硬墙用于GFP\U用户、GFP\U高用户和GFP\U高用户以及GFP\U约束的定义。从前三个方面来看,我猜这与用户空间有关 发件人: 关于\u cpuset

GFP标志用于内存分配。Linux内核中GFP_硬墙标志的用途是什么?

我不能确定。您可能指的是
\uugfp\uhardwall
,这是一个内部符号,您实际上不应该看到它。然而,以下是我的发现

发件人:

评论
#定义uu GFP\u硬墙

/*强制硬墙cpuset内存分配*/

我并不是真的理解hardwall在那句话中的意思,但你可能理解
GFP\U硬墙
用于
GFP\U用户
GFP\U高用户
GFP\U高用户
以及
GFP\U约束
的定义。从前三个方面来看,我猜这与用户空间有关

发件人:

关于
\u cpuset\u node\u allowed\u softwall
功能的评论(部分省略):

*cpuset\u node\u allowed\u softwall-我们可以在内存节点上进行分配吗?
* ...
*如果我们处于中断状态,是的,我们总是可以分配。如果为GFP,则此节点为
*设置,是的,我们可以随时分配。如果节点在我们的任务的mems_允许范围内,
*对。如果它不是一个uu GFP_硬墙请求,并且该节点位于最近的
*此任务的cpuset的硬墙cpuset祖先,是的。如果任务已完成
*按照TIF_MEMDIE的规定,OOM已被终止并可以访问内存保留
*国旗,是的。
*否则,不会。
*
*如果设置了_GFP_HARDWALL,则cpuset_node_allowed_softwall()将减少为
*cpuset\u节点\u允许\u硬墙()。否则,cpuset_node_allowed_softwall()
*可能处于休眠状态,并且可能允许来自封闭cpuset的节点。
*
*cpuset_node_allowed_hardwall()只处理较简单的硬墙情况
*每天睡觉,从不睡觉。
*
* 
*
*GFP_用户分配用uu GFP_硬墙位标记,
*并且不允许在当前任务cpuset之外进行分配
*除非任务已按TIF_MEMDIE标记终止。
*GFP_内核分配没有这样标记,因此可以转义到
*最近的封闭硬墙建筑群cpuset。
*
*扫描父cpusets需要回调互斥。这个
*\uuuu alloc\u pages()例程仅在此处使用\uuuu GFP\u硬墙位调用
*如果是GFP_内核分配,则不设置
*在第一次通过时,当前任务是空的
*地带学家。因此,只有GFP_内核分配,如果
*cpuset内存不足,可能需要使用回调\u互斥
*互斥。
*
*mm/page_alloc的第一个调用:get_page_from_freelist()
*在GFP_面具中设置了u GFP_硬墙,强制执行硬墙cpusets,
*因此,不允许在cpuset之外的节点上进行分配(除非
*当然是打断)。
*
* 
*
*规则:
*如果无法入睡,请不要呼叫cpuset\u node\u allowed\u softwall,除非
*传入GFP_标志中设置的_GFP_硬墙标志,该标志将禁用
*可能扫描祖先cpusets和sleep的代码。
在同一文件中,还有对硬墙cpuset和硬墙内存的引用。仍然不确定hardwall到底是什么意思,但让我们跟随它到cpuset

(瓷砖建筑中有很多提到硬墙,但因为这是唯一的一个,我相信这与我们在这里讨论的内容无关)

我中了头奖。报告说:

1.4什么是专用cpusets? 如果一个cpuset是cpu或mem独占的,则除了 直系祖先或后代可以共享任何相同的CPU或 内存节点

cpuset是cpuset.mem_独占的或cpuset.mem_硬墙是“硬墙的”, i、 它限制页面、缓冲区和其他数据的内核分配 由内核跨多个用户共享。所有cpusets, 无论是否为硬墙,都会限制用户的内存分配 空间这允许配置一个系统,以使多个独立的 作业可以共享通用的内核数据,例如文件系统页面,而 在各自的cpuset中隔离每个作业的用户分配。为此,, 构建一个大型mem_专用cpuset以容纳所有作业,以及 为每个作业构造非成员独占的子CPU。 只有少量的典型内核内存,例如来自 中断处理程序,即使在 mem_独家cpuset


我将把这个留给你们,因为我所做的任何结论事实上都可能是错误的。希望在这一特定领域有更多的知识的人会来启发我们。

它将分配限制到当前的cpuset,其中cpuset是一组(猜测!)cpu和内存节点

基本上,您的用户进程可能被限制在由CPU#1和CPU#2组成的cpuset中,而不是CPU#3或CPU#4。可能有一些内存MEM#1是CPU#1和#2的本地内存,但其他内存则不是,因此该内存是cpuset的一部分。可能在CPU 3和CPU 4的本地还有一些其他内存MEM 2,所以这个不是cpuset的一部分


__GFP#U硬墙确保您无法从MEM#2进行分配。

该符号是否存在?或者你指的是
\uuugfp\uhardwall
?这个例子很容易理解!
* cpuset_node_allowed_softwall - Can we allocate on a memory node?
* ...
* If we're in interrupt, yes, we can always allocate. If __GFP_THISNODE is
* set, yes, we can always allocate. If node is in our task's mems_allowed,
* yes. If it's not a __GFP_HARDWALL request and this node is in the nearest
* hardwalled cpuset ancestor to this task's cpuset, yes. If the task has been
* OOM killed and has access to memory reserves as specified by the TIF_MEMDIE
* flag, yes.
* Otherwise, no.
*
* If __GFP_HARDWALL is set, cpuset_node_allowed_softwall() reduces to
* cpuset_node_allowed_hardwall(). Otherwise, cpuset_node_allowed_softwall()
* might sleep, and might allow a node from an enclosing cpuset.
*
* cpuset_node_allowed_hardwall() only handles the simpler case of hardwall
* cpusets, and never sleeps.
*
* <OMITTED>
*
* GFP_USER allocations are marked with the __GFP_HARDWALL bit,
* and do not allow allocations outside the current tasks cpuset
* unless the task has been OOM killed as is marked TIF_MEMDIE.
* GFP_KERNEL allocations are not so marked, so can escape to the
* nearest enclosing hardwalled ancestor cpuset.
*
* Scanning up parent cpusets requires callback_mutex. The
* __alloc_pages() routine only calls here with __GFP_HARDWALL bit
* _not_ set if it's a GFP_KERNEL allocation, and all nodes in the
* current tasks mems_allowed came up empty on the first pass over
* the zonelist. So only GFP_KERNEL allocations, if all nodes in the
* cpuset are short of memory, might require taking the callback_mutex
* mutex.
*
* The first call here from mm/page_alloc:get_page_from_freelist()
* has __GFP_HARDWALL set in gfp_mask, enforcing hardwall cpusets,
* so no allocation on a node outside the cpuset is allowed (unless
* in interrupt, of course).
*
* <OMITTED>
*
* Rule:
* Don't call cpuset_node_allowed_softwall if you can't sleep, unless you
* pass in the __GFP_HARDWALL flag set in gfp_flag, which disables
* the code that might scan up ancestor cpusets and sleep.