Обычно rte_eth_tx_burst()
не только помещает пакеты в очередь TX, но также уведомляет NI C о начале передачи. Конечно, это зависит от PMD и устройства, но устройство довольно редко ожидает еще несколько пакетов.
Например, для e1000
PMD (который поддерживает целое семейство сетевых карт), rte_eth_tx_burst()
заканчивается в eth_igb_xmit_pkts()
. В самом низу этой функции есть сигнал для NI C:
/*
* Set the Transmit Descriptor Tail (TDT).
*/
E1000_PCI_REG_WRITE_RELAXED(txq->tdt_reg_addr, tx_id);
По сути, это запись в регистр устройства, обновление хвоста очереди и перевод NI C в ( проснуться и) начать передачу. Благодаря DMA NI C имеет прямой доступ в ОЗУ к очереди TX и буферам для передачи, поэтому передача (в конечном итоге) будет выполняться NI C без блокировки ЦП.