gpt4 book ai didi

linux - 如何从内核模块使用 XPS(传输数据包控制)

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:11 33 4
gpt4 key购买 nike

我的场景需要:

  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。

最佳答案

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

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

问候,

库沙尔。

关于linux - 如何从内核模块使用 XPS(传输数据包控制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52364879/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com