如何从内核模块使用XPS(传输数据包导向)

时间:2018-09-17 09:44:46

标签: linux networking linux-kernel linux-device-driver kernel-module

我的情况要求:

  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 :(得分:0)

以防万一,如果有人正在寻找快速解决问题的方法,那么对以下两行进行修改对我有用。

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

此致

Coshal。