例としてLinuxカーネルの1つの修正を使用して、nullポインターの逆参照を回避する

その考え方は次のとおりです。 NULLポインターの逆参照がないように、NULLポインターがないことが必要です。 あなたのKO。 Linuxカーネルの小さな問題を修正したら、それは現在のカーネルブランチではなく、安定したものでした。 現時点では、この問題も修正されましたが、方法は異なります。



問題は単純で非常に一般的でした。 1つのスレッドがバッファーを解放し、2番目のスレッドが引き続き使用します。 競合状態。 この状況を回避する方法は? 2番目のスレッドがバッファーを使用している間、1つのスレッドを強制的に待機させることができます。解決策は単純ですが、効果的ではなく、面倒な場合もあります。



最初のオプション



私の決定は異なっていましたが、実際には、バッファがすぐに自由に消去されるまで待つのはなぜですか? 512バイトの小さな天気のバッファーは、それを行いません。 現在使用されていない他のバッファをすべて削除し、最後のバッファを残します。 これにより、2つのカーネルスレッドを同期するプロセスが大幅に容易になります。考えてみる必要はありません。 そして、バッファに残っているデータは、いずれにしても、 割り込みによってそこに到着し、最後のバッファを解放した場合でも、同時に割り込みによって、新しいバッファを割り当ててそこに新しいデータを書き込むことができます。 したがって、額のソリューションよりも効果的でシンプルなソリューションを取得します。 最初の修正を削除し、独自の修正を追加する必要がありました。これにより、修正が本来よりもはるかに多くなりました。



2番目のオプション

元のバージョン。
--- diff --git a/drivers/tty/tty_buffer.cb/drivers/tty/tty_buffer.c index 6c9b7cd..4f02f9c 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c @@ -114,11 +114,14 @@ static void __tty_buffer_flush(struct tty_struct *tty) { struct tty_buffer *thead; - while ((thead = tty->buf.head) != NULL) { - tty->buf.head = thead->next; - tty_buffer_free(tty, thead); + if (tty->buf.head == NULL) + return; + while ((thead = tty->buf.head->next) != NULL) { + tty_buffer_free(tty, tty->buf.head); + tty->buf.head = thead; } - tty->buf.tail = NULL; + WARN_ON(tty->buf.head != tty->buf.tail); + tty->buf.head->read = tty->buf.head->commit; } /**
      
      





「if」を削除するには、最初のデータが表示されたときではなく、デバイスファイルを開くときに最初のバッファを割り当てるとよいでしょうが、これにより「パッチ」が複雑になります。



Linuxカーネル開発に関する私の意見
最初の方法で穴にパッチを当てるのは良いですか、それとも悪いですか? カーネルに変更を加えるプロセスはある種の人種のように見え、変更と結果をどうにかすることができたので、私たちはそれを理解します。 カーネルにはそのような修正が多すぎるように思われ、それほど単純ではないコードをさらに混乱させます。




All Articles