Как использовать XPS (Transmit Packet Steering) из модуля ядра - PullRequest
0 голосов
/ 17 сентября 2018

Мой сценарий требует:

  1. Пользовательский загружаемый модуль ядра, который создает пакеты (skbuffs) и пытается отправить их синхронно
  2. Драйвер 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.

1 Ответ

0 голосов
/ 19 сентября 2018

На всякий случай, если кто-то ищет быстрое грязное исправление, модификации следующих двух строк работали для меня.

txq =  &dev->_tx[7]; 
local_bh_disable();

изменилось на

skb_set_queue_mapping(skb, 7);
txq = skb_get_tx_queue(dev, skb);

С этим,Я могу управлять своими пакетами через Tx Queue 7, но я все еще испытываю дрожание, которое, возможно, происходит из какого-то другого источника.

https://elixir.bootlin.com/linux/v4.19-rc3/ident/netdev_pick_tx

https://elixir.bootlin.com/linux/v4.19-rc3/ident/skb_set_queue_mapping

https://elixir.bootlin.com/linux/v4.15.12/source/net/core/pktgen.c#L3487

С уважением,

Кушал.

...