2

我正在编写一个内核模块,它使用模块范围的哈希图来存储连接。我想释放所有这些连接,当模块被卸载时,从 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 的好/简单的教程吗?

谢谢

4

0 回答 0