我正在编写一个内核模块,它使用模块范围的哈希图来存储连接。我想释放所有这些连接,当模块被卸载时,从 hashmap 中删除它们,然后删除整个 map。
我定义了哈希图:
#define CONNECTIONS_HASH_BITS 10
static DEFINE_HASHTABLE(connection_hashtable, CONNECTIONS_HASH_BITS);
添加条目
hash_add_rcu(connection_hashtable, &con->t_hash,
oat_hash(&con->key, sizeof(struct hash_key)));
最后要删除所有条目:
struct connection *result = NULL;
struct hlist_node *node;
unsigned int i;
hash_for_each_rcu(connection_hashtable, i, node, result, t_hash)
{
hash_del_rcu(node);
}
我的问题:
- 我可以在 for 循环中删除 hash_for_each_rcu 吗?
- 如何使这个线程安全?
- 我需要为 hashmap 调用类似 free_hash 的东西吗?(我的猜测是没有,因为它是一个数组并且没有调用 kalloc,但我对 c 不是那么好)
- 奖励:你有关于 Linux 内核中 RCU 的好/简单的教程吗?
谢谢