内核中的 dql(动态队列限制)变量从哪里获取它们的值?

内核中的 dql(动态队列限制)变量从哪里获取它们的值?

语境 :

我正在使用 Arm SoC 中的自定义驱动程序,同时尝试ifconfig enp1s0 up.我收到如下报告

WARNING: CPU: 0 PID: 0 at /home/abc/Yocto_Setup/fsl-release-bsp/build-x11-imx6dlsabresd/tmp/work-shared/imx6dlsabresd/kernel-source/net/schc
NETDEV WATCHDOG: enp1s0 (igb): transmit queue 0 timed out

(仅收录开头部分。)

从 dmesg 我得知 LINK 在这期间断开了。我开始调试,发现传输队列超时,因此 LINK 正在重置。继续沿着这条路我到达了这一点,问题是由linux中的dql(动态队列限制)中的变量dql->adj_limit引起的。

static inline int dql_avail(const struct dql *dql)
{
        return ACCESS_ONCE(dql->adj_limit) - ACCESS_ONCE(dql->num_queued);
}

这里 dql->adj_limit 始终为 0,而 dql->num_queued 显示 70。我看到 dql 库中的一个函数在void dql_completed(struct dql *dql, unsigned int count) 执行

dql->adj_limit = limit + completed;

但这个函数没有被调用。除此之外,它dql->adj_limit被设置为零并且在任何部分都不会更新。(根据我的发现)。

问题 :

dql 变量从哪里获取它们的值?

(注意:我没有解决实际问题,因为我认为它太广泛了。)

答案1

dql 变量可以通过使用网络驱动程序来设置dql 库 api

编辑:有这个 apinetdev_tx_completed_queue将更新 dql 值。我使用的是自定义 igb 驱动程序,但它从未调用此 api。这就是为什么我收到传输超时消息的原因。

相关内容