É possível que o manipulador de interrupção de um driver seja chamado antes da conclusão da investigação?

É possível que o manipulador de interrupção de um driver seja chamado antes da conclusão da investigação?

Estou examinando os módulos do kernel do driver no kernel Linux e geralmente request_irq() é chamado a partir da função de teste. drivers/net/ethernet/natsemi/ns83820.ko pode ser um exemplo.

request_irq() chama request_threaded_irq() e isso é mencionado nos comentários:

This call allocates interrupt resources and enables the
interrupt line and IRQ handling. From the point this
call is made your handler function may be invoked.

link:https://elixir.bootlin.com/linux/latest/source/kernel/irq/manage.c#L1984

Isso significa que o manipulador pode ser invocado mesmo antes da conclusão da investigação.

Mas tenho notado em muitos drivers que nenhum cuidado é tomado com variáveis ​​compartilhadas ou campos de dev que podem ser lidos e modificados simultaneamente no probe e no manipulador de interrupção.

Quero saber com que frequência ocorre esse caso em que o probe e o manipulador de interrupção são executados em paralelo.

Responder1

O manipulador de interrupção pode ser chamado enquanto a investigação ainda não foi concluída. Porém, para que isso aconteça, o dispositivo precisa ser inicializado e gerar uma interrupção. Muitas vezes, a função probe primeiro inicializa o dispositivo e garante que ele não gerará interrupções antes de solicitar o irq. Isso garante que o manipulador não será chamado até que o driver esteja pronto para lidar com as interrupções.

Uma exceção comum são os drivers RTC e alguns deles foram corrigidos recentemente. Isso acontece porque o RTC ainda está rodando enquanto o Linux não está e o driver não deve reinicializar o dispositivo toda vez que ele inicializar. Aqui está um exemplo:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=10d0c768cc6d581523d673b9d1b54213f8a5eb24

informação relacionada