微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在__get_vm_area_node中BUG_ON的原因是什么?

如何解决在__get_vm_area_node中BUG_ON的原因是什么?

为什么在__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_structGFP_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可以防止这种问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。