[so2] tratare intrerupere in paralel cu tratarea altei intreruperi venita pe aceeasi linie

Vlad Dogaru ddvlad at herebedragons.ro
Fri Jul 25 16:43:59 EEST 2014


On Thu, Jul 24, 2014 at 06:05:02PM +0300, Catalin Vasile wrote:
> 1. Pot rula 2 intreruperi in paralel venite pe aceeasi linie?
> De exemplu se semnalizeaza o intrerupere pe linia 4 si incepe tratarea ei.
> Pe la jumatatatea ei se semnalizeaza inca o intrerupere pe aceeasi linie.
> Aceasta va fi rulata in paralel daca exista un core liber sau va astepta
> terminarea primei?

Din cunoștințele mele, pe x86, rutina de tratare a întreruperii se
rulează cu linia respectivă dezactivată global și cu toate întreruperile
dezactivate pe procesorul local.  Deci, în timp ce tratezi o întrerupere
pe linia 4 pe procesorul 2, nu poate veni pe niciun alt procesor
întreruperea 4 și nu poate veni o altă întrerupere pe procesorul 2.

Am zis "din cunoștințele mele" pentru că s-ar putea să mă înșel :)  În
plus, bănuiesc că e un detaliu highly architecture dependant.

LDD seems to agree, într-o discuție ceva mai elaborată:

	"The first thing do_IRQ does is to acknowledge the interrupt so
	that the interrupt controller can go on to other things. It
	then obtains a spinlock for the given IRQ number, thus preventing
	any other CPU from handling this IRQ."

Poți consulta capitolul despre întreruperi din LDD [1] pentru mai multe
detalii.  Secvența de mai sus e în secțiunea "The internals of interrupt
handling on the x86", care s-ar putea să fie utilă ca punct de plecare
pentru code spelunking.

[1] http://lwn.net/images/pdf/LDD3/ch10.pdf

> 2. Daca sunt mai multe device-uri pe aceeasi linie (=> mai multe handlere
> pe aceeasi linie), se va astepta tratarea unui singur device, sau pot mai
> multe sa fie tratate in paralel?

Nu cred că există excepție la citatul de mai sus, cu un spinlock pentru
fiecare IRQ number.  Dacă sunt înregistrate mai multe handlere, ele sunt
apelate în ordine, până când unul întoarce IRQ_HANDLED.  În general,
când e apelat, handler-ul citește registrele device-ului aferent;  dacă
nu acel device a generat întreruperea, întoarce IRQ_NONE și kernel-ul va
apela următoarele handlere.

Vlad


More information about the so2 mailing list