モジュール全体のハッシュマップを使用して接続を保存するカーネルモジュールを作成しています。モジュールがアンロードされたときに、これらすべての接続を解放し、ハッシュマップからそれらを削除してから、マップ全体を削除したいと考えています。
ハッシュマップを定義しました:
#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 に関する優れた/簡単なチュートリアルはありますか?
ありがとうございました