De onde as variáveis dql (dynamic queue limit) no kernel obtêm seu valor?

1

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. )

    
por Xter 28.03.2018 / 14:49

1 resposta

-1

Variáveis dql podem ser configuradas a partir de drivers nework, fazendo uso da API da biblioteca dql .

EDITAR: Existe esse api netdev_tx_completed_queue que atualizará os valores dql. Eu estava usando um driver igb personalizado e nunca estava chamando esta API. É por isso que recebi mensagens de tempo limite de transmissão.

    
por 30.03.2018 / 07:23