为什么内核函数:get_next_corpse在找到nf_conn后增加计数器?

时间:2018-03-08 05:41:21

标签: networking linux-kernel atomic netfilter rcu

我正在阅读内核源代码并尝试了解ip conntrack的机制。如何理解get_next_corpse函数,它增加了被清理的nf_conn结构的计数器。

static struct nf_conn *
get_next_corpse(struct net *net, int (*iter)(struct nf_conn *i, void *data),
        void *data, unsigned int *bucket)
{
    struct nf_conntrack_tuple_hash *h;
    struct nf_conn *ct;
    struct hlist_nulls_node *n;

    spin_lock_bh(&nf_conntrack_lock);
    for (; *bucket < nf_conntrack_htable_size; (*bucket)++) {
        hlist_nulls_for_each_entry(h, n, &net->ct.hash[*bucket], hnnode) {
            ct = nf_ct_tuplehash_to_ctrack(h);
            if (iter(ct, data))
                goto found;
        }
    }
    hlist_nulls_for_each_entry(h, n, &net->ct.unconfirmed, hnnode) {
        ct = nf_ct_tuplehash_to_ctrack(h);
        if (iter(ct, data))
            set_bit(IPS_DYING_BIT, &ct->status);
    }
    spin_unlock_bh(&nf_conntrack_lock);
    return NULL;
found:
    atomic_inc(&ct->ct_general.use);    //Why ??!
    spin_unlock_bh(&nf_conntrack_lock);
    return ct;
}

当发现ct被清理时,为什么需要atomic_inc(&amp; ct-&gt; ct_general.use)?

1 个答案:

答案 0 :(得分:0)

只是为了保持并发/抢占的conntrack的一致性。

与OS教科书引入的P / V操作类似。