Contexto:
Eu estava trabalhando com um driver personalizado em um braço SoC, enquanto tentava ifconfig enp1s0 up
. Eu estava recebendo um relatório como abaixo
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
(apenas o começo está incluído).
Do dmesg, fiquei sabendo que o LINK está entrando no meio. Comecei a depurar e descobri que a fila de transmissão está com o tempo limite esgotado, de forma que o LINK está sendo redefinido. Continuando ao longo da estrada cheguei a este ponto onde o problema é causado por uma variável em dql (limite de fila dinâmica) em linux, dql- > adj_limit.
static inline int dql_avail(const struct dql *dql)
{
return ACCESS_ONCE(dql->adj_limit) - ACCESS_ONCE(dql->num_queued);
}
Aqui dql- > adj_limit é sempre 0, enquanto dql- > num_queued está mostrando 70. Eu vi uma função na biblioteca dql void dql_completed(struct dql *dql, unsigned int count)
fazendo
dql->adj_limit = limit + completed;
mas esta função não foi chamada. Além disso, dql->adj_limit
é definido como zero e não está sendo atualizado em nenhuma parte. (A partir de minhas descobertas).
Pergunta:
De onde as variáveis dql obtêm seu valor?
(nota:
Eu não estou abordando o problema real porque acho que é muito amplo. )