このif条件の動機は何void serial8250_tx_chars(struct uart_8250_port *up)
ですか?
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
uart_write_wakeup(port);
Linux 1.1.13(1994年5月)から存在し、ほとんどのUARTドライバーで繰り返されています。
背景:カスタマイズされたLinux 3.4.91、ARMv7の組み込みシステム、UARTポート0は、38400ボー、I / O用の16バイトFIFOに設定されています。これは、セットアップでは変更できません。
UARTを介してコンソールで非常に重いprintfを実行すると、内部の4kBバッファー(UART_XMIT_SIZE
)がいっぱいになり、バッファーが空になるまで(38400ボーで1秒かかります)、ユーザー空間プロセスが停止します。その後、この動作が繰り返されます。これはn_tty_write()
、バッファがいっぱいになると関数がスリープ状態になり、上記の疑わしい状態のために長時間ウェイクアップされないためです。
このチェックを削除するだけで、より自然で効率的になります。次に、printfsはできるだけ早くバッファーをいっぱいにして、私が観察しているバースト処理ではなく、バッファーが空になる速度で続行します。
私の環境では問題なく動作しますが、確かに何かが足りない、または誤解しています。現在の実装には理由があるはずです。その状態を取り除くと副作用はありますか?
余談ですが、この動作を調整するための構成オプションはありますか。たとえば、printfが常にすぐに戻り、バッファーがいっぱいの場合は出力を破棄するように設定しますか?