PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wait_event_interruptible



7.e.Q
06-12-2004, 13:23
Hi,

folgendes: wenn ich in einem Treiber in dem sogenannten Kernel Thread (Funktion, die über kernel_thread abgespalten und angestoßen wird) die Funktion wait_event_interruptible aufrufe und dann später in der ISR ein wake_up_interruptible auf der selben WaitQueue mache, müsste dann nicht der Kernel Thread aufwachen und weiterlaufen?

Kernel: 2.6.7
Treiber: proprietär

7.e.Q
07-12-2004, 07:40
... oder anders gefragt: wenn ein Prozess aufgrund einer wait_event_interruptible innerhalb des Treibers angehalten wird, sollte es doch eigentlich so sein, daß ein wake_up_interruptible an anderer Stelle (auch in einem anderen Prozess, im Interrupt Kontext oder ähnlichem) die Prozesse in dieser Wait Queue wieder weiter laufen lässt. Richtig?

Wieso funktioniert das bei mir dann nicht?

Ich hab einen Kernel Thread hochgezogen, indem ich die Funktion kernel_thread mit dem entsprechenden Funktionspointer aufgerufen habe. Das funktioniert soweit auch. Jetzt heißt es aber, der Kernel Thread muss sich schlafen legen. Das mache ich auch. Ich lege ihn schlafen mithilfe der Funktion wait_event_interruptible und einer Wait Queue namens dpn_wq_run. Jetzt rufe ich innerhalb der ISR, also nach Eintreffen eines für den Treiber bestimmten Interrupts ein wake_up_interruptible mit der Wait Queue dpn_wq_run auf. Aber nichts tut sich! Der Kernel Thread schläft einfach weiter. Auch die wake_up... Aufrufe auf der Wait Queue innerhalb einer Timer Funktion wecken den Kernel Thread nicht wieder auf.

Was hab ich falsch gemacht? Und vor allem: was hab ich falsch verstanden?

Hoffentlich weiß einer 'ne Antwort darauf. Hier treiben sich doch sicher auch ein paar Kernel Entwickler rum, oder?!