Qual è la motivazione di questa if-condition void serial8250_tx_chars(struct uart_8250_port *up)
?
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
uart_write_wakeup(port);
È stato lì sin da Linux 1.1.13 (maggio 1994) e si ripete nella maggior parte dei driver UART.
Sfondo: Linux 3.4.91 personalizzato, sistema incorporato su ARMv7, porta UART 0 configurata per 38400 baud, FIFO 16 byte per I / O. Niente di tutto ciò può essere modificato nella nostra configurazione.
Quando si stampa molto pesantemente sulla console tramite UART, il buffer interno da 4kB ( UART_XMIT_SIZE
) si riempie e quindi blocca il processo di spazio utente fino allo svuotamento del buffer (che richiede un secondo a 38400 baud!). Quindi questo comportamento si ripete. Questo perché la funzione n_tty_write()
va in sospensione quando il buffer è pieno e non viene svegliata a lungo a causa della condizione discutibile sopra.
Lo troverei più naturale ed efficiente se questo controllo fosse semplicemente rimosso. Quindi i printfs riempirebbero il buffer il più rapidamente possibile, e quindi continuerebbero alla velocità con cui il buffer viene svuotato , piuttosto che l'elaborazione a raffica che sto osservando.
Funziona bene nel mio ambiente ma sicuramente mi manca o fraintendo qualcosa. Ci deve essere un motivo per l'attuale implementazione. Ci sono effetti collaterali se rimuovo quella condizione?
Come domanda secondaria: ci sono opzioni di configurazione per ottimizzare questo comportamento, ad esempio per fare in modo che printf ritorni sempre immediatamente e scarti l'output se il buffer è pieno?