locking.rst 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493
  1. .. include:: ../disclaimer-ita.rst
  2. :Original: :ref:`Documentation/kernel-hacking/locking.rst <kernel_hacking_lock>`
  3. :Translator: Federico Vaga <federico.vaga@vaga.pv.it>
  4. .. _it_kernel_hacking_lock:
  5. ==========================================
  6. L'inaffidabile guida alla sincronizzazione
  7. ==========================================
  8. :Author: Rusty Russell
  9. Introduzione
  10. ============
  11. Benvenuto, alla notevole ed inaffidabile guida ai problemi di sincronizzazione
  12. (locking) nel kernel. Questo documento descrive il sistema di sincronizzazione
  13. nel kernel Linux 2.6.
  14. Dato il largo utilizzo del multi-threading e della prelazione nel kernel
  15. Linux, chiunque voglia dilettarsi col kernel deve conoscere i concetti
  16. fondamentali della concorrenza e della sincronizzazione nei sistemi
  17. multi-processore.
  18. Il problema con la concorrenza
  19. ==============================
  20. (Saltatelo se sapete già cos'è una corsa critica).
  21. In un normale programma, potete incrementare un contatore nel seguente modo:
  22. ::
  23. contatore++;
  24. Questo è quello che vi aspettereste che accada sempre:
  25. .. table:: Risultati attesi
  26. +------------------------------------+------------------------------------+
  27. | Istanza 1 | Istanza 2 |
  28. +====================================+====================================+
  29. | leggi contatore (5) | |
  30. +------------------------------------+------------------------------------+
  31. | aggiungi 1 (6) | |
  32. +------------------------------------+------------------------------------+
  33. | scrivi contatore (6) | |
  34. +------------------------------------+------------------------------------+
  35. | | leggi contatore (6) |
  36. +------------------------------------+------------------------------------+
  37. | | aggiungi 1 (7) |
  38. +------------------------------------+------------------------------------+
  39. | | scrivi contatore (7) |
  40. +------------------------------------+------------------------------------+
  41. Questo è quello che potrebbe succedere in realtà:
  42. .. table:: Possibile risultato
  43. +------------------------------------+------------------------------------+
  44. | Istanza 1 | Istanza 2 |
  45. +====================================+====================================+
  46. | leggi contatore (5) | |
  47. +------------------------------------+------------------------------------+
  48. | | leggi contatore (5) |
  49. +------------------------------------+------------------------------------+
  50. | aggiungi 1 (6) | |
  51. +------------------------------------+------------------------------------+
  52. | | aggiungi 1 (6) |
  53. +------------------------------------+------------------------------------+
  54. | scrivi contatore (6) | |
  55. +------------------------------------+------------------------------------+
  56. | | scrivi contatore (6) |
  57. +------------------------------------+------------------------------------+
  58. Corse critiche e sezioni critiche
  59. ---------------------------------
  60. Questa sovrapposizione, ovvero quando un risultato dipende dal tempo che
  61. intercorre fra processi diversi, è chiamata corsa critica. La porzione
  62. di codice che contiene questo problema è chiamata sezione critica.
  63. In particolar modo da quando Linux ha incominciato a girare su
  64. macchine multi-processore, le sezioni critiche sono diventate uno dei
  65. maggiori problemi di progettazione ed implementazione del kernel.
  66. La prelazione può sortire gli stessi effetti, anche se c'è una sola CPU:
  67. interrompendo un processo nella sua sezione critica otterremo comunque
  68. la stessa corsa critica. In questo caso, il thread che si avvicenda
  69. nell'esecuzione potrebbe eseguire anch'esso la sezione critica.
  70. La soluzione è quella di riconoscere quando avvengono questi accessi
  71. simultanei, ed utilizzare i *lock* per accertarsi che solo un'istanza
  72. per volta possa entrare nella sezione critica. Il kernel offre delle buone
  73. funzioni a questo scopo. E poi ci sono quelle meno buone, ma farò finta
  74. che non esistano.
  75. Sincronizzazione nel kernel Linux
  76. =================================
  77. Se posso darvi un suggerimento: non dormite mai con qualcuno più pazzo di
  78. voi. Ma se dovessi darvi un suggerimento sulla sincronizzazione:
  79. **mantenetela semplice**.
  80. Siate riluttanti nell'introduzione di nuovi *lock*.
  81. Abbastanza strano, quest'ultimo è l'esatto opposto del mio suggerimento
  82. su quando **avete** dormito con qualcuno più pazzo di voi. E dovreste
  83. pensare a prendervi un cane bello grande.
  84. I due principali tipi di *lock* nel kernel: spinlock e mutex
  85. ------------------------------------------------------------
  86. Ci sono due tipi principali di *lock* nel kernel. Il tipo fondamentale è lo
  87. spinlock (``include/asm/spinlock.h``), un semplice *lock* che può essere
  88. trattenuto solo da un processo: se non si può trattenere lo spinlock, allora
  89. rimane in attesa attiva (in inglese *spinning*) finché non ci riesce.
  90. Gli spinlock sono molto piccoli e rapidi, possono essere utilizzati ovunque.
  91. Il secondo tipo è il mutex (``include/linux/mutex.h``): è come uno spinlock,
  92. ma potreste bloccarvi trattenendolo. Se non potete trattenere un mutex
  93. il vostro processo si auto-sospenderà; verrà riattivato quando il mutex
  94. verrà rilasciato. Questo significa che il processore potrà occuparsi d'altro
  95. mentre il vostro processo è in attesa. Esistono molti casi in cui non potete
  96. permettervi di sospendere un processo (vedere
  97. :ref:`Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni? <it_sleeping-things>`)
  98. e quindi dovrete utilizzare gli spinlock.
  99. Nessuno di questi *lock* è ricorsivo: vedere
  100. :ref:`Stallo: semplice ed avanzato <it_deadlock>`
  101. I *lock* e i kernel per sistemi monoprocessore
  102. ----------------------------------------------
  103. Per i kernel compilati senza ``CONFIG_SMP`` e senza ``CONFIG_PREEMPT``
  104. gli spinlock non esistono. Questa è un'ottima scelta di progettazione:
  105. quando nessun altro processo può essere eseguito in simultanea, allora
  106. non c'è la necessità di avere un *lock*.
  107. Se il kernel è compilato senza ``CONFIG_SMP`` ma con ``CONFIG_PREEMPT``,
  108. allora gli spinlock disabilitano la prelazione; questo è sufficiente a
  109. prevenire le corse critiche. Nella maggior parte dei casi, possiamo considerare
  110. la prelazione equivalente ad un sistema multi-processore senza preoccuparci
  111. di trattarla indipendentemente.
  112. Dovreste verificare sempre la sincronizzazione con le opzioni ``CONFIG_SMP`` e
  113. ``CONFIG_PREEMPT`` abilitate, anche quando non avete un sistema
  114. multi-processore, questo vi permetterà di identificare alcuni problemi
  115. di sincronizzazione.
  116. Come vedremo di seguito, i mutex continuano ad esistere perché sono necessari
  117. per la sincronizzazione fra processi in contesto utente.
  118. Sincronizzazione in contesto utente
  119. -----------------------------------
  120. Se avete una struttura dati che verrà utilizzata solo dal contesto utente,
  121. allora, per proteggerla, potete utilizzare un semplice mutex
  122. (``include/linux/mutex.h``). Questo è il caso più semplice: inizializzate il
  123. mutex; invocate :c:func:`mutex_lock_interruptible()` per trattenerlo e
  124. :c:func:`mutex_unlock()` per rilasciarlo. C'è anche :c:func:`mutex_lock()`
  125. ma questa dovrebbe essere evitata perché non ritorna in caso di segnali.
  126. Per esempio: ``net/netfilter/nf_sockopt.c`` permette la registrazione
  127. di nuove chiamate per :c:func:`setsockopt()` e :c:func:`getsockopt()`
  128. usando la funzione :c:func:`nf_register_sockopt()`. La registrazione e
  129. la rimozione vengono eseguite solamente quando il modulo viene caricato
  130. o scaricato (e durante l'avvio del sistema, qui non abbiamo concorrenza),
  131. e la lista delle funzioni registrate viene consultata solamente quando
  132. :c:func:`setsockopt()` o :c:func:`getsockopt()` sono sconosciute al sistema.
  133. In questo caso ``nf_sockopt_mutex`` è perfetto allo scopo, in particolar modo
  134. visto che setsockopt e getsockopt potrebbero dormire.
  135. Sincronizzazione fra il contesto utente e i softirq
  136. ---------------------------------------------------
  137. Se un softirq condivide dati col contesto utente, avete due problemi.
  138. Primo, il contesto utente corrente potrebbe essere interroto da un softirq,
  139. e secondo, la sezione critica potrebbe essere eseguita da un altro
  140. processore. Questo è quando :c:func:`spin_lock_bh()`
  141. (``include/linux/spinlock.h``) viene utilizzato. Questo disabilita i softirq
  142. sul processore e trattiene il *lock*. Invece, :c:func:`spin_unlock_bh()` fa
  143. l'opposto. (Il suffisso '_bh' è un residuo storico che fa riferimento al
  144. "Bottom Halves", il vecchio nome delle interruzioni software. In un mondo
  145. perfetto questa funzione si chiamerebbe 'spin_lock_softirq()').
  146. Da notare che in questo caso potete utilizzare anche :c:func:`spin_lock_irq()`
  147. o :c:func:`spin_lock_irqsave()`, queste fermano anche le interruzioni hardware:
  148. vedere :ref:`Contesto di interruzione hardware <it_hardirq-context>`.
  149. Questo funziona alla perfezione anche sui sistemi monoprocessore: gli spinlock
  150. svaniscono e questa macro diventa semplicemente :c:func:`local_bh_disable()`
  151. (``include/linux/interrupt.h``), la quale impedisce ai softirq d'essere
  152. eseguiti.
  153. Sincronizzazione fra contesto utente e i tasklet
  154. ------------------------------------------------
  155. Questo caso è uguale al precedente, un tasklet viene eseguito da un softirq.
  156. Sincronizzazione fra contesto utente e i timer
  157. ----------------------------------------------
  158. Anche questo caso è uguale al precedente, un timer viene eseguito da un
  159. softirq.
  160. Dal punto di vista della sincronizzazione, tasklet e timer sono identici.
  161. Sincronizzazione fra tasklet e timer
  162. ------------------------------------
  163. Qualche volta un tasklet od un timer potrebbero condividere i dati con
  164. un altro tasklet o timer
  165. Lo stesso tasklet/timer
  166. ~~~~~~~~~~~~~~~~~~~~~~~
  167. Dato che un tasklet non viene mai eseguito contemporaneamente su due
  168. processori, non dovete preoccuparvi che sia rientrante (ovvero eseguito
  169. più volte in contemporanea), perfino su sistemi multi-processore.
  170. Differenti tasklet/timer
  171. ~~~~~~~~~~~~~~~~~~~~~~~~
  172. Se un altro tasklet/timer vuole condividere dati col vostro tasklet o timer,
  173. allora avrete bisogno entrambe di :c:func:`spin_lock()` e
  174. :c:func:`spin_unlock()`. Qui :c:func:`spin_lock_bh()` è inutile, siete già
  175. in un tasklet ed avete la garanzia che nessun altro verrà eseguito sullo
  176. stesso processore.
  177. Sincronizzazione fra softirq
  178. ----------------------------
  179. Spesso un softirq potrebbe condividere dati con se stesso o un tasklet/timer.
  180. Lo stesso softirq
  181. ~~~~~~~~~~~~~~~~~
  182. Lo stesso softirq può essere eseguito su un diverso processore: allo scopo
  183. di migliorare le prestazioni potete utilizzare dati riservati ad ogni
  184. processore (vedere :ref:`Dati per processore <it_per-cpu>`). Se siete arrivati
  185. fino a questo punto nell'uso dei softirq, probabilmente tenete alla scalabilità
  186. delle prestazioni abbastanza da giustificarne la complessità aggiuntiva.
  187. Dovete utilizzare :c:func:`spin_lock()` e :c:func:`spin_unlock()` per
  188. proteggere i dati condivisi.
  189. Diversi Softirqs
  190. ~~~~~~~~~~~~~~~~
  191. Dovete utilizzare :c:func:`spin_lock()` e :c:func:`spin_unlock()` per
  192. proteggere i dati condivisi, che siano timer, tasklet, diversi softirq o
  193. lo stesso o altri softirq: uno qualsiasi di essi potrebbe essere in esecuzione
  194. su un diverso processore.
  195. .. _`it_hardirq-context`:
  196. Contesto di interruzione hardware
  197. =================================
  198. Solitamente le interruzioni hardware comunicano con un tasklet o un softirq.
  199. Spesso questo si traduce nel mettere in coda qualcosa da fare che verrà
  200. preso in carico da un softirq.
  201. Sincronizzazione fra interruzioni hardware e softirq/tasklet
  202. ------------------------------------------------------------
  203. Se un gestore di interruzioni hardware condivide dati con un softirq, allora
  204. avrete due preoccupazioni. Primo, il softirq può essere interrotto da
  205. un'interruzione hardware, e secondo, la sezione critica potrebbe essere
  206. eseguita da un'interruzione hardware su un processore diverso. Questo è il caso
  207. dove :c:func:`spin_lock_irq()` viene utilizzato. Disabilita le interruzioni
  208. sul processore che l'esegue, poi trattiene il lock. :c:func:`spin_unlock_irq()`
  209. fa l'opposto.
  210. Il gestore d'interruzione hardware non usa :c:func:`spin_lock_irq()` perché
  211. i softirq non possono essere eseguiti quando il gestore d'interruzione hardware
  212. è in esecuzione: per questo si può usare :c:func:`spin_lock()`, che è un po'
  213. più veloce. L'unica eccezione è quando un altro gestore d'interruzioni
  214. hardware utilizza lo stesso *lock*: :c:func:`spin_lock_irq()` impedirà a questo
  215. secondo gestore di interrompere quello in esecuzione.
  216. Questo funziona alla perfezione anche sui sistemi monoprocessore: gli spinlock
  217. svaniscono e questa macro diventa semplicemente :c:func:`local_irq_disable()`
  218. (``include/asm/smp.h``), la quale impedisce a softirq/tasklet/BH d'essere
  219. eseguiti.
  220. :c:func:`spin_lock_irqsave()` (``include/linux/spinlock.h``) è una variante che
  221. salva lo stato delle interruzioni in una variabile, questa verrà poi passata
  222. a :c:func:`spin_unlock_irqrestore()`. Questo significa che lo stesso codice
  223. potrà essere utilizzato in un'interruzione hardware (dove le interruzioni sono
  224. già disabilitate) e in un softirq (dove la disabilitazione delle interruzioni
  225. è richiesta).
  226. Da notare che i softirq (e quindi tasklet e timer) sono eseguiti al ritorno
  227. da un'interruzione hardware, quindi :c:func:`spin_lock_irq()` interrompe
  228. anche questi. Tenuto conto di questo si può dire che
  229. :c:func:`spin_lock_irqsave()` è la funzione di sincronizzazione più generica
  230. e potente.
  231. Sincronizzazione fra due gestori d'interruzioni hardware
  232. --------------------------------------------------------
  233. Condividere dati fra due gestori di interruzione hardware è molto raro, ma se
  234. succede, dovreste usare :c:func:`spin_lock_irqsave()`: è una specificità
  235. dell'architettura il fatto che tutte le interruzioni vengano interrotte
  236. quando si eseguono di gestori di interruzioni.
  237. Bigino della sincronizzazione
  238. =============================
  239. Pete Zaitcev ci offre il seguente riassunto:
  240. - Se siete in un contesto utente (una qualsiasi chiamata di sistema)
  241. e volete sincronizzarvi con altri processi, usate i mutex. Potete trattenere
  242. il mutex e dormire (``copy_from_user*(`` o ``kmalloc(x,GFP_KERNEL)``).
  243. - Altrimenti (== i dati possono essere manipolati da un'interruzione) usate
  244. :c:func:`spin_lock_irqsave()` e :c:func:`spin_unlock_irqrestore()`.
  245. - Evitate di trattenere uno spinlock per più di 5 righe di codice incluse
  246. le chiamate a funzione (ad eccezione di quell per l'accesso come
  247. :c:func:`readb()`).
  248. Tabella dei requisiti minimi
  249. ----------------------------
  250. La tabella seguente illustra i requisiti **minimi** per la sincronizzazione fra
  251. diversi contesti. In alcuni casi, lo stesso contesto può essere eseguito solo
  252. da un processore per volta, quindi non ci sono requisiti per la
  253. sincronizzazione (per esempio, un thread può essere eseguito solo su un
  254. processore alla volta, ma se deve condividere dati con un altro thread, allora
  255. la sincronizzazione è necessaria).
  256. Ricordatevi il suggerimento qui sopra: potete sempre usare
  257. :c:func:`spin_lock_irqsave()`, che è un sovrainsieme di tutte le altre funzioni
  258. per spinlock.
  259. ============== ============= ============= ========= ========= ========= ========= ======= ======= ============== ==============
  260. . IRQ Handler A IRQ Handler B Softirq A Softirq B Tasklet A Tasklet B Timer A Timer B User Context A User Context B
  261. ============== ============= ============= ========= ========= ========= ========= ======= ======= ============== ==============
  262. IRQ Handler A None
  263. IRQ Handler B SLIS None
  264. Softirq A SLI SLI SL
  265. Softirq B SLI SLI SL SL
  266. Tasklet A SLI SLI SL SL None
  267. Tasklet B SLI SLI SL SL SL None
  268. Timer A SLI SLI SL SL SL SL None
  269. Timer B SLI SLI SL SL SL SL SL None
  270. User Context A SLI SLI SLBH SLBH SLBH SLBH SLBH SLBH None
  271. User Context B SLI SLI SLBH SLBH SLBH SLBH SLBH SLBH MLI None
  272. ============== ============= ============= ========= ========= ========= ========= ======= ======= ============== ==============
  273. Table: Tabella dei requisiti per la sincronizzazione
  274. +--------+----------------------------+
  275. | SLIS | spin_lock_irqsave |
  276. +--------+----------------------------+
  277. | SLI | spin_lock_irq |
  278. +--------+----------------------------+
  279. | SL | spin_lock |
  280. +--------+----------------------------+
  281. | SLBH | spin_lock_bh |
  282. +--------+----------------------------+
  283. | MLI | mutex_lock_interruptible |
  284. +--------+----------------------------+
  285. Table: Legenda per la tabella dei requisiti per la sincronizzazione
  286. Le funzioni *trylock*
  287. =====================
  288. Ci sono funzioni che provano a trattenere un *lock* solo una volta e
  289. ritornano immediatamente comunicato il successo od il fallimento
  290. dell'operazione. Posso essere usate quando non serve accedere ai dati
  291. protetti dal *lock* quando qualche altro thread lo sta già facendo
  292. trattenendo il *lock*. Potrete acquisire il *lock* più tardi se vi
  293. serve accedere ai dati protetti da questo *lock*.
  294. La funzione :c:func:`spin_trylock()` non ritenta di acquisire il *lock*,
  295. se ci riesce al primo colpo ritorna un valore diverso da zero, altrimenti
  296. se fallisce ritorna 0. Questa funzione può essere utilizzata in un qualunque
  297. contesto, ma come :c:func:`spin_lock()`: dovete disabilitare i contesti che
  298. potrebbero interrompervi e quindi trattenere lo spinlock.
  299. La funzione :c:func:`mutex_trylock()` invece di sospendere il vostro processo
  300. ritorna un valore diverso da zero se è possibile trattenere il lock al primo
  301. colpo, altrimenti se fallisce ritorna 0. Nonostante non dorma, questa funzione
  302. non può essere usata in modo sicuro in contesti di interruzione hardware o
  303. software.
  304. Esempi più comuni
  305. =================
  306. Guardiamo un semplice esempio: una memoria che associa nomi a numeri.
  307. La memoria tiene traccia di quanto spesso viene utilizzato ogni oggetto;
  308. quando è piena, l'oggetto meno usato viene eliminato.
  309. Tutto in contesto utente
  310. ------------------------
  311. Nel primo esempio, supponiamo che tutte le operazioni avvengano in contesto
  312. utente (in soldoni, da una chiamata di sistema), quindi possiamo dormire.
  313. Questo significa che possiamo usare i mutex per proteggere la nostra memoria
  314. e tutti gli oggetti che contiene. Ecco il codice::
  315. #include <linux/list.h>
  316. #include <linux/slab.h>
  317. #include <linux/string.h>
  318. #include <linux/mutex.h>
  319. #include <asm/errno.h>
  320. struct object
  321. {
  322. struct list_head list;
  323. int id;
  324. char name[32];
  325. int popularity;
  326. };
  327. /* Protects the cache, cache_num, and the objects within it */
  328. static DEFINE_MUTEX(cache_lock);
  329. static LIST_HEAD(cache);
  330. static unsigned int cache_num = 0;
  331. #define MAX_CACHE_SIZE 10
  332. /* Must be holding cache_lock */
  333. static struct object *__cache_find(int id)
  334. {
  335. struct object *i;
  336. list_for_each_entry(i, &cache, list)
  337. if (i->id == id) {
  338. i->popularity++;
  339. return i;
  340. }
  341. return NULL;
  342. }
  343. /* Must be holding cache_lock */
  344. static void __cache_delete(struct object *obj)
  345. {
  346. BUG_ON(!obj);
  347. list_del(&obj->list);
  348. kfree(obj);
  349. cache_num--;
  350. }
  351. /* Must be holding cache_lock */
  352. static void __cache_add(struct object *obj)
  353. {
  354. list_add(&obj->list, &cache);
  355. if (++cache_num > MAX_CACHE_SIZE) {
  356. struct object *i, *outcast = NULL;
  357. list_for_each_entry(i, &cache, list) {
  358. if (!outcast || i->popularity < outcast->popularity)
  359. outcast = i;
  360. }
  361. __cache_delete(outcast);
  362. }
  363. }
  364. int cache_add(int id, const char *name)
  365. {
  366. struct object *obj;
  367. if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
  368. return -ENOMEM;
  369. strlcpy(obj->name, name, sizeof(obj->name));
  370. obj->id = id;
  371. obj->popularity = 0;
  372. mutex_lock(&cache_lock);
  373. __cache_add(obj);
  374. mutex_unlock(&cache_lock);
  375. return 0;
  376. }
  377. void cache_delete(int id)
  378. {
  379. mutex_lock(&cache_lock);
  380. __cache_delete(__cache_find(id));
  381. mutex_unlock(&cache_lock);
  382. }
  383. int cache_find(int id, char *name)
  384. {
  385. struct object *obj;
  386. int ret = -ENOENT;
  387. mutex_lock(&cache_lock);
  388. obj = __cache_find(id);
  389. if (obj) {
  390. ret = 0;
  391. strcpy(name, obj->name);
  392. }
  393. mutex_unlock(&cache_lock);
  394. return ret;
  395. }
  396. Da notare che ci assicuriamo sempre di trattenere cache_lock quando
  397. aggiungiamo, rimuoviamo od ispezioniamo la memoria: sia la struttura
  398. della memoria che il suo contenuto sono protetti dal *lock*. Questo
  399. caso è semplice dato che copiamo i dati dall'utente e non permettiamo
  400. mai loro di accedere direttamente agli oggetti.
  401. C'è una piccola ottimizzazione qui: nella funzione :c:func:`cache_add()`
  402. impostiamo i campi dell'oggetto prima di acquisire il *lock*. Questo è
  403. sicuro perché nessun altro potrà accedervi finché non lo inseriremo
  404. nella memoria.
  405. Accesso dal contesto utente
  406. ---------------------------
  407. Ora consideriamo il caso in cui :c:func:`cache_find()` può essere invocata
  408. dal contesto d'interruzione: sia hardware che software. Un esempio potrebbe
  409. essere un timer che elimina oggetti dalla memoria.
  410. Qui di seguito troverete la modifica nel formato *patch*: le righe ``-``
  411. sono quelle rimosse, mentre quelle ``+`` sono quelle aggiunte.
  412. ::
  413. --- cache.c.usercontext 2003-12-09 13:58:54.000000000 +1100
  414. +++ cache.c.interrupt 2003-12-09 14:07:49.000000000 +1100
  415. @@ -12,7 +12,7 @@
  416. int popularity;
  417. };
  418. -static DEFINE_MUTEX(cache_lock);
  419. +static DEFINE_SPINLOCK(cache_lock);
  420. static LIST_HEAD(cache);
  421. static unsigned int cache_num = 0;
  422. #define MAX_CACHE_SIZE 10
  423. @@ -55,6 +55,7 @@
  424. int cache_add(int id, const char *name)
  425. {
  426. struct object *obj;
  427. + unsigned long flags;
  428. if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
  429. return -ENOMEM;
  430. @@ -63,30 +64,33 @@
  431. obj->id = id;
  432. obj->popularity = 0;
  433. - mutex_lock(&cache_lock);
  434. + spin_lock_irqsave(&cache_lock, flags);
  435. __cache_add(obj);
  436. - mutex_unlock(&cache_lock);
  437. + spin_unlock_irqrestore(&cache_lock, flags);
  438. return 0;
  439. }
  440. void cache_delete(int id)
  441. {
  442. - mutex_lock(&cache_lock);
  443. + unsigned long flags;
  444. +
  445. + spin_lock_irqsave(&cache_lock, flags);
  446. __cache_delete(__cache_find(id));
  447. - mutex_unlock(&cache_lock);
  448. + spin_unlock_irqrestore(&cache_lock, flags);
  449. }
  450. int cache_find(int id, char *name)
  451. {
  452. struct object *obj;
  453. int ret = -ENOENT;
  454. + unsigned long flags;
  455. - mutex_lock(&cache_lock);
  456. + spin_lock_irqsave(&cache_lock, flags);
  457. obj = __cache_find(id);
  458. if (obj) {
  459. ret = 0;
  460. strcpy(name, obj->name);
  461. }
  462. - mutex_unlock(&cache_lock);
  463. + spin_unlock_irqrestore(&cache_lock, flags);
  464. return ret;
  465. }
  466. Da notare che :c:func:`spin_lock_irqsave()` disabiliterà le interruzioni
  467. se erano attive, altrimenti non farà niente (quando siamo già in un contesto
  468. d'interruzione); dunque queste funzioni possono essere chiamante in
  469. sicurezza da qualsiasi contesto.
  470. Sfortunatamente, :c:func:`cache_add()` invoca :c:func:`kmalloc()` con
  471. l'opzione ``GFP_KERNEL`` che è permessa solo in contesto utente. Ho supposto
  472. che :c:func:`cache_add()` venga chiamata dal contesto utente, altrimenti
  473. questa opzione deve diventare un parametro di :c:func:`cache_add()`.
  474. Exposing Objects Outside This File
  475. ----------------------------------
  476. Se i vostri oggetti contengono più informazioni, potrebbe non essere
  477. sufficiente copiare i dati avanti e indietro: per esempio, altre parti del
  478. codice potrebbero avere un puntatore a questi oggetti piuttosto che cercarli
  479. ogni volta. Questo introduce due problemi.
  480. Il primo problema è che utilizziamo ``cache_lock`` per proteggere gli oggetti:
  481. dobbiamo renderlo dinamico così che il resto del codice possa usarlo. Questo
  482. rende la sincronizzazione più complicata dato che non avviene più in un unico
  483. posto.
  484. Il secondo problema è il problema del ciclo di vita: se un'altra struttura
  485. mantiene un puntatore ad un oggetto, presumibilmente si aspetta che questo
  486. puntatore rimanga valido. Sfortunatamente, questo è garantito solo mentre
  487. si trattiene il *lock*, altrimenti qualcuno potrebbe chiamare
  488. :c:func:`cache_delete()` o peggio, aggiungere un oggetto che riutilizza lo
  489. stesso indirizzo.
  490. Dato che c'è un solo *lock*, non potete trattenerlo a vita: altrimenti
  491. nessun altro potrà eseguire il proprio lavoro.
  492. La soluzione a questo problema è l'uso di un contatore di riferimenti:
  493. chiunque punti ad un oggetto deve incrementare il contatore, e decrementarlo
  494. quando il puntatore non viene più usato. Quando il contatore raggiunge lo zero
  495. significa che non è più usato e l'oggetto può essere rimosso.
  496. Ecco il codice::
  497. --- cache.c.interrupt 2003-12-09 14:25:43.000000000 +1100
  498. +++ cache.c.refcnt 2003-12-09 14:33:05.000000000 +1100
  499. @@ -7,6 +7,7 @@
  500. struct object
  501. {
  502. struct list_head list;
  503. + unsigned int refcnt;
  504. int id;
  505. char name[32];
  506. int popularity;
  507. @@ -17,6 +18,35 @@
  508. static unsigned int cache_num = 0;
  509. #define MAX_CACHE_SIZE 10
  510. +static void __object_put(struct object *obj)
  511. +{
  512. + if (--obj->refcnt == 0)
  513. + kfree(obj);
  514. +}
  515. +
  516. +static void __object_get(struct object *obj)
  517. +{
  518. + obj->refcnt++;
  519. +}
  520. +
  521. +void object_put(struct object *obj)
  522. +{
  523. + unsigned long flags;
  524. +
  525. + spin_lock_irqsave(&cache_lock, flags);
  526. + __object_put(obj);
  527. + spin_unlock_irqrestore(&cache_lock, flags);
  528. +}
  529. +
  530. +void object_get(struct object *obj)
  531. +{
  532. + unsigned long flags;
  533. +
  534. + spin_lock_irqsave(&cache_lock, flags);
  535. + __object_get(obj);
  536. + spin_unlock_irqrestore(&cache_lock, flags);
  537. +}
  538. +
  539. /* Must be holding cache_lock */
  540. static struct object *__cache_find(int id)
  541. {
  542. @@ -35,6 +65,7 @@
  543. {
  544. BUG_ON(!obj);
  545. list_del(&obj->list);
  546. + __object_put(obj);
  547. cache_num--;
  548. }
  549. @@ -63,6 +94,7 @@
  550. strlcpy(obj->name, name, sizeof(obj->name));
  551. obj->id = id;
  552. obj->popularity = 0;
  553. + obj->refcnt = 1; /* The cache holds a reference */
  554. spin_lock_irqsave(&cache_lock, flags);
  555. __cache_add(obj);
  556. @@ -79,18 +111,15 @@
  557. spin_unlock_irqrestore(&cache_lock, flags);
  558. }
  559. -int cache_find(int id, char *name)
  560. +struct object *cache_find(int id)
  561. {
  562. struct object *obj;
  563. - int ret = -ENOENT;
  564. unsigned long flags;
  565. spin_lock_irqsave(&cache_lock, flags);
  566. obj = __cache_find(id);
  567. - if (obj) {
  568. - ret = 0;
  569. - strcpy(name, obj->name);
  570. - }
  571. + if (obj)
  572. + __object_get(obj);
  573. spin_unlock_irqrestore(&cache_lock, flags);
  574. - return ret;
  575. + return obj;
  576. }
  577. Abbiamo incapsulato il contatore di riferimenti nelle tipiche funzioni
  578. di 'get' e 'put'. Ora possiamo ritornare l'oggetto da :c:func:`cache_find()`
  579. col vantaggio che l'utente può dormire trattenendo l'oggetto (per esempio,
  580. :c:func:`copy_to_user()` per copiare il nome verso lo spazio utente).
  581. Un altro punto da notare è che ho detto che il contatore dovrebbe incrementarsi
  582. per ogni puntatore ad un oggetto: quindi il contatore di riferimenti è 1
  583. quando l'oggetto viene inserito nella memoria. In altre versione il framework
  584. non trattiene un riferimento per se, ma diventa più complicato.
  585. Usare operazioni atomiche per il contatore di riferimenti
  586. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  587. In sostanza, :c:type:`atomic_t` viene usato come contatore di riferimenti.
  588. Ci sono un certo numbero di operazioni atomiche definite
  589. in ``include/asm/atomic.h``: queste sono garantite come atomiche su qualsiasi
  590. processore del sistema, quindi non sono necessari i *lock*. In questo caso è
  591. più semplice rispetto all'uso degli spinlock, benché l'uso degli spinlock
  592. sia più elegante per casi non banali. Le funzioni :c:func:`atomic_inc()` e
  593. :c:func:`atomic_dec_and_test()` vengono usate al posto dei tipici operatori di
  594. incremento e decremento, e i *lock* non sono più necessari per proteggere il
  595. contatore stesso.
  596. ::
  597. --- cache.c.refcnt 2003-12-09 15:00:35.000000000 +1100
  598. +++ cache.c.refcnt-atomic 2003-12-11 15:49:42.000000000 +1100
  599. @@ -7,7 +7,7 @@
  600. struct object
  601. {
  602. struct list_head list;
  603. - unsigned int refcnt;
  604. + atomic_t refcnt;
  605. int id;
  606. char name[32];
  607. int popularity;
  608. @@ -18,33 +18,15 @@
  609. static unsigned int cache_num = 0;
  610. #define MAX_CACHE_SIZE 10
  611. -static void __object_put(struct object *obj)
  612. -{
  613. - if (--obj->refcnt == 0)
  614. - kfree(obj);
  615. -}
  616. -
  617. -static void __object_get(struct object *obj)
  618. -{
  619. - obj->refcnt++;
  620. -}
  621. -
  622. void object_put(struct object *obj)
  623. {
  624. - unsigned long flags;
  625. -
  626. - spin_lock_irqsave(&cache_lock, flags);
  627. - __object_put(obj);
  628. - spin_unlock_irqrestore(&cache_lock, flags);
  629. + if (atomic_dec_and_test(&obj->refcnt))
  630. + kfree(obj);
  631. }
  632. void object_get(struct object *obj)
  633. {
  634. - unsigned long flags;
  635. -
  636. - spin_lock_irqsave(&cache_lock, flags);
  637. - __object_get(obj);
  638. - spin_unlock_irqrestore(&cache_lock, flags);
  639. + atomic_inc(&obj->refcnt);
  640. }
  641. /* Must be holding cache_lock */
  642. @@ -65,7 +47,7 @@
  643. {
  644. BUG_ON(!obj);
  645. list_del(&obj->list);
  646. - __object_put(obj);
  647. + object_put(obj);
  648. cache_num--;
  649. }
  650. @@ -94,7 +76,7 @@
  651. strlcpy(obj->name, name, sizeof(obj->name));
  652. obj->id = id;
  653. obj->popularity = 0;
  654. - obj->refcnt = 1; /* The cache holds a reference */
  655. + atomic_set(&obj->refcnt, 1); /* The cache holds a reference */
  656. spin_lock_irqsave(&cache_lock, flags);
  657. __cache_add(obj);
  658. @@ -119,7 +101,7 @@
  659. spin_lock_irqsave(&cache_lock, flags);
  660. obj = __cache_find(id);
  661. if (obj)
  662. - __object_get(obj);
  663. + object_get(obj);
  664. spin_unlock_irqrestore(&cache_lock, flags);
  665. return obj;
  666. }
  667. Proteggere l'oggetto stesso
  668. ---------------------------
  669. In questo esempio, assumiamo che gli oggetti (ad eccezione del contatore
  670. di riferimenti) non cambino mai dopo la loro creazione. Se vogliamo permettere
  671. al nome di cambiare abbiamo tre possibilità:
  672. - Si può togliere static da ``cache_lock`` e dire agli utenti che devono
  673. trattenere il *lock* prima di modificare il nome di un oggetto.
  674. - Si può fornire una funzione :c:func:`cache_obj_rename()` che prende il
  675. *lock* e cambia il nome per conto del chiamante; si dirà poi agli utenti
  676. di usare questa funzione.
  677. - Si può decidere che ``cache_lock`` protegge solo la memoria stessa, ed
  678. un altro *lock* è necessario per la protezione del nome.
  679. Teoricamente, possiamo avere un *lock* per ogni campo e per ogni oggetto.
  680. In pratica, le varianti più comuni sono:
  681. - un *lock* che protegge l'infrastruttura (la lista ``cache`` di questo
  682. esempio) e gli oggetti. Questo è quello che abbiamo fatto finora.
  683. - un *lock* che protegge l'infrastruttura (inclusi i puntatori alla lista
  684. negli oggetti), e un *lock* nell'oggetto per proteggere il resto
  685. dell'oggetto stesso.
  686. - *lock* multipli per proteggere l'infrastruttura (per esempio un *lock*
  687. per ogni lista), possibilmente con un *lock* per oggetto.
  688. Qui di seguito un'implementazione con "un lock per oggetto":
  689. ::
  690. --- cache.c.refcnt-atomic 2003-12-11 15:50:54.000000000 +1100
  691. +++ cache.c.perobjectlock 2003-12-11 17:15:03.000000000 +1100
  692. @@ -6,11 +6,17 @@
  693. struct object
  694. {
  695. + /* These two protected by cache_lock. */
  696. struct list_head list;
  697. + int popularity;
  698. +
  699. atomic_t refcnt;
  700. +
  701. + /* Doesn't change once created. */
  702. int id;
  703. +
  704. + spinlock_t lock; /* Protects the name */
  705. char name[32];
  706. - int popularity;
  707. };
  708. static DEFINE_SPINLOCK(cache_lock);
  709. @@ -77,6 +84,7 @@
  710. obj->id = id;
  711. obj->popularity = 0;
  712. atomic_set(&obj->refcnt, 1); /* The cache holds a reference */
  713. + spin_lock_init(&obj->lock);
  714. spin_lock_irqsave(&cache_lock, flags);
  715. __cache_add(obj);
  716. Da notare che ho deciso che il contatore di popolarità dovesse essere
  717. protetto da ``cache_lock`` piuttosto che dal *lock* dell'oggetto; questo
  718. perché è logicamente parte dell'infrastruttura (come
  719. :c:type:`struct list_head <list_head>` nell'oggetto). In questo modo,
  720. in :c:func:`__cache_add()`, non ho bisogno di trattenere il *lock* di ogni
  721. oggetto mentre si cerca il meno popolare.
  722. Ho anche deciso che il campo id è immutabile, quindi non ho bisogno di
  723. trattenere il lock dell'oggetto quando si usa :c:func:`__cache_find()`
  724. per leggere questo campo; il *lock* dell'oggetto è usato solo dal chiamante
  725. che vuole leggere o scrivere il campo name.
  726. Inoltre, da notare che ho aggiunto un commento che descrive i dati che sono
  727. protetti dal *lock*. Questo è estremamente importante in quanto descrive il
  728. comportamento del codice, che altrimenti sarebbe di difficile comprensione
  729. leggendo solamente il codice. E come dice Alan Cox: “Lock data, not code”.
  730. Problemi comuni
  731. ===============
  732. .. _`it_deadlock`:
  733. Stallo: semplice ed avanzato
  734. ----------------------------
  735. Esiste un tipo di baco dove un pezzo di codice tenta di trattenere uno
  736. spinlock due volte: questo rimarrà in attesa attiva per sempre aspettando che
  737. il *lock* venga rilasciato (in Linux spinlocks, rwlocks e mutex non sono
  738. ricorsivi).
  739. Questo è facile da diagnosticare: non è uno di quei problemi che ti tengono
  740. sveglio 5 notti a parlare da solo.
  741. Un caso un pochino più complesso; immaginate d'avere una spazio condiviso
  742. fra un softirq ed il contesto utente. Se usate :c:func:`spin_lock()` per
  743. proteggerlo, il contesto utente potrebbe essere interrotto da un softirq
  744. mentre trattiene il lock, da qui il softirq rimarrà in attesa attiva provando
  745. ad acquisire il *lock* già trattenuto nel contesto utente.
  746. Questi casi sono chiamati stalli (*deadlock*), e come mostrato qui sopra,
  747. può succedere anche con un solo processore (Ma non sui sistemi
  748. monoprocessore perché gli spinlock spariscano quando il kernel è compilato
  749. con ``CONFIG_SMP``\ =n. Nonostante ciò, nel secondo caso avrete comunque
  750. una corruzione dei dati).
  751. Questi casi sono facili da diagnosticare; sui sistemi multi-processore
  752. il supervisione (*watchdog*) o l'opzione di compilazione ``DEBUG_SPINLOCK``
  753. (``include/linux/spinlock.h``) permettono di scovare immediatamente quando
  754. succedono.
  755. Esiste un caso più complesso che è conosciuto come l'abbraccio della morte;
  756. questo coinvolge due o più *lock*. Diciamo che avete un vettore di hash in cui
  757. ogni elemento è uno spinlock a cui è associata una lista di elementi con lo
  758. stesso hash. In un gestore di interruzioni software, dovete modificare un
  759. oggetto e spostarlo su un altro hash; quindi dovrete trattenete lo spinlock
  760. del vecchio hash e di quello nuovo, quindi rimuovere l'oggetto dal vecchio ed
  761. inserirlo nel nuovo.
  762. Qui abbiamo due problemi. Primo, se il vostro codice prova a spostare un
  763. oggetto all'interno della stessa lista, otterrete uno stallo visto che
  764. tenterà di trattenere lo stesso *lock* due volte. Secondo, se la stessa
  765. interruzione software su un altro processore sta tentando di spostare
  766. un altro oggetto nella direzione opposta, potrebbe accadere quanto segue:
  767. +---------------------------------+---------------------------------+
  768. | CPU 1 | CPU 2 |
  769. +=================================+=================================+
  770. | Trattiene *lock* A -> OK | Trattiene *lock* B -> OK |
  771. +---------------------------------+---------------------------------+
  772. | Trattiene *lock* B -> attesa | Trattiene *lock* A -> attesa |
  773. +---------------------------------+---------------------------------+
  774. Table: Conseguenze
  775. Entrambe i processori rimarranno in attesa attiva sul *lock* per sempre,
  776. aspettando che l'altro lo rilasci. Sembra e puzza come un blocco totale.
  777. Prevenire gli stalli
  778. --------------------
  779. I libri di testo vi diranno che se trattenete i *lock* sempre nello stesso
  780. ordine non avrete mai un simile stallo. La pratica vi dirà che questo
  781. approccio non funziona all'ingrandirsi del sistema: quando creo un nuovo
  782. *lock* non ne capisco abbastanza del kernel per dire in quale dei 5000 *lock*
  783. si incastrerà.
  784. I *lock* migliori sono quelli incapsulati: non vengono esposti nei file di
  785. intestazione, e non vengono mai trattenuti fuori dallo stesso file. Potete
  786. rileggere questo codice e vedere che non ci sarà mai uno stallo perché
  787. non tenterà mai di trattenere un altro *lock* quando lo ha già.
  788. Le persone che usano il vostro codice non devono nemmeno sapere che voi
  789. state usando dei *lock*.
  790. Un classico problema deriva dall'uso di *callback* e di *hook*: se li
  791. chiamate mentre trattenete un *lock*, rischiate uno stallo o un abbraccio
  792. della morte (chi lo sa cosa farà una *callback*?).
  793. Ossessiva prevenzione degli stalli
  794. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  795. Gli stalli sono un problema, ma non così terribile come la corruzione dei dati.
  796. Un pezzo di codice trattiene un *lock* di lettura, cerca in una lista,
  797. fallisce nel trovare quello che vuole, quindi rilascia il *lock* di lettura,
  798. trattiene un *lock* di scrittura ed inserisce un oggetto; questo genere di
  799. codice presenta una corsa critica.
  800. Se non riuscite a capire il perché, per favore state alla larga dal mio
  801. codice.
  802. corsa fra temporizzatori: un passatempo del kernel
  803. --------------------------------------------------
  804. I temporizzatori potrebbero avere dei problemi con le corse critiche.
  805. Considerate una collezione di oggetti (liste, hash, eccetera) dove ogni oggetto
  806. ha un temporizzatore che sta per distruggerlo.
  807. Se volete eliminare l'intera collezione (diciamo quando rimuovete un modulo),
  808. potreste fare come segue::
  809. /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
  810. HUNGARIAN NOTATION */
  811. spin_lock_bh(&list_lock);
  812. while (list) {
  813. struct foo *next = list->next;
  814. del_timer(&list->timer);
  815. kfree(list);
  816. list = next;
  817. }
  818. spin_unlock_bh(&list_lock);
  819. Primo o poi, questo esploderà su un sistema multiprocessore perché un
  820. temporizzatore potrebbe essere già partiro prima di :c:func:`spin_lock_bh()`,
  821. e prenderà il *lock* solo dopo :c:func:`spin_unlock_bh()`, e cercherà
  822. di eliminare il suo oggetto (che però è già stato eliminato).
  823. Questo può essere evitato controllando il valore di ritorno di
  824. :c:func:`del_timer()`: se ritorna 1, il temporizzatore è stato già
  825. rimosso. Se 0, significa (in questo caso) che il temporizzatore è in
  826. esecuzione, quindi possiamo fare come segue::
  827. retry:
  828. spin_lock_bh(&list_lock);
  829. while (list) {
  830. struct foo *next = list->next;
  831. if (!del_timer(&list->timer)) {
  832. /* Give timer a chance to delete this */
  833. spin_unlock_bh(&list_lock);
  834. goto retry;
  835. }
  836. kfree(list);
  837. list = next;
  838. }
  839. spin_unlock_bh(&list_lock);
  840. Un altro problema è l'eliminazione dei temporizzatori che si riavviano
  841. da soli (chiamando :c:func:`add_timer()` alla fine della loro esecuzione).
  842. Dato che questo è un problema abbastanza comune con una propensione
  843. alle corse critiche, dovreste usare :c:func:`del_timer_sync()`
  844. (``include/linux/timer.h``) per gestire questo caso. Questa ritorna il
  845. numero di volte che il temporizzatore è stato interrotto prima che
  846. fosse in grado di fermarlo senza che si riavviasse.
  847. Velocità della sincronizzazione
  848. ===============================
  849. Ci sono tre cose importanti da tenere in considerazione quando si valuta
  850. la velocità d'esecuzione di un pezzo di codice che necessita di
  851. sincronizzazione. La prima è la concorrenza: quante cose rimangono in attesa
  852. mentre qualcuno trattiene un *lock*. La seconda è il tempo necessario per
  853. acquisire (senza contese) e rilasciare un *lock*. La terza è di usare meno
  854. *lock* o di più furbi. Immagino che i *lock* vengano usati regolarmente,
  855. altrimenti, non sareste interessati all'efficienza.
  856. La concorrenza dipende da quanto a lungo un *lock* è trattenuto: dovreste
  857. trattenere un *lock* solo il tempo minimo necessario ma non un istante in più.
  858. Nella memoria dell'esempio precedente, creiamo gli oggetti senza trattenere
  859. il *lock*, poi acquisiamo il *lock* quando siamo pronti per inserirlo nella
  860. lista.
  861. Il tempo di acquisizione di un *lock* dipende da quanto danno fa
  862. l'operazione sulla *pipeline* (ovvero stalli della *pipeline*) e quant'è
  863. probabile che il processore corrente sia stato anche l'ultimo ad acquisire
  864. il *lock* (in pratica, il *lock* è nella memoria cache del processore
  865. corrente?): su sistemi multi-processore questa probabilità precipita
  866. rapidamente. Consideriamo un processore Intel Pentium III a 700Mhz: questo
  867. esegue un'istruzione in 0.7ns, un incremento atomico richiede 58ns, acquisire
  868. un *lock* che è nella memoria cache del processore richiede 160ns, e un
  869. trasferimento dalla memoria cache di un altro processore richiede altri
  870. 170/360ns (Leggetevi l'articolo di Paul McKenney's `Linux Journal RCU
  871. article <http://www.linuxjournal.com/article.php?sid=6993>`__).
  872. Questi due obiettivi sono in conflitto: trattenere un *lock* per il minor
  873. tempo possibile potrebbe richiedere la divisione in più *lock* per diverse
  874. parti (come nel nostro ultimo esempio con un *lock* per ogni oggetto),
  875. ma questo aumenta il numero di acquisizioni di *lock*, ed il risultato
  876. spesso è che tutto è più lento che con un singolo *lock*. Questo è un altro
  877. argomento in favore della semplicità quando si parla di sincronizzazione.
  878. Il terzo punto è discusso di seguito: ci sono alcune tecniche per ridurre
  879. il numero di sincronizzazioni che devono essere fatte.
  880. Read/Write Lock Variants
  881. ------------------------
  882. Sia gli spinlock che i mutex hanno una variante per la lettura/scrittura
  883. (read/write): ``rwlock_t`` e :c:type:`struct rw_semaphore <rw_semaphore>`.
  884. Queste dividono gli utenti in due categorie: i lettori e gli scrittori.
  885. Se state solo leggendo i dati, potete acquisire il *lock* di lettura, ma
  886. per scrivere avrete bisogno del *lock* di scrittura. Molti possono trattenere
  887. il *lock* di lettura, ma solo uno scrittore alla volta può trattenere
  888. quello di scrittura.
  889. Se il vostro codice si divide chiaramente in codice per lettori e codice
  890. per scrittori (come nel nostro esempio), e il *lock* dei lettori viene
  891. trattenuto per molto tempo, allora l'uso di questo tipo di *lock* può aiutare.
  892. Questi sono leggermente più lenti rispetto alla loro versione normale, quindi
  893. nella pratica l'uso di ``rwlock_t`` non ne vale la pena.
  894. Evitare i *lock*: Read Copy Update
  895. --------------------------------------------
  896. Esiste un metodo di sincronizzazione per letture e scritture detto
  897. Read Copy Update. Con l'uso della tecnica RCU, i lettori possono scordarsi
  898. completamente di trattenere i *lock*; dato che nel nostro esempio ci
  899. aspettiamo d'avere più lettore che scrittori (altrimenti questa memoria
  900. sarebbe uno spreco) possiamo dire che questo meccanismo permette
  901. un'ottimizzazione.
  902. Come facciamo a sbarazzarci dei *lock* di lettura? Sbarazzarsi dei *lock* di
  903. lettura significa che uno scrittore potrebbe cambiare la lista sotto al naso
  904. dei lettori. Questo è abbastanza semplice: possiamo leggere una lista
  905. concatenata se lo scrittore aggiunge elementi alla fine e con certe
  906. precauzioni. Per esempio, aggiungendo ``new`` ad una lista concatenata
  907. chiamata ``list``::
  908. new->next = list->next;
  909. wmb();
  910. list->next = new;
  911. La funzione :c:func:`wmb()` è una barriera di sincronizzazione delle
  912. scritture. Questa garantisce che la prima operazione (impostare l'elemento
  913. ``next`` del nuovo elemento) venga completata e vista da tutti i processori
  914. prima che venga eseguita la seconda operazione (che sarebbe quella di mettere
  915. il nuovo elemento nella lista). Questo è importante perché i moderni
  916. compilatori ed i moderni processori possono, entrambe, riordinare le istruzioni
  917. se non vengono istruiti altrimenti: vogliamo che i lettori non vedano
  918. completamente il nuovo elemento; oppure che lo vedano correttamente e quindi
  919. il puntatore ``next`` deve puntare al resto della lista.
  920. Fortunatamente, c'è una funzione che fa questa operazione sulle liste
  921. :c:type:`struct list_head <list_head>`: :c:func:`list_add_rcu()`
  922. (``include/linux/list.h``).
  923. Rimuovere un elemento dalla lista è anche più facile: sostituiamo il puntatore
  924. al vecchio elemento con quello del suo successore, e i lettori vedranno
  925. l'elemento o lo salteranno.
  926. ::
  927. list->next = old->next;
  928. La funzione :c:func:`list_del_rcu()` (``include/linux/list.h``) fa esattamente
  929. questo (la versione normale corrompe il vecchio oggetto, e non vogliamo che
  930. accada).
  931. Anche i lettori devono stare attenti: alcuni processori potrebbero leggere
  932. attraverso il puntatore ``next`` il contenuto dell'elemento successivo
  933. troppo presto, ma non accorgersi che il contenuto caricato è sbagliato quando
  934. il puntatore ``next`` viene modificato alla loro spalle. Ancora una volta
  935. c'è una funzione che viene in vostro aiuto :c:func:`list_for_each_entry_rcu()`
  936. (``include/linux/list.h``). Ovviamente, gli scrittori possono usare
  937. :c:func:`list_for_each_entry()` dato che non ci possono essere due scrittori
  938. in contemporanea.
  939. Il nostro ultimo dilemma è il seguente: quando possiamo realmente distruggere
  940. l'elemento rimosso? Ricordate, un lettore potrebbe aver avuto accesso a questo
  941. elemento proprio ora: se eliminiamo questo elemento ed il puntatore ``next``
  942. cambia, il lettore salterà direttamente nella spazzatura e scoppierà. Dobbiamo
  943. aspettare finché tutti i lettori che stanno attraversando la lista abbiano
  944. finito. Utilizziamo :c:func:`call_rcu()` per registrare una funzione di
  945. richiamo che distrugga l'oggetto quando tutti i lettori correnti hanno
  946. terminato. In alternative, potrebbe essere usata la funzione
  947. :c:func:`synchronize_rcu()` che blocca l'esecuzione finché tutti i lettori
  948. non terminano di ispezionare la lista.
  949. Ma come fa l'RCU a sapere quando i lettori sono finiti? Il meccanismo è
  950. il seguente: innanzi tutto i lettori accedono alla lista solo fra la coppia
  951. :c:func:`rcu_read_lock()`/:c:func:`rcu_read_unlock()` che disabilita la
  952. prelazione così che i lettori non vengano sospesi mentre stanno leggendo
  953. la lista.
  954. Poi, l'RCU aspetta finché tutti i processori non abbiano dormito almeno
  955. una volta; a questo punto, dato che i lettori non possono dormire, possiamo
  956. dedurre che un qualsiasi lettore che abbia consultato la lista durante la
  957. rimozione abbia già terminato, quindi la *callback* viene eseguita. Il vero
  958. codice RCU è un po' più ottimizzato di così, ma questa è l'idea di fondo.
  959. ::
  960. --- cache.c.perobjectlock 2003-12-11 17:15:03.000000000 +1100
  961. +++ cache.c.rcupdate 2003-12-11 17:55:14.000000000 +1100
  962. @@ -1,15 +1,18 @@
  963. #include <linux/list.h>
  964. #include <linux/slab.h>
  965. #include <linux/string.h>
  966. +#include <linux/rcupdate.h>
  967. #include <linux/mutex.h>
  968. #include <asm/errno.h>
  969. struct object
  970. {
  971. - /* These two protected by cache_lock. */
  972. + /* This is protected by RCU */
  973. struct list_head list;
  974. int popularity;
  975. + struct rcu_head rcu;
  976. +
  977. atomic_t refcnt;
  978. /* Doesn't change once created. */
  979. @@ -40,7 +43,7 @@
  980. {
  981. struct object *i;
  982. - list_for_each_entry(i, &cache, list) {
  983. + list_for_each_entry_rcu(i, &cache, list) {
  984. if (i->id == id) {
  985. i->popularity++;
  986. return i;
  987. @@ -49,19 +52,25 @@
  988. return NULL;
  989. }
  990. +/* Final discard done once we know no readers are looking. */
  991. +static void cache_delete_rcu(void *arg)
  992. +{
  993. + object_put(arg);
  994. +}
  995. +
  996. /* Must be holding cache_lock */
  997. static void __cache_delete(struct object *obj)
  998. {
  999. BUG_ON(!obj);
  1000. - list_del(&obj->list);
  1001. - object_put(obj);
  1002. + list_del_rcu(&obj->list);
  1003. cache_num--;
  1004. + call_rcu(&obj->rcu, cache_delete_rcu);
  1005. }
  1006. /* Must be holding cache_lock */
  1007. static void __cache_add(struct object *obj)
  1008. {
  1009. - list_add(&obj->list, &cache);
  1010. + list_add_rcu(&obj->list, &cache);
  1011. if (++cache_num > MAX_CACHE_SIZE) {
  1012. struct object *i, *outcast = NULL;
  1013. list_for_each_entry(i, &cache, list) {
  1014. @@ -104,12 +114,11 @@
  1015. struct object *cache_find(int id)
  1016. {
  1017. struct object *obj;
  1018. - unsigned long flags;
  1019. - spin_lock_irqsave(&cache_lock, flags);
  1020. + rcu_read_lock();
  1021. obj = __cache_find(id);
  1022. if (obj)
  1023. object_get(obj);
  1024. - spin_unlock_irqrestore(&cache_lock, flags);
  1025. + rcu_read_unlock();
  1026. return obj;
  1027. }
  1028. Da notare che i lettori modificano il campo popularity nella funzione
  1029. :c:func:`__cache_find()`, e ora non trattiene alcun *lock*. Una soluzione
  1030. potrebbe essere quella di rendere la variabile ``atomic_t``, ma per l'uso
  1031. che ne abbiamo fatto qui, non ci interessano queste corse critiche perché un
  1032. risultato approssimativo è comunque accettabile, quindi non l'ho cambiato.
  1033. Il risultato è che la funzione :c:func:`cache_find()` non ha bisogno di alcuna
  1034. sincronizzazione con le altre funzioni, quindi è veloce su un sistema
  1035. multi-processore tanto quanto lo sarebbe su un sistema mono-processore.
  1036. Esiste un'ulteriore ottimizzazione possibile: vi ricordate il codice originale
  1037. della nostra memoria dove non c'erano contatori di riferimenti e il chiamante
  1038. semplicemente tratteneva il *lock* prima di accedere ad un oggetto? Questo è
  1039. ancora possibile: se trattenete un *lock* nessuno potrà cancellare l'oggetto,
  1040. quindi non avete bisogno di incrementare e decrementare il contatore di
  1041. riferimenti.
  1042. Ora, dato che il '*lock* di lettura' di un RCU non fa altro che disabilitare
  1043. la prelazione, un chiamante che ha sempre la prelazione disabilitata fra le
  1044. chiamate :c:func:`cache_find()` e :c:func:`object_put()` non necessita
  1045. di incrementare e decrementare il contatore di riferimenti. Potremmo
  1046. esporre la funzione :c:func:`__cache_find()` dichiarandola non-static,
  1047. e quel chiamante potrebbe usare direttamente questa funzione.
  1048. Il beneficio qui sta nel fatto che il contatore di riferimenti no
  1049. viene scritto: l'oggetto non viene alterato in alcun modo e quindi diventa
  1050. molto più veloce su sistemi molti-processore grazie alla loro memoria cache.
  1051. .. _`it_per-cpu`:
  1052. Dati per processore
  1053. -------------------
  1054. Un'altra tecnica comunemente usata per evitare la sincronizzazione è quella
  1055. di duplicare le informazioni per ogni processore. Per esempio, se volete
  1056. avere un contatore di qualcosa, potreste utilizzare uno spinlock ed un
  1057. singolo contatore. Facile e pulito.
  1058. Se questo dovesse essere troppo lento (solitamente non lo è, ma se avete
  1059. dimostrato che lo è devvero), potreste usare un contatore per ogni processore
  1060. e quindi non sarebbe più necessaria la mutua esclusione. Vedere
  1061. :c:func:`DEFINE_PER_CPU()`, :c:func:`get_cpu_var()` e :c:func:`put_cpu_var()`
  1062. (``include/linux/percpu.h``).
  1063. Il tipo di dato ``local_t``, la funzione :c:func:`cpu_local_inc()` e tutte
  1064. le altre funzioni associate, sono di particolare utilità per semplici contatori
  1065. per-processore; su alcune architetture sono anche più efficienti
  1066. (``include/asm/local.h``).
  1067. Da notare che non esiste un modo facile ed affidabile per ottenere il valore
  1068. di un simile contatore senza introdurre altri *lock*. In alcuni casi questo
  1069. non è un problema.
  1070. Dati che sono usati prevalentemente dai gestori d'interruzioni
  1071. --------------------------------------------------------------
  1072. Se i dati vengono utilizzati sempre dallo stesso gestore d'interruzioni,
  1073. allora i *lock* non vi servono per niente: il kernel già vi garantisce che
  1074. il gestore d'interruzione non verrà eseguito in contemporanea su diversi
  1075. processori.
  1076. Manfred Spraul fa notare che potreste comunque comportarvi così anche
  1077. se i dati vengono occasionalmente utilizzati da un contesto utente o
  1078. da un'interruzione software. Il gestore d'interruzione non utilizza alcun
  1079. *lock*, e tutti gli altri accessi verranno fatti così::
  1080. spin_lock(&lock);
  1081. disable_irq(irq);
  1082. ...
  1083. enable_irq(irq);
  1084. spin_unlock(&lock);
  1085. La funzione :c:func:`disable_irq()` impedisce al gestore d'interruzioni
  1086. d'essere eseguito (e aspetta che finisca nel caso fosse in esecuzione su
  1087. un altro processore). Lo spinlock, invece, previene accessi simultanei.
  1088. Naturalmente, questo è più lento della semplice chiamata
  1089. :c:func:`spin_lock_irq()`, quindi ha senso solo se questo genere di accesso
  1090. è estremamente raro.
  1091. .. _`it_sleeping-things`:
  1092. Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni?
  1093. =========================================================================
  1094. Molte funzioni del kernel dormono (in sostanza, chiamano ``schedule()``)
  1095. direttamente od indirettamente: non potete chiamarle se trattenere uno
  1096. spinlock o avete la prelazione disabilitata, mai. Questo significa che
  1097. dovete necessariamente essere nel contesto utente: chiamarle da un
  1098. contesto d'interruzione è illegale.
  1099. Alcune funzioni che dormono
  1100. ---------------------------
  1101. Le più comuni sono elencate qui di seguito, ma solitamente dovete leggere
  1102. il codice per scoprire se altre chiamate sono sicure. Se chiunque altro
  1103. le chiami dorme, allora dovreste poter dormire anche voi. In particolar
  1104. modo, le funzioni di registrazione e deregistrazione solitamente si
  1105. aspettano d'essere chiamante da un contesto utente e quindi che possono
  1106. dormire.
  1107. - Accessi allo spazio utente:
  1108. - :c:func:`copy_from_user()`
  1109. - :c:func:`copy_to_user()`
  1110. - :c:func:`get_user()`
  1111. - :c:func:`put_user()`
  1112. - :c:func:`kmalloc(GFP_KERNEL) <kmalloc>`
  1113. - :c:func:`mutex_lock_interruptible()` and
  1114. :c:func:`mutex_lock()`
  1115. C'è anche :c:func:`mutex_trylock()` che però non dorme.
  1116. Comunque, non deve essere usata in un contesto d'interruzione dato
  1117. che la sua implementazione non è sicura in quel contesto.
  1118. Anche :c:func:`mutex_unlock()` non dorme mai. Non può comunque essere
  1119. usata in un contesto d'interruzione perché un mutex deve essere rilasciato
  1120. dallo stesso processo che l'ha acquisito.
  1121. Alcune funzioni che non dormono
  1122. -------------------------------
  1123. Alcune funzioni possono essere chiamate tranquillamente da qualsiasi
  1124. contesto, o trattenendo un qualsiasi *lock*.
  1125. - :c:func:`printk()`
  1126. - :c:func:`kfree()`
  1127. - :c:func:`add_timer()` e :c:func:`del_timer()`
  1128. Riferimento per l'API dei Mutex
  1129. ===============================
  1130. .. kernel-doc:: include/linux/mutex.h
  1131. :internal:
  1132. .. kernel-doc:: kernel/locking/mutex.c
  1133. :export:
  1134. Riferimento per l'API dei Futex
  1135. ===============================
  1136. .. kernel-doc:: kernel/futex.c
  1137. :internal:
  1138. Approfondimenti
  1139. ===============
  1140. - ``Documentation/locking/spinlocks.txt``: la guida di Linus Torvalds agli
  1141. spinlock del kernel.
  1142. - Unix Systems for Modern Architectures: Symmetric Multiprocessing and
  1143. Caching for Kernel Programmers.
  1144. L'introduzione alla sincronizzazione a livello di kernel di Curt Schimmel
  1145. è davvero ottima (non è scritta per Linux, ma approssimativamente si adatta
  1146. a tutte le situazioni). Il libro è costoso, ma vale ogni singolo spicciolo
  1147. per capire la sincronizzazione nei sistemi multi-processore.
  1148. [ISBN: 0201633388]
  1149. Ringraziamenti
  1150. ==============
  1151. Grazie a Telsa Gwynne per aver formattato questa guida in DocBook, averla
  1152. pulita e aggiunto un po' di stile.
  1153. Grazie a Martin Pool, Philipp Rumpf, Stephen Rothwell, Paul Mackerras,
  1154. Ruedi Aschwanden, Alan Cox, Manfred Spraul, Tim Waugh, Pete Zaitcev,
  1155. James Morris, Robert Love, Paul McKenney, John Ashby per aver revisionato,
  1156. corretto, maledetto e commentato.
  1157. Grazie alla congrega per non aver avuto alcuna influenza su questo documento.
  1158. Glossario
  1159. =========
  1160. prelazione
  1161. Prima del kernel 2.5, o quando ``CONFIG_PREEMPT`` non è impostato, i processi
  1162. in contesto utente non si avvicendano nell'esecuzione (in pratica, il
  1163. processo userà il processore fino al proprio termine, a meno che non ci siano
  1164. delle interruzioni). Con l'aggiunta di ``CONFIG_PREEMPT`` nella versione
  1165. 2.5.4 questo è cambiato: quando si è in contesto utente, processi con una
  1166. priorità maggiore possono subentrare nell'esecuzione: gli spinlock furono
  1167. cambiati per disabilitare la prelazioni, anche su sistemi monoprocessore.
  1168. bh
  1169. Bottom Half: per ragioni storiche, le funzioni che contengono '_bh' nel
  1170. loro nome ora si riferiscono a qualsiasi interruzione software; per esempio,
  1171. :c:func:`spin_lock_bh()` blocca qualsiasi interuzione software sul processore
  1172. corrente. I *Bottom Halves* sono deprecati, e probabilmente verranno
  1173. sostituiti dai tasklet. In un dato momento potrà esserci solo un
  1174. *bottom half* in esecuzione.
  1175. contesto d'interruzione
  1176. Non è il contesto utente: qui si processano le interruzioni hardware e
  1177. software. La macro :c:func:`in_interrupt()` ritorna vero.
  1178. contesto utente
  1179. Il kernel che esegue qualcosa per conto di un particolare processo (per
  1180. esempio una chiamata di sistema) o di un thread del kernel. Potete
  1181. identificare il processo con la macro ``current``. Da non confondere
  1182. con lo spazio utente. Può essere interrotto sia da interruzioni software
  1183. che hardware.
  1184. interruzione hardware
  1185. Richiesta di interruzione hardware. :c:func:`in_irq()` ritorna vero in un
  1186. gestore d'interruzioni hardware.
  1187. interruzione software / softirq
  1188. Gestore di interruzioni software: :c:func:`in_irq()` ritorna falso;
  1189. :c:func:`in_softirq()` ritorna vero. I tasklet e le softirq sono entrambi
  1190. considerati 'interruzioni software'.
  1191. In soldoni, un softirq è uno delle 32 interruzioni software che possono
  1192. essere eseguite su più processori in contemporanea. A volte si usa per
  1193. riferirsi anche ai tasklet (in pratica tutte le interruzioni software).
  1194. monoprocessore / UP
  1195. (Uni-Processor) un solo processore, ovvero non è SMP. (``CONFIG_SMP=n``).
  1196. multi-processore / SMP
  1197. (Symmetric Multi-Processor) kernel compilati per sistemi multi-processore
  1198. (``CONFIG_SMP=y``).
  1199. spazio utente
  1200. Un processo che esegue il proprio codice fuori dal kernel.
  1201. tasklet
  1202. Un'interruzione software registrabile dinamicamente che ha la garanzia
  1203. d'essere eseguita solo su un processore alla volta.
  1204. timer
  1205. Un'interruzione software registrabile dinamicamente che viene eseguita
  1206. (circa) in un determinato momento. Quando è in esecuzione è come un tasklet
  1207. (infatti, sono chiamati da ``TIMER_SOFTIRQ``).