list_for_each_entry_rcu(bdi, &bdi_list, bdi_list) { structbdi_writeback*wb; if(!bdi_has_dirty_io(bdi)) continue; //遍历当前bdi设备中wb_list存储的所有wb list_for_each_entry_rcu(wb, &bdi->wb_list, bdi_node) wb_start_writeback(wb, wb_split_bdi_pages(wb, nr_pages), false, r...
但是在writer端,我们可以避免使用list_for_each_entry_rcu(),而使用list_for_each_entry()。
对此,Linux提供了list_for_each_entry()宏,第一个参数为传入的遍历指针,指向宿主数据结构,第二个参数为链表头,为list_head结构,第三个参数为list_head结构在宿主结构中的成员名。 #define list_for_each_entry(pos, head, member) / for (pos = list_entry((head)->next, typeof(*pos), member); / ...
static inline void list_del_rcu(struct list_head *entry) { __list_del(entry->prev, entry->next); entry->prev = (list_head *)LIST_POISON2; } /** * 用新的节点替换旧的节点。 * @old : the element to be replaced * @newentry : the new element to insert * Note: if 'old' was...
综上所述,我们可以了解到list_for_each_entry的作用:所有包含list_head的数据结构,均可使用此方法遍历链表;list_head结构体不包含数据部分,使用该函数进行遍历链表节点,然后在循环体中,对链表的数据部分进行读写操作,这就是list_for_each_entry的共通性 通过对链表中list成员的遍历,即可定位到链表的相关节点,进而...
#define list_for_each_entry_continue(pos, head, member) \ for (pos = list_entry(pos->member.next, typeof(*pos), member); \ prefetch(pos->member.next), &pos->member != (head); \ pos = list_entry(pos->member.next, typeof(*pos), member)) ...
* @new: new entry to be added 被添加的新的条目 * @head: list head to add it after 新条目被添加到head之后 * * Insert a new entry after the specified head. 在某个节点之后新添加一个条目 * This is good for implementing stacks. 这个适用于实现栈 ...
如果遍历不是从链表头开始,而是从已知的某个节点pos开始,则可以使用list_for_each_entry_continue(pos,head,member)。有时还会出现这种需求,即经过一系列计算后,如果pos有值,则从pos开始遍历,如果没有,则从链表头开始,为此,Linux专门提供了一个list_prepare_entry(pos,head,member)宏,将它的返回值作为list_for_...
我们说不能在foreach 中进行,但是使用普通的for 循环还是可以的,因为普通for 循环并没有用到Iterator ...
3.11. list_for_each_entry_continue 13 3.11.1. 定义 13 3.11.2. 作用 13 3.11.3. 区别 13 3.12. list_for_each_safe_rcu 14 4. hlist(hash list) 14 4.1. hlist(hash list)结构 14 4.1.1. 简述 14 4.1.2. 定义 14 1. 前言 Linux内核实现了一批优雅而功能强大的双向循环列表操作宏,它们位于/...