2

モジュール全体のハッシュマップを使用して接続を保存するカーネルモジュールを作成しています。モジュールがアンロードされたときに、これらすべての接続を解放し、ハッシュマップからそれらを削除してから、マップ全体を削除したいと考えています。

ハッシュマップを定義しました:

#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 で削除できますか?
  • これをスレッドセーフにするにはどうすればよいですか?
  • ハッシュマップに free_hash のようなものを呼び出す必要がありますか? (これは配列であり、kallocが呼び出されていないため、ここではないと思いますが、cはあまり得意ではありません)
  • おまけ: Linux カーネルの RCU に関する優れた/簡単なチュートリアルはありますか?

ありがとうございました

4

0 に答える 0