独自のネットワーク デバイス ドライバーを作成しました。tx 関数 (で登録された関数) でデータを送信する前に、ハードウェアの準備が整うまで待機する必要がある状況があります.ndo_start_xmit
。アトミック コンテキストではスリープ/待機できないため、tx 関数内からワーク キューをスケジュールすることで回避策を実装しました。ワーク キューは、ハードウェアの準備が整うまで待機し、データを送信できます。
これを行うより良い方法はありますか?つまり、.ndo_start_xmit()
すぐに戻りますが、同時に、準備ができたらいつでもフレームがハードウェアに送信されるようにスケジュールします。
実装に関する追加情報:ワーク キューをスケジュールする直前netif_stop_queue()
から呼び出します。.ndo_start_xmit()
ワーク キュー ハンドラが実行されるとnetif_start_queue()
、ハードウェアからフレームを送信した直後に内部で呼び出します。これは問題なく動作しますが、時々次のエラーが発生します。
NOHZ: local_softirq_pending 08
もちろん、このプロセスにはレイテンシーがありますが、現在のアプリケーションでは問題なく動作します。当社のネットワーク チップは、SPI 経由でプロセッサに接続されており、SPI 経由でイーサネット フレームをそのまま受信できます。これらのイーサネット フレームは、チップによって物理メディアを介してさらに送信されます。
imx233 でカーネル バージョン 2.6.31 を使用しています。