void insert_node(struct person *node, struct hlist_head *head) { hlist_add_head(&node->hash_node, head); } 使用hlist_add_head()函数可以方便地将节点插入到哈希表的链表头部,适用于需要在链表头部添加节点的场景,例如在哈希表中插入新的节点或进行相关操作。 (2-7)在指定的条目之前添加一个新条目 ...
hlist_add_head(&mn->hlist, &mm->mmu_notifiers); /* (2) */ ... Once mmu_notifier_register() releases the mm locks, another thread can invalidate a range: mmu_notifier_invalidate_range() ... hlist_for_each_entry_rcu(mn, &mm->mmu_notifiers, hlist) { if (mn->ops->invalidate_...
* @key: the key of the object to be added*/#definehash_add(hashtable, node, key) \hlist_add_head(node,&hashtable[hash_min(key, HASH_BITS(hashtable))])/** * hash_add_rcu - add an object to a rcu enabled hashtable * @hashtable: hashtable to add to * @node: the &struct h...
static inline void__list_add(struct list_head *inserted, struct list_head *prev, struct list_head *next) { next->prev = inserted; inserted->next = next; inserted->prev = prev; prev->next = inserted; } static inline voidlist_add_tail(struct list_head *inserted, struct list_head *hea...
@@ -528,10 +528,10 @@ static inline void hlist_add_head_rcu(struct hlist_node *n, struct hlist_node *first = h->first;n->next = first; n->pprev = &h->first; WRITE_ONCE(n->pprev, &h->first); rcu_assign_pointer(hlist_first_rcu(h), n); ...
sk_nulls_for_each_rcu(sk, node, &head->chain) { if (likely(INET_MATCH(sk, net, acookie, saddr, daddr, ports, dif))) { if (unlikely(!atomic_inc_not_zero(&sk->sk_refcnt))) goto out; if (unlikely(!INET_MATCH(sk, net, acookie, saddr, daddr, ports, dif))) { ...
这个牵涉到RCU(Read-Copy-Update),在这里不详细讲解了,如有兴趣,请参考《玩转多线程编程.ppt》一文。 4. hlist(hash list) 4.1. hlist(hash list)结构 4.1.1. 简述 hlist也是 一种双向链表,但不同于list_head,它的头部只有一个指针,常被用作哈希表的bucket数组,这样就可减少哈希bucket一半的内存消耗。
static inline voidhlist_add_head(structhlist_node *n,structhlist_head *h) { structhlist_node *first = h->first; n->next = first; if(first) first->pprev = &n->next; h->first = n; n->pprev = &h->first; } 首先讨论条件(1)。
(p->name,name);hash_add_rcu(planet_htable,&p->node,p->mass);returnp;}voiddestroy_planet(structplanet*p){hash_del_rcu(&p->node);vfree(p);}voidhlist_print(void){structplanet*p;inti=0;hash_for_each_rcu(planet_htable,i,p,node){pr_info("i: %d, p: %px, p->name: %s\n",i...
prefetch(pos->member.next), &pos->member != (head); \ pos = list_entry(pos->member.next, typeof(*pos), member)) 3.11.2. 作用 以顺时针方向,从pos点开始遍历链表。 3.11.3. 区别 3.12. list_for_each_safe_rcu 这个牵涉到RCU(Read-Copy-Update),在这里不详细讲解了,如有兴趣,请参考《玩转...