コンテキスト:
試している間、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 (Dynamic Queue Limit) の 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
0に設定され、どのセクションでも更新されません。 (私の研究結果に基づいて)。
質問:
dql変数はどこから値を取得しますか?
(注:実際の問題は広すぎると考えて解決しません。)
答え1
dql変数はネットワークドライバを使用して設定できます。dqlライブラリAPI。
netdev_tx_completed_queue
編集:dql値を更新するAPIがあります。私はカスタムigbドライバを使用していますが、このAPIを呼び出しません。したがって、送信タイムアウトメッセージが表示されます。