static inline voidlist_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } 删除操作 删除两个元素之间的元素 static inline void __list_del(struct list_head * prev, struct list_head *
list_del_init———从链表中删除条目后重新初始化 list_move———从一个链表中删除并加入为另一个链表的头部 list_move_tail———从一个列表中删除并加入为另一个链表的尾部 list_is_last———测试是否为链表的最后一个条目 list_empty———测试链表是否为空 list_empty_careful———测试链表是否为空并...
BUG_ON(work->entry.next && !list_empty(&work->entry)); list_add_tail(&work->entry, target_list);//将binder_work的entry成员加入target_list中 } 由此先熟悉kernel中list的实现以及常用方法,以帮助学习Binder内容。 1. 内核链表初始化 1.1 创建型初始化 #define LIST_HEAD_INIT(name) { &(name),...
staticinlinevoidlist_move(structlist_head *list,structlist_head *head)staticinlinevoidlist_move_tail(structlist_head *list,structlist_head *head) 前者是加入的时候使用头插法,后者使用的是尾插法。 //将一个元素移动到另一个list的头部staticinlinevoidlist_move(structlist_head *list,structlist_head *...
backing_dev_info中维护了wb_list链表,管理bdi_writeback,同时每个bdi_writeback中维护了dwork和work_list,前者代表处理任务的函数,后者则是任务列表。 在bdi_init中对bdi进行初始化后,会继续调用倒wb_init,该函数对bdi中的wb(struct bdi_writeback)进行初始化。
return !list_empty(&q->task_list); } 判断等待对列头是否为空,当一个进程访问设备而得不到资源时就会被放入等待队列头指向的等待队列中。 static inline void __add_wait_queue(wait_queue_head_t *head,\ wait_queue_t *new) / { list_add(&new->task_list, &head->task_list); ...
list_move_tail(struct list_head *list, struct list_head *head): 将第一个链表移动到, 到第二个链表后面 list_empty(struct list_head *head): 判断这个链表是否为空 list_splice(struct list_head *list, struct list_head *head): 将第一个链表接到第二个链表的开头. ...
whether a list is empty and not being modified */ static inline int list_empty_careful(const struct list_head *head) { struct list_head *next = head->next; return (next == head) && (next == head->prev); } static inline int list_is_singular(const struct list_head *head) { ...
list_empty(&area->free_list[MIGRATE_CMA])) { return true; } #endif } return false; } 我们知道zone_per_state用来访问每个内存域的统计量. 在上述代码中, 得到的是空闲页的数目. 代码语言:javascript 代码运行次数:0 运行 AI代码解释 free_pages -= zone_page_state(z, NR_FREE_CMA_PAGES); 在...
static void net_rx_action(struct softirq_action *h){struct softnet_data *sd = &__get_cpu_var(softnet_data);unsigned long time_limit = jiffies + 2;int budget = netdev_budget;void *have;local_irq_disable();while(!list_empty(&sd->poll_list)) {...n = list_first_entry(&sd->poll_...