カーネルの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 (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_limit0に設定され、どのセクションでも更新されません。 (私の研究結果に基づいて)。

質問:

dql変数はどこから値を取得しますか?

(注:実際の問題は広すぎると考えて解決しません。)

答え1

dql変数はネットワークドライバを使用して設定できます。dqlライブラリAPI

netdev_tx_completed_queue編集:dql値を更新するAPIがあります。私はカスタムigbドライバを使用していますが、このAPIを呼び出しません。したがって、送信タイムアウトメッセージが表示されます。

関連情報