语境 :
我正在使用 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。这就是为什么我收到传输超时消息的原因。