[pso] tema1 linux
Octavian Purdila
pso@cursuri.cs.pub.ro
Sat, 19 Mar 2005 01:31:44 +0200
On Friday 18 March 2005 10:13 pm, George Adrian Drumea wrote:
> Teoretic: as wrapa deci fiecare syscall interceptat intr-un
> try_module_get {...} try_module_put. Exista race-ul urmator?
Mai corect ar fi sa faci un try_module_get la pornirea interceptarii unui apel
de sistem, si module_put la oprirea interceptarii. Oricum nici solutia asta
nu e corecta pentru ca oricum apelul de sistem 0 trebuie sa fie interceptat
by defaut, si se ajunge in situatia descrisa de tine.
> - un proces apeleaza sycall 0 sau un syscall interceptat
> - din entry.S se apeleaza funtia interceptata in modul, dar functia
> din modul nu apuca sa apeleze try_module_get (e intrerupta)
> - tocmai atunci userul executa rmmod, ref countul e ok, deci modulul este
> scos
> - primul proces se trezeste executand o functie care nu mai exista in
> memorie (aici nu stiu exact, fault la primul fetch de instructiune?)
>
> E posibil ce am scris mai sus?
>
Da, este posibil. Problema observata de tine este una generala: un modul nu
poate gestiona reference cont-ul din interior fara sa apara race-uri. De
altfel asta e si motivul pentru care s-au scos in 2.6 MOD_INC_USE_COUNT si
MOD_DEC_USE_COUNT (in 2.4 erau obsolete, in 2.2 functionale).
tavi