[英]What's the reason for BUG_ON in __get_vm_area_node?
為什么在__get_vm_area_node
有這個斷言?
static struct vm_struct *__get_vm_area_node(...)
{
// ...
BUG_ON(in_interrupt())
// ...
}
我認為引入該行的提交很好地解釋了它:
如果
__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 flags,
+ unsigned long start, unsigned long end,
+ 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);
簡而言之,該函數中的以下代碼可以 sleep ,並且在中斷上下文中不允許sleep 。 添加BUG_ON
是為了防止此類問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.