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: