[so2] [lab7][quiz] nelamurire

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Thu Apr 4 09:31:35 EEST 2013


Andrei Epure <epure.andrei at gmail.com> writes:
> Salut.
>
> În primul rând, la întrebarea "Care din urmatoarele formule este greșită?",
> eu am zis:"time_in_jiffies = time_in_seconds * 100" (fiindcă valoarea HZ
> depinde de cum e compilat nucleul, nu?), el a zis "
> time_in_seconds_since_last_boot = jiffies / HZ". Bănuiesc că răspunsul lui
> e greșit.

Da, ai dreptate. E greșit acolo. Am corectat.

> În al doilea rând, la întrebarea "Pentru a proteja accesul la date
> partajate între rutina de tratare a unui timer și operația read a unui
> device driver se folosește:"
> Eu am zis:
> "spin_lock/spin_unlock în rutina de tratare a timer-ului și spin_lock_bh/
> spin_unlock_bh în read"
> El a zis:
> "spin_lock/spin_unlock în rutina de tratare a timer-ului și local_bh_disable,
> spin_lock/spin_unlock, local_bh_enable în read"
>
> De ce am greșit? spin_lock_bh, în plus, am văzut că dezactivează și
> preempția [1]. Am greșit fiindcă e de ajuns doar să dezactivez pe
> procesorul local softirq-urile? Păi nu trebuie dezactivată și preempția
> tocmai fiindcă local_bh_disable are efect doar local?
>
> [1] http://lxr.linux.no/#linux+v2.6.31/kernel/spinlock.c#L108

E OK cum zici tu. În read faci spin_lock_bh ca să dezactivezi bottom
half-urile pe procsorul local și să obții spinlock-ul. În timer faci
spin_lock pentru cazul în care timer-ul rulează pe alt procesor simultan
cu rularea codului în rutina de read. În acest caz timer-ul face busy
waiting pe spinlock până când read eliberează spinlock-ul.

Pe un sistem uniprocesor, nu ar fi nevoie decât de
local_bh_{enable/disable} în read și nimic în timer, dar este un caz
particular.

Vă recmand un articol excelent scris de Rusty Russell legat de locking
în kernel: Unreliable Guide to Locking[2].

[2] https://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/

Răzvan


More information about the so2 mailing list