2015-10-12 10 views
10

ネットフィルタフックと相互作用するカーネルモジュールを作成しました。 ネットフィルタフックは、Softirqコンテキストで動作します。ネットワーク処理におけるスピン変種の使用

私はグローバルデータ構造 "ハッシュテーブル"にアクセスしています。これはsoftirqコンテキストとProcessコンテキストです。プロセスコンテキストへのアクセスは、sysctlファイルがハッシュテーブルの内容を変更するために使用されているためです。

私はspinlock_irq_saveを使用しています。

このspin_lock apiの選択は正しいですか?性能とロッキング基準の面で。

割り込みが別のプロセッサでスケジュールされるとどうなりますか?現在のプロセッサロックはすでにプロセスコンテキストコードによって保持されていますか?

答えて

1

は:

ので、上記のすべての詳細を、私は私のsoftirqsは、両方のコア上で同時に実行できると結論づけました。

はい、これは正しいです。あなたのsoftirqハンドラは "複数のCPUで同時に"実行されるかもしれません。

スピンロックを使用すると、あなたの結論は正しいと思います。それは

    • それは、(例えば、ブロックmutexを獲得)寝てはならないはずです。しかし、これはクリティカルセクション(すなわち、スピンロックで実行されることが開催された)は、次の特性を持っていることを前提としていできるだけ短くしてください

    一般に、ハッシュテーブルを更新するだけであれば、ここでうまくいくはずです。

    IRQハンドラがプロセスコンテキストによって保持されているスピンロックを取得しようとすると、問題ありません。そのロックが保持されたままプロセスコンテキストがスリープ状態にならない限り、短時間でロックを解除して、IRQハンドラが進行を進めるようにする必要があります。

  • 0

    私は解決策が適切だと思います。 Softirqsは、プリエンプションを無効にして実行します。プロセスとデータを共有するには、プロセスはプリエンプションと割り込みの両方を無効にする必要があります。エントリのタイムスタンプのみを減少させるタイマーの場合、それは原子的に行うことができ、すなわち、タイムスタンプ変数はアトミックでなければならない。別のコアでsoftirqsが実行されていて、スピンロックを取得したい場合は、すでに他のコアに保持されている場合は、待機する必要があります。まず

    +0

    「Softirqsはプリエンプションを無効にして割り込みを無効にしています」と間違っています! – RootPhoenix

    +0

    ステートメントを変更しました – Surajit

    関連する問題