커널의 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를 호출하지 않습니다. 그래서 전송 시간 초과 메시지가 표시됩니다.

관련 정보