Почему ядро функционирует:get_next_corpse увеличивает счетчик после обнаружения nf_conn?
Я читаю исходный код ядра и пытаюсь понять механизм 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(&ct->ct_general.use)?
1 ответ
Решение
Просто для сохранения последовательности для этого conntrack для параллелизма / вытеснения.
Как и операция P/V, представленная в учебнике по ОС.