2013-07-11 9 views
5

Ich entwickle ein Kernelmodul, das Datenstrukturen zwischen einem Softirq (Netfilter-Pre-Routing-Hook) und einem Benutzerkontext (innerhalb eines ioctl-Aufrufs) teilt.Daten zwischen Softirq und Prozesskontext teilen

Nach diesen link lesen, ich weiß, ich brauche die Software-Interrupts im Benutzerkontext zu deaktivieren, wenn die Daten zu modifizieren und wieder zu aktivieren, sobald die Operationen auf den Austausch von Daten abgeschlossen (entweder spin_lock_bh oder spin_lock_irqsave verwenden) sind.

Allerdings bin ich unsicher, ob ich die Sperre in der Softirq-Handler-Funktion greifen muss. Muss ich auch hier das Schloss greifen (mit spin_lock)?

Es ist mein Verständnis, dass ich nur eine Drehsperre in einem Softirq-Handler verwenden muss, wenn ich Daten mit einem anderen Softirq oder Hardirq teile. Ist mein Verständnis richtig?

Antwort

4

Sie müssen eine Sperre erhalten, wenn Sie Daten mit einem Code teilen, der zur gleichen Zeit ausgeführt werden kann. Kernel kann sowohl Ihren Softirq als auch Ihren ioctl-Handler ausführen, also müssen Sie eine Sperre erhalten.

Wenn Sie Interrupts mit spin_lock_bh oder spin_lock_irqsave deaktivieren, sind Interrupts nur für den aktuellen Prozessor deaktiviert. Also, es ist in Ordnung, Interrupts auf einem anderen zu behandeln.

Verwandte Themen