【问题标题】:How to use XPS (Transmit Packet Steering) from Kernel module如何从内核模块使用 XPS(传输数据包控制)
【发布时间】:2019-02-21 05:01:31
【问题描述】:

我的场景需要:

  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。

【问题讨论】:

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


    【解决方案1】:

    以防万一,如果有人正在寻找快速的脏修复,以下两行的修改对我有用。

    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

    问候,

    酷酷的。

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 2015-01-13
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 2010-12-24
      相关资源
      最近更新 更多