- 论坛徽章:
- 0
|
那里的代码有spin_lock和spin_unlock_bh配合使用的?能贴出来看下吗?spin_lock和spin_unlock_bh应该是 ...
simohayha_cu 发表于 2010-07-29 16:24 ![]()
不是说 spin_lock 与 spin_unlock_bh 配套用
而是针对同一个 lock,有时 spin_lock/spin_unlock,有时 spin_lock_bh/spin_unlock_bh,这样正常吗?
比如下面 net/netfilter/nf_conntrack_core.c 中的一段代码(2.6.34),nf_conntrack_lock 就是被这样处理的
- void nf_ct_delete_from_lists(struct nf_conn *ct)
- {
- struct net *net = nf_ct_net(ct);
- nf_ct_helper_destroy(ct);
- spin_lock_bh(&nf_conntrack_lock);
- /* Inside lock so preempt is disabled on module removal path.
- * Otherwise we can get spurious warnings. */
- NF_CT_STAT_INC(net, delete_list);
- clean_from_lists(ct);
- spin_unlock_bh(&nf_conntrack_lock);
- }
- EXPORT_SYMBOL_GPL(nf_ct_delete_from_lists);
- static void death_by_event(unsigned long ul_conntrack)
- {
- struct nf_conn *ct = (void *)ul_conntrack;
- struct net *net = nf_ct_net(ct);
- if (nf_conntrack_event(IPCT_DESTROY, ct) < 0) {
- /* bad luck, let's retry again */
- ct->timeout.expires = jiffies +
- (random32() % net->ct.sysctl_events_retry_timeout);
- add_timer(&ct->timeout);
- return;
- }
- /* we've got the event delivered, now it's dying */
- set_bit(IPS_DYING_BIT, &ct->status);
- spin_lock(&nf_conntrack_lock);
- hlist_nulls_del(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode);
- spin_unlock(&nf_conntrack_lock);
- nf_ct_put(ct);
- }
复制代码 |
|