Ist es möglich, dass der Interrupt-Handler eines Treibers aufgerufen wird, bevor die Prüfung abgeschlossen ist?

Ist es möglich, dass der Interrupt-Handler eines Treibers aufgerufen wird, bevor die Prüfung abgeschlossen ist?

Ich gehe die Treiber-Kernelmodule im Linux-Kernel durch und normalerweise wird request_irq() von der Testfunktion aufgerufen. drivers/net/ethernet/natsemi/ns83820.ko kann ein solches Beispiel sein.

request_irq() ruft request_threaded_irq() auf und dies wird in den Kommentaren erwähnt:

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.

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

Das bedeutet, dass der Handler aufgerufen werden kann, noch bevor die Prüfung abgeschlossen ist.

Mir ist jedoch aufgefallen, dass bei vielen Treibern nicht auf gemeinsam genutzte Variablen oder Dev-Felder geachtet wird, die im Probe- und Interrupt-Handler gleichzeitig gelesen und geändert werden können.

Ich möchte wissen, wie oft der Fall auftritt, dass Probe und Interrupt-Handler parallel ausgeführt werden.

Antwort1

Der Interrupt-Handler kann aufgerufen werden, während Probe noch nicht fertig ist. Dazu muss das Gerät jedoch initialisiert werden und einen Interrupt generieren. Häufig initialisiert die Probe-Funktion zuerst das Gerät und stellt sicher, dass es keine Interrupts generiert, bevor es den IRQ anfordert. Dadurch wird sichergestellt, dass der Handler erst aufgerufen wird, wenn der Treiber bereit ist, die Interrupts zu verarbeiten.

Eine häufige Ausnahme sind die RTC-Treiber, und ich habe einige davon kürzlich repariert. Dies liegt daran, dass die RTC noch läuft, Linux jedoch nicht, und der Treiber das Gerät nicht bei jedem Booten neu initialisieren darf. Hier ist ein Beispiel:

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

verwandte Informationen