问题描述
为什么在__get_vm_area_node
中使用此断言?
static struct vm_struct *__get_vm_area_node(...)
{
// ...
BUG_ON(in_interrupt())
// ...
}
解决方法
我认为the commit that introduced that line解释得很好:
如果调用
__vmalloc
以原子方式GFP_ATOMIC
分配内存 在上下文中,调用链导致__get_vm_area_node
分配内存vm_struct
与GFP_KERNEL
一起使用,导致“从无效上下文中休眠” 警告。该补丁通过传递gfp标志来修复它,因此__get_vm_area_node
使用相同的标志为vm_struct
分配内存。
@@ -160,13 +160,15 @@ int map_vm_area(struct vm_struct *area,pgprot_t prot,struct page ***pages)
return err;
}
-struct vm_struct *__get_vm_area_node(unsigned long size,unsigned long flags,- unsigned long start,unsigned long end,int node)
+static struct vm_struct *__get_vm_area_node(unsigned long size,+ unsigned long start,+ int node,gfp_t gfp_mask)
{
struct vm_struct **p,*tmp,*area;
unsigned long align = 1;
unsigned long addr;
+ BUG_ON(in_interrupt());
if (flags & VM_IOREMAP) {
int bit = fls(size);
简而言之,该函数中的以下代码可以休眠,并且在中断上下文中不允许休眠。添加BUG_ON
可以防止这种问题。