- 论坛徽章:
- 0
|
回复 1# smalloc
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
展开,即是:
for (pos = list_entry((head)->next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member)) {
.........
{
__list_del(pos->member.prev, pos->member.next);
pos->member.next = LIST_POISON1;
pos->member.prev = LIST_POISON2;
}
........
}
在删除pos后,pos = list_entry(pos->member.next, typeof(*pos), member);
这时 prefetch(pos->member.next), 取到的是POISON1所指向的数据,然后,(pos->member != (head))自然不会成立。同时LIST_POISON1 所指向的数据访问,有可能会出现kernel panic,或其他一些异常。
|
|