删除节点
linux代码中在删除链表的节点时,会将删除的节点的prev和next指针分别指向LIST_POISON2和LIST_POISON1。这两个地址都是不可访问的地址,当访问时会发生page fault。基于此,在配置了CONFIG_DEBUG_LIST的情况下,可以利用这两个标志来判断节点的合法性。
static inline void list_del(struct list_head *entry)
{
__list_del_entry(entry);
entry->next = LIST_POISON1; //删除节点之后,置next为特定值LIST_POISON1
entry->prev = LIST_POISON2; //删除节点之后,置prev为特定值LIST_POISON2
}
在删除节点之前,检查待删除节点的合法性
static inline void __list_del_entry(struct list_head *entry)
{
if (!__list_del_entry_valid(entry))
return;
__list_del(entry->prev, entry->next);
}
如果没有配置CONFIG_DEBUG_LIST,合法性检查将直接返回true,即不检查。
#ifdef CONFIG_DEBUG_LIST
extern bool __list_add_valid(struct list_head *new,
struct list_head *prev,
struct list_head *next)