Мой сценарий требует:
- Пользовательский загружаемый модуль ядра, который создает пакеты (skbuffs) и пытается отправить их синхронно
- Драйвер Intel I40e (извлечено из дерева исходного кода ядра версии 4.15.12)
Пользовательский загружаемый модуль ядра
Мой пакет не является сложным пакетом. Я могу инициализировать пакет во время фазы инициализации модуля и использовать один и тот же пакет снова и снова. Это то, что я сделал на данный момент, поскольку дрожание связи важнее, чем содержимое самого пакета.
...
// I was doing
// txq = skb_get_tx_queue(skb->dev, skb);
// but it seemed that I will not be allowed to choose my desired queue in this case.
// thus, I tried to hardcode it for the time being.
txq = &dev->_tx[7];
local_bh_disable();
HARD_TX_LOCK(skb->dev, txq, 7);
if (unlikely(netif_xmit_frozen_or_drv_stopped(txq))) {
ret = NETDEV_TX_BUSY;
goto unlock;
}
// prior to this approach, I was using ndo_start_xmit directly as
// skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev);
// but, with this I was not able to use XPS, thus I was trying [netdev_start_xmit()][1] [which ultimately invokes ndo_start_xmit]
ret = netdev_start_xmit(skb, skb->dev, txq, 0);
unlock:
HARD_TX_UNLOCK(skb->dev, txq);
local_bh_enable();
...
Я взял ссылку на код пакетной передачи от https://elixir.bootlin.com/linux/v4.15.12/source/net/core/pktgen.c#L3487
Я не уверен, правильно ли я это делаю. Результаты не говорят так. Я ожидал, что мои пакеты будут проходить через Tx Queue 7, но они все еще будут проходить через TX-Queue по умолчанию 0.