1 .. include:: ../disclaimer-ita.rst
3 :Original: :ref:`Documentation/kernel-hacking/locking.rst <kernel_hacking_lock>`
4 :Translator: Federico Vaga <federico.vaga@vaga.pv.it>
6 .. _it_kernel_hacking_lock:
8 ==========================================
9 L'inaffidabile guida alla sincronizzazione
10 ==========================================
12 :Author: Rusty Russell
17 Benvenuto, alla notevole ed inaffidabile guida ai problemi di sincronizzazione
18 (locking) nel kernel. Questo documento descrive il sistema di sincronizzazione
21 Dato il largo utilizzo del multi-threading e della prelazione nel kernel
22 Linux, chiunque voglia dilettarsi col kernel deve conoscere i concetti
23 fondamentali della concorrenza e della sincronizzazione nei sistemi
26 Il problema con la concorrenza
27 ==============================
29 (Saltatelo se sapete già cos'è una corsa critica).
31 In un normale programma, potete incrementare un contatore nel seguente modo:
37 Questo è quello che vi aspettereste che accada sempre:
40 .. table:: Risultati attesi
42 +------------------------------------+------------------------------------+
43 | Istanza 1 | Istanza 2 |
44 +====================================+====================================+
45 | leggi contatore (5) | |
46 +------------------------------------+------------------------------------+
48 +------------------------------------+------------------------------------+
49 | scrivi contatore (6) | |
50 +------------------------------------+------------------------------------+
51 | | leggi contatore (6) |
52 +------------------------------------+------------------------------------+
54 +------------------------------------+------------------------------------+
55 | | scrivi contatore (7) |
56 +------------------------------------+------------------------------------+
58 Questo è quello che potrebbe succedere in realtà:
60 .. table:: Possibile risultato
62 +------------------------------------+------------------------------------+
63 | Istanza 1 | Istanza 2 |
64 +====================================+====================================+
65 | leggi contatore (5) | |
66 +------------------------------------+------------------------------------+
67 | | leggi contatore (5) |
68 +------------------------------------+------------------------------------+
70 +------------------------------------+------------------------------------+
72 +------------------------------------+------------------------------------+
73 | scrivi contatore (6) | |
74 +------------------------------------+------------------------------------+
75 | | scrivi contatore (6) |
76 +------------------------------------+------------------------------------+
79 Corse critiche e sezioni critiche
80 ---------------------------------
82 Questa sovrapposizione, ovvero quando un risultato dipende dal tempo che
83 intercorre fra processi diversi, è chiamata corsa critica. La porzione
84 di codice che contiene questo problema è chiamata sezione critica.
85 In particolar modo da quando Linux ha incominciato a girare su
86 macchine multi-processore, le sezioni critiche sono diventate uno dei
87 maggiori problemi di progettazione ed implementazione del kernel.
89 La prelazione può sortire gli stessi effetti, anche se c'è una sola CPU:
90 interrompendo un processo nella sua sezione critica otterremo comunque
91 la stessa corsa critica. In questo caso, il thread che si avvicenda
92 nell'esecuzione potrebbe eseguire anch'esso la sezione critica.
94 La soluzione è quella di riconoscere quando avvengono questi accessi
95 simultanei, ed utilizzare i *lock* per accertarsi che solo un'istanza
96 per volta possa entrare nella sezione critica. Il kernel offre delle buone
97 funzioni a questo scopo. E poi ci sono quelle meno buone, ma farò finta
100 Sincronizzazione nel kernel Linux
101 =================================
103 Se posso darvi un suggerimento: non dormite mai con qualcuno più pazzo di
104 voi. Ma se dovessi darvi un suggerimento sulla sincronizzazione:
105 **mantenetela semplice**.
107 Siate riluttanti nell'introduzione di nuovi *lock*.
109 Abbastanza strano, quest'ultimo è l'esatto opposto del mio suggerimento
110 su quando **avete** dormito con qualcuno più pazzo di voi. E dovreste
111 pensare a prendervi un cane bello grande.
113 I due principali tipi di *lock* nel kernel: spinlock e mutex
114 ------------------------------------------------------------
116 Ci sono due tipi principali di *lock* nel kernel. Il tipo fondamentale è lo
117 spinlock (``include/asm/spinlock.h``), un semplice *lock* che può essere
118 trattenuto solo da un processo: se non si può trattenere lo spinlock, allora
119 rimane in attesa attiva (in inglese *spinning*) finché non ci riesce.
120 Gli spinlock sono molto piccoli e rapidi, possono essere utilizzati ovunque.
122 Il secondo tipo è il mutex (``include/linux/mutex.h``): è come uno spinlock,
123 ma potreste bloccarvi trattenendolo. Se non potete trattenere un mutex
124 il vostro processo si auto-sospenderà; verrà riattivato quando il mutex
125 verrà rilasciato. Questo significa che il processore potrà occuparsi d'altro
126 mentre il vostro processo è in attesa. Esistono molti casi in cui non potete
127 permettervi di sospendere un processo (vedere
128 :ref:`Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni? <it_sleeping-things>`)
129 e quindi dovrete utilizzare gli spinlock.
131 Nessuno di questi *lock* è ricorsivo: vedere
132 :ref:`Stallo: semplice ed avanzato <it_deadlock>`
134 I *lock* e i kernel per sistemi monoprocessore
135 ----------------------------------------------
137 Per i kernel compilati senza ``CONFIG_SMP`` e senza ``CONFIG_PREEMPT``
138 gli spinlock non esistono. Questa è un'ottima scelta di progettazione:
139 quando nessun altro processo può essere eseguito in simultanea, allora
140 non c'è la necessità di avere un *lock*.
142 Se il kernel è compilato senza ``CONFIG_SMP`` ma con ``CONFIG_PREEMPT``,
143 allora gli spinlock disabilitano la prelazione; questo è sufficiente a
144 prevenire le corse critiche. Nella maggior parte dei casi, possiamo considerare
145 la prelazione equivalente ad un sistema multi-processore senza preoccuparci
146 di trattarla indipendentemente.
148 Dovreste verificare sempre la sincronizzazione con le opzioni ``CONFIG_SMP`` e
149 ``CONFIG_PREEMPT`` abilitate, anche quando non avete un sistema
150 multi-processore, questo vi permetterà di identificare alcuni problemi
153 Come vedremo di seguito, i mutex continuano ad esistere perché sono necessari
154 per la sincronizzazione fra processi in contesto utente.
156 Sincronizzazione in contesto utente
157 -----------------------------------
159 Se avete una struttura dati che verrà utilizzata solo dal contesto utente,
160 allora, per proteggerla, potete utilizzare un semplice mutex
161 (``include/linux/mutex.h``). Questo è il caso più semplice: inizializzate il
162 mutex; invocate :c:func:`mutex_lock_interruptible()` per trattenerlo e
163 :c:func:`mutex_unlock()` per rilasciarlo. C'è anche :c:func:`mutex_lock()`
164 ma questa dovrebbe essere evitata perché non ritorna in caso di segnali.
166 Per esempio: ``net/netfilter/nf_sockopt.c`` permette la registrazione
167 di nuove chiamate per :c:func:`setsockopt()` e :c:func:`getsockopt()`
168 usando la funzione :c:func:`nf_register_sockopt()`. La registrazione e
169 la rimozione vengono eseguite solamente quando il modulo viene caricato
170 o scaricato (e durante l'avvio del sistema, qui non abbiamo concorrenza),
171 e la lista delle funzioni registrate viene consultata solamente quando
172 :c:func:`setsockopt()` o :c:func:`getsockopt()` sono sconosciute al sistema.
173 In questo caso ``nf_sockopt_mutex`` è perfetto allo scopo, in particolar modo
174 visto che setsockopt e getsockopt potrebbero dormire.
176 Sincronizzazione fra il contesto utente e i softirq
177 ---------------------------------------------------
179 Se un softirq condivide dati col contesto utente, avete due problemi.
180 Primo, il contesto utente corrente potrebbe essere interroto da un softirq,
181 e secondo, la sezione critica potrebbe essere eseguita da un altro
182 processore. Questo è quando :c:func:`spin_lock_bh()`
183 (``include/linux/spinlock.h``) viene utilizzato. Questo disabilita i softirq
184 sul processore e trattiene il *lock*. Invece, :c:func:`spin_unlock_bh()` fa
185 l'opposto. (Il suffisso '_bh' è un residuo storico che fa riferimento al
186 "Bottom Halves", il vecchio nome delle interruzioni software. In un mondo
187 perfetto questa funzione si chiamerebbe 'spin_lock_softirq()').
189 Da notare che in questo caso potete utilizzare anche :c:func:`spin_lock_irq()`
190 o :c:func:`spin_lock_irqsave()`, queste fermano anche le interruzioni hardware:
191 vedere :ref:`Contesto di interruzione hardware <it_hardirq-context>`.
193 Questo funziona alla perfezione anche sui sistemi monoprocessore: gli spinlock
194 svaniscono e questa macro diventa semplicemente :c:func:`local_bh_disable()`
195 (``include/linux/interrupt.h``), la quale impedisce ai softirq d'essere
198 Sincronizzazione fra contesto utente e i tasklet
199 ------------------------------------------------
201 Questo caso è uguale al precedente, un tasklet viene eseguito da un softirq.
203 Sincronizzazione fra contesto utente e i timer
204 ----------------------------------------------
206 Anche questo caso è uguale al precedente, un timer viene eseguito da un
208 Dal punto di vista della sincronizzazione, tasklet e timer sono identici.
210 Sincronizzazione fra tasklet e timer
211 ------------------------------------
213 Qualche volta un tasklet od un timer potrebbero condividere i dati con
214 un altro tasklet o timer
216 Lo stesso tasklet/timer
217 ~~~~~~~~~~~~~~~~~~~~~~~
219 Dato che un tasklet non viene mai eseguito contemporaneamente su due
220 processori, non dovete preoccuparvi che sia rientrante (ovvero eseguito
221 più volte in contemporanea), perfino su sistemi multi-processore.
223 Differenti tasklet/timer
224 ~~~~~~~~~~~~~~~~~~~~~~~~
226 Se un altro tasklet/timer vuole condividere dati col vostro tasklet o timer,
227 allora avrete bisogno entrambe di :c:func:`spin_lock()` e
228 :c:func:`spin_unlock()`. Qui :c:func:`spin_lock_bh()` è inutile, siete già
229 in un tasklet ed avete la garanzia che nessun altro verrà eseguito sullo
232 Sincronizzazione fra softirq
233 ----------------------------
235 Spesso un softirq potrebbe condividere dati con se stesso o un tasklet/timer.
240 Lo stesso softirq può essere eseguito su un diverso processore: allo scopo
241 di migliorare le prestazioni potete utilizzare dati riservati ad ogni
242 processore (vedere :ref:`Dati per processore <it_per-cpu>`). Se siete arrivati
243 fino a questo punto nell'uso dei softirq, probabilmente tenete alla scalabilità
244 delle prestazioni abbastanza da giustificarne la complessità aggiuntiva.
246 Dovete utilizzare :c:func:`spin_lock()` e :c:func:`spin_unlock()` per
247 proteggere i dati condivisi.
252 Dovete utilizzare :c:func:`spin_lock()` e :c:func:`spin_unlock()` per
253 proteggere i dati condivisi, che siano timer, tasklet, diversi softirq o
254 lo stesso o altri softirq: uno qualsiasi di essi potrebbe essere in esecuzione
255 su un diverso processore.
257 .. _`it_hardirq-context`:
259 Contesto di interruzione hardware
260 =================================
262 Solitamente le interruzioni hardware comunicano con un tasklet o un softirq.
263 Spesso questo si traduce nel mettere in coda qualcosa da fare che verrà
264 preso in carico da un softirq.
266 Sincronizzazione fra interruzioni hardware e softirq/tasklet
267 ------------------------------------------------------------
269 Se un gestore di interruzioni hardware condivide dati con un softirq, allora
270 avrete due preoccupazioni. Primo, il softirq può essere interrotto da
271 un'interruzione hardware, e secondo, la sezione critica potrebbe essere
272 eseguita da un'interruzione hardware su un processore diverso. Questo è il caso
273 dove :c:func:`spin_lock_irq()` viene utilizzato. Disabilita le interruzioni
274 sul processore che l'esegue, poi trattiene il lock. :c:func:`spin_unlock_irq()`
277 Il gestore d'interruzione hardware non usa :c:func:`spin_lock_irq()` perché
278 i softirq non possono essere eseguiti quando il gestore d'interruzione hardware
279 è in esecuzione: per questo si può usare :c:func:`spin_lock()`, che è un po'
280 più veloce. L'unica eccezione è quando un altro gestore d'interruzioni
281 hardware utilizza lo stesso *lock*: :c:func:`spin_lock_irq()` impedirà a questo
282 secondo gestore di interrompere quello in esecuzione.
284 Questo funziona alla perfezione anche sui sistemi monoprocessore: gli spinlock
285 svaniscono e questa macro diventa semplicemente :c:func:`local_irq_disable()`
286 (``include/asm/smp.h``), la quale impedisce a softirq/tasklet/BH d'essere
289 :c:func:`spin_lock_irqsave()` (``include/linux/spinlock.h``) è una variante che
290 salva lo stato delle interruzioni in una variabile, questa verrà poi passata
291 a :c:func:`spin_unlock_irqrestore()`. Questo significa che lo stesso codice
292 potrà essere utilizzato in un'interruzione hardware (dove le interruzioni sono
293 già disabilitate) e in un softirq (dove la disabilitazione delle interruzioni
296 Da notare che i softirq (e quindi tasklet e timer) sono eseguiti al ritorno
297 da un'interruzione hardware, quindi :c:func:`spin_lock_irq()` interrompe
298 anche questi. Tenuto conto di questo si può dire che
299 :c:func:`spin_lock_irqsave()` è la funzione di sincronizzazione più generica
302 Sincronizzazione fra due gestori d'interruzioni hardware
303 --------------------------------------------------------
305 Condividere dati fra due gestori di interruzione hardware è molto raro, ma se
306 succede, dovreste usare :c:func:`spin_lock_irqsave()`: è una specificità
307 dell'architettura il fatto che tutte le interruzioni vengano interrotte
308 quando si eseguono di gestori di interruzioni.
310 Bigino della sincronizzazione
311 =============================
313 Pete Zaitcev ci offre il seguente riassunto:
315 - Se siete in un contesto utente (una qualsiasi chiamata di sistema)
316 e volete sincronizzarvi con altri processi, usate i mutex. Potete trattenere
317 il mutex e dormire (``copy_from_user*(`` o ``kmalloc(x,GFP_KERNEL)``).
319 - Altrimenti (== i dati possono essere manipolati da un'interruzione) usate
320 :c:func:`spin_lock_irqsave()` e :c:func:`spin_unlock_irqrestore()`.
322 - Evitate di trattenere uno spinlock per più di 5 righe di codice incluse
323 le chiamate a funzione (ad eccezione di quell per l'accesso come
326 Tabella dei requisiti minimi
327 ----------------------------
329 La tabella seguente illustra i requisiti **minimi** per la sincronizzazione fra
330 diversi contesti. In alcuni casi, lo stesso contesto può essere eseguito solo
331 da un processore per volta, quindi non ci sono requisiti per la
332 sincronizzazione (per esempio, un thread può essere eseguito solo su un
333 processore alla volta, ma se deve condividere dati con un altro thread, allora
334 la sincronizzazione è necessaria).
336 Ricordatevi il suggerimento qui sopra: potete sempre usare
337 :c:func:`spin_lock_irqsave()`, che è un sovrainsieme di tutte le altre funzioni
340 ============== ============= ============= ========= ========= ========= ========= ======= ======= ============== ==============
341 . IRQ Handler A IRQ Handler B Softirq A Softirq B Tasklet A Tasklet B Timer A Timer B User Context A User Context B
342 ============== ============= ============= ========= ========= ========= ========= ======= ======= ============== ==============
344 IRQ Handler B SLIS None
346 Softirq B SLI SLI SL SL
347 Tasklet A SLI SLI SL SL None
348 Tasklet B SLI SLI SL SL SL None
349 Timer A SLI SLI SL SL SL SL None
350 Timer B SLI SLI SL SL SL SL SL None
351 User Context A SLI SLI SLBH SLBH SLBH SLBH SLBH SLBH None
352 User Context B SLI SLI SLBH SLBH SLBH SLBH SLBH SLBH MLI None
353 ============== ============= ============= ========= ========= ========= ========= ======= ======= ============== ==============
355 Table: Tabella dei requisiti per la sincronizzazione
357 +--------+----------------------------+
358 | SLIS | spin_lock_irqsave |
359 +--------+----------------------------+
360 | SLI | spin_lock_irq |
361 +--------+----------------------------+
363 +--------+----------------------------+
364 | SLBH | spin_lock_bh |
365 +--------+----------------------------+
366 | MLI | mutex_lock_interruptible |
367 +--------+----------------------------+
369 Table: Legenda per la tabella dei requisiti per la sincronizzazione
371 Le funzioni *trylock*
372 =====================
374 Ci sono funzioni che provano a trattenere un *lock* solo una volta e
375 ritornano immediatamente comunicato il successo od il fallimento
376 dell'operazione. Posso essere usate quando non serve accedere ai dati
377 protetti dal *lock* quando qualche altro thread lo sta già facendo
378 trattenendo il *lock*. Potrete acquisire il *lock* più tardi se vi
379 serve accedere ai dati protetti da questo *lock*.
381 La funzione :c:func:`spin_trylock()` non ritenta di acquisire il *lock*,
382 se ci riesce al primo colpo ritorna un valore diverso da zero, altrimenti
383 se fallisce ritorna 0. Questa funzione può essere utilizzata in un qualunque
384 contesto, ma come :c:func:`spin_lock()`: dovete disabilitare i contesti che
385 potrebbero interrompervi e quindi trattenere lo spinlock.
387 La funzione :c:func:`mutex_trylock()` invece di sospendere il vostro processo
388 ritorna un valore diverso da zero se è possibile trattenere il lock al primo
389 colpo, altrimenti se fallisce ritorna 0. Nonostante non dorma, questa funzione
390 non può essere usata in modo sicuro in contesti di interruzione hardware o
396 Guardiamo un semplice esempio: una memoria che associa nomi a numeri.
397 La memoria tiene traccia di quanto spesso viene utilizzato ogni oggetto;
398 quando è piena, l'oggetto meno usato viene eliminato.
400 Tutto in contesto utente
401 ------------------------
403 Nel primo esempio, supponiamo che tutte le operazioni avvengano in contesto
404 utente (in soldoni, da una chiamata di sistema), quindi possiamo dormire.
405 Questo significa che possiamo usare i mutex per proteggere la nostra memoria
406 e tutti gli oggetti che contiene. Ecco il codice::
408 #include <linux/list.h>
409 #include <linux/slab.h>
410 #include <linux/string.h>
411 #include <linux/mutex.h>
412 #include <asm/errno.h>
416 struct list_head list;
422 /* Protects the cache, cache_num, and the objects within it */
423 static DEFINE_MUTEX(cache_lock);
424 static LIST_HEAD(cache);
425 static unsigned int cache_num = 0;
426 #define MAX_CACHE_SIZE 10
428 /* Must be holding cache_lock */
429 static struct object *__cache_find(int id)
433 list_for_each_entry(i, &cache, list)
441 /* Must be holding cache_lock */
442 static void __cache_delete(struct object *obj)
445 list_del(&obj->list);
450 /* Must be holding cache_lock */
451 static void __cache_add(struct object *obj)
453 list_add(&obj->list, &cache);
454 if (++cache_num > MAX_CACHE_SIZE) {
455 struct object *i, *outcast = NULL;
456 list_for_each_entry(i, &cache, list) {
457 if (!outcast || i->popularity < outcast->popularity)
460 __cache_delete(outcast);
464 int cache_add(int id, const char *name)
468 if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
471 strscpy(obj->name, name, sizeof(obj->name));
475 mutex_lock(&cache_lock);
477 mutex_unlock(&cache_lock);
481 void cache_delete(int id)
483 mutex_lock(&cache_lock);
484 __cache_delete(__cache_find(id));
485 mutex_unlock(&cache_lock);
488 int cache_find(int id, char *name)
493 mutex_lock(&cache_lock);
494 obj = __cache_find(id);
497 strcpy(name, obj->name);
499 mutex_unlock(&cache_lock);
503 Da notare che ci assicuriamo sempre di trattenere cache_lock quando
504 aggiungiamo, rimuoviamo od ispezioniamo la memoria: sia la struttura
505 della memoria che il suo contenuto sono protetti dal *lock*. Questo
506 caso è semplice dato che copiamo i dati dall'utente e non permettiamo
507 mai loro di accedere direttamente agli oggetti.
509 C'è una piccola ottimizzazione qui: nella funzione :c:func:`cache_add()`
510 impostiamo i campi dell'oggetto prima di acquisire il *lock*. Questo è
511 sicuro perché nessun altro potrà accedervi finché non lo inseriremo
514 Accesso dal contesto utente
515 ---------------------------
517 Ora consideriamo il caso in cui :c:func:`cache_find()` può essere invocata
518 dal contesto d'interruzione: sia hardware che software. Un esempio potrebbe
519 essere un timer che elimina oggetti dalla memoria.
521 Qui di seguito troverete la modifica nel formato *patch*: le righe ``-``
522 sono quelle rimosse, mentre quelle ``+`` sono quelle aggiunte.
526 --- cache.c.usercontext 2003-12-09 13:58:54.000000000 +1100
527 +++ cache.c.interrupt 2003-12-09 14:07:49.000000000 +1100
532 -static DEFINE_MUTEX(cache_lock);
533 +static DEFINE_SPINLOCK(cache_lock);
534 static LIST_HEAD(cache);
535 static unsigned int cache_num = 0;
536 #define MAX_CACHE_SIZE 10
538 int cache_add(int id, const char *name)
541 + unsigned long flags;
543 if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
549 - mutex_lock(&cache_lock);
550 + spin_lock_irqsave(&cache_lock, flags);
552 - mutex_unlock(&cache_lock);
553 + spin_unlock_irqrestore(&cache_lock, flags);
557 void cache_delete(int id)
559 - mutex_lock(&cache_lock);
560 + unsigned long flags;
562 + spin_lock_irqsave(&cache_lock, flags);
563 __cache_delete(__cache_find(id));
564 - mutex_unlock(&cache_lock);
565 + spin_unlock_irqrestore(&cache_lock, flags);
568 int cache_find(int id, char *name)
572 + unsigned long flags;
574 - mutex_lock(&cache_lock);
575 + spin_lock_irqsave(&cache_lock, flags);
576 obj = __cache_find(id);
579 strcpy(name, obj->name);
581 - mutex_unlock(&cache_lock);
582 + spin_unlock_irqrestore(&cache_lock, flags);
586 Da notare che :c:func:`spin_lock_irqsave()` disabiliterà le interruzioni
587 se erano attive, altrimenti non farà niente (quando siamo già in un contesto
588 d'interruzione); dunque queste funzioni possono essere chiamante in
589 sicurezza da qualsiasi contesto.
591 Sfortunatamente, :c:func:`cache_add()` invoca :c:func:`kmalloc()` con
592 l'opzione ``GFP_KERNEL`` che è permessa solo in contesto utente. Ho supposto
593 che :c:func:`cache_add()` venga chiamata dal contesto utente, altrimenti
594 questa opzione deve diventare un parametro di :c:func:`cache_add()`.
596 Esporre gli oggetti al di fuori del file
597 ----------------------------------------
599 Se i vostri oggetti contengono più informazioni, potrebbe non essere
600 sufficiente copiare i dati avanti e indietro: per esempio, altre parti del
601 codice potrebbero avere un puntatore a questi oggetti piuttosto che cercarli
602 ogni volta. Questo introduce due problemi.
604 Il primo problema è che utilizziamo ``cache_lock`` per proteggere gli oggetti:
605 dobbiamo renderlo dinamico così che il resto del codice possa usarlo. Questo
606 rende la sincronizzazione più complicata dato che non avviene più in un unico
609 Il secondo problema è il problema del ciclo di vita: se un'altra struttura
610 mantiene un puntatore ad un oggetto, presumibilmente si aspetta che questo
611 puntatore rimanga valido. Sfortunatamente, questo è garantito solo mentre
612 si trattiene il *lock*, altrimenti qualcuno potrebbe chiamare
613 :c:func:`cache_delete()` o peggio, aggiungere un oggetto che riutilizza lo
616 Dato che c'è un solo *lock*, non potete trattenerlo a vita: altrimenti
617 nessun altro potrà eseguire il proprio lavoro.
619 La soluzione a questo problema è l'uso di un contatore di riferimenti:
620 chiunque punti ad un oggetto deve incrementare il contatore, e decrementarlo
621 quando il puntatore non viene più usato. Quando il contatore raggiunge lo zero
622 significa che non è più usato e l'oggetto può essere rimosso.
626 --- cache.c.interrupt 2003-12-09 14:25:43.000000000 +1100
627 +++ cache.c.refcnt 2003-12-09 14:33:05.000000000 +1100
631 struct list_head list;
632 + unsigned int refcnt;
637 static unsigned int cache_num = 0;
638 #define MAX_CACHE_SIZE 10
640 +static void __object_put(struct object *obj)
642 + if (--obj->refcnt == 0)
646 +static void __object_get(struct object *obj)
651 +void object_put(struct object *obj)
653 + unsigned long flags;
655 + spin_lock_irqsave(&cache_lock, flags);
657 + spin_unlock_irqrestore(&cache_lock, flags);
660 +void object_get(struct object *obj)
662 + unsigned long flags;
664 + spin_lock_irqsave(&cache_lock, flags);
666 + spin_unlock_irqrestore(&cache_lock, flags);
669 /* Must be holding cache_lock */
670 static struct object *__cache_find(int id)
675 list_del(&obj->list);
681 strscpy(obj->name, name, sizeof(obj->name));
684 + obj->refcnt = 1; /* The cache holds a reference */
686 spin_lock_irqsave(&cache_lock, flags);
689 spin_unlock_irqrestore(&cache_lock, flags);
692 -int cache_find(int id, char *name)
693 +struct object *cache_find(int id)
699 spin_lock_irqsave(&cache_lock, flags);
700 obj = __cache_find(id);
703 - strcpy(name, obj->name);
707 spin_unlock_irqrestore(&cache_lock, flags);
712 Abbiamo incapsulato il contatore di riferimenti nelle tipiche funzioni
713 di 'get' e 'put'. Ora possiamo ritornare l'oggetto da :c:func:`cache_find()`
714 col vantaggio che l'utente può dormire trattenendo l'oggetto (per esempio,
715 :c:func:`copy_to_user()` per copiare il nome verso lo spazio utente).
717 Un altro punto da notare è che ho detto che il contatore dovrebbe incrementarsi
718 per ogni puntatore ad un oggetto: quindi il contatore di riferimenti è 1
719 quando l'oggetto viene inserito nella memoria. In altre versione il framework
720 non trattiene un riferimento per se, ma diventa più complicato.
722 Usare operazioni atomiche per il contatore di riferimenti
723 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
725 In sostanza, :c:type:`atomic_t` viene usato come contatore di riferimenti.
726 Ci sono un certo numbero di operazioni atomiche definite
727 in ``include/asm/atomic.h``: queste sono garantite come atomiche su qualsiasi
728 processore del sistema, quindi non sono necessari i *lock*. In questo caso è
729 più semplice rispetto all'uso degli spinlock, benché l'uso degli spinlock
730 sia più elegante per casi non banali. Le funzioni :c:func:`atomic_inc()` e
731 :c:func:`atomic_dec_and_test()` vengono usate al posto dei tipici operatori di
732 incremento e decremento, e i *lock* non sono più necessari per proteggere il
737 --- cache.c.refcnt 2003-12-09 15:00:35.000000000 +1100
738 +++ cache.c.refcnt-atomic 2003-12-11 15:49:42.000000000 +1100
742 struct list_head list;
743 - unsigned int refcnt;
749 static unsigned int cache_num = 0;
750 #define MAX_CACHE_SIZE 10
752 -static void __object_put(struct object *obj)
754 - if (--obj->refcnt == 0)
758 -static void __object_get(struct object *obj)
763 void object_put(struct object *obj)
765 - unsigned long flags;
767 - spin_lock_irqsave(&cache_lock, flags);
769 - spin_unlock_irqrestore(&cache_lock, flags);
770 + if (atomic_dec_and_test(&obj->refcnt))
774 void object_get(struct object *obj)
776 - unsigned long flags;
778 - spin_lock_irqsave(&cache_lock, flags);
780 - spin_unlock_irqrestore(&cache_lock, flags);
781 + atomic_inc(&obj->refcnt);
784 /* Must be holding cache_lock */
788 list_del(&obj->list);
795 strscpy(obj->name, name, sizeof(obj->name));
798 - obj->refcnt = 1; /* The cache holds a reference */
799 + atomic_set(&obj->refcnt, 1); /* The cache holds a reference */
801 spin_lock_irqsave(&cache_lock, flags);
804 spin_lock_irqsave(&cache_lock, flags);
805 obj = __cache_find(id);
809 spin_unlock_irqrestore(&cache_lock, flags);
813 Proteggere l'oggetto stesso
814 ---------------------------
816 In questo esempio, assumiamo che gli oggetti (ad eccezione del contatore
817 di riferimenti) non cambino mai dopo la loro creazione. Se vogliamo permettere
818 al nome di cambiare abbiamo tre possibilità:
820 - Si può togliere static da ``cache_lock`` e dire agli utenti che devono
821 trattenere il *lock* prima di modificare il nome di un oggetto.
823 - Si può fornire una funzione :c:func:`cache_obj_rename()` che prende il
824 *lock* e cambia il nome per conto del chiamante; si dirà poi agli utenti
825 di usare questa funzione.
827 - Si può decidere che ``cache_lock`` protegge solo la memoria stessa, ed
828 un altro *lock* è necessario per la protezione del nome.
830 Teoricamente, possiamo avere un *lock* per ogni campo e per ogni oggetto.
831 In pratica, le varianti più comuni sono:
833 - un *lock* che protegge l'infrastruttura (la lista ``cache`` di questo
834 esempio) e gli oggetti. Questo è quello che abbiamo fatto finora.
836 - un *lock* che protegge l'infrastruttura (inclusi i puntatori alla lista
837 negli oggetti), e un *lock* nell'oggetto per proteggere il resto
840 - *lock* multipli per proteggere l'infrastruttura (per esempio un *lock*
841 per ogni lista), possibilmente con un *lock* per oggetto.
843 Qui di seguito un'implementazione con "un lock per oggetto":
847 --- cache.c.refcnt-atomic 2003-12-11 15:50:54.000000000 +1100
848 +++ cache.c.perobjectlock 2003-12-11 17:15:03.000000000 +1100
853 + /* These two protected by cache_lock. */
854 struct list_head list;
859 + /* Doesn't change once created. */
862 + spinlock_t lock; /* Protects the name */
867 static DEFINE_SPINLOCK(cache_lock);
871 atomic_set(&obj->refcnt, 1); /* The cache holds a reference */
872 + spin_lock_init(&obj->lock);
874 spin_lock_irqsave(&cache_lock, flags);
877 Da notare che ho deciso che il contatore di popolarità dovesse essere
878 protetto da ``cache_lock`` piuttosto che dal *lock* dell'oggetto; questo
879 perché è logicamente parte dell'infrastruttura (come
880 :c:type:`struct list_head <list_head>` nell'oggetto). In questo modo,
881 in :c:func:`__cache_add()`, non ho bisogno di trattenere il *lock* di ogni
882 oggetto mentre si cerca il meno popolare.
884 Ho anche deciso che il campo id è immutabile, quindi non ho bisogno di
885 trattenere il lock dell'oggetto quando si usa :c:func:`__cache_find()`
886 per leggere questo campo; il *lock* dell'oggetto è usato solo dal chiamante
887 che vuole leggere o scrivere il campo name.
889 Inoltre, da notare che ho aggiunto un commento che descrive i dati che sono
890 protetti dal *lock*. Questo è estremamente importante in quanto descrive il
891 comportamento del codice, che altrimenti sarebbe di difficile comprensione
892 leggendo solamente il codice. E come dice Alan Cox: “Lock data, not code”.
899 Stallo: semplice ed avanzato
900 ----------------------------
902 Esiste un tipo di baco dove un pezzo di codice tenta di trattenere uno
903 spinlock due volte: questo rimarrà in attesa attiva per sempre aspettando che
904 il *lock* venga rilasciato (in Linux spinlocks, rwlocks e mutex non sono
906 Questo è facile da diagnosticare: non è uno di quei problemi che ti tengono
907 sveglio 5 notti a parlare da solo.
909 Un caso un pochino più complesso; immaginate d'avere una spazio condiviso
910 fra un softirq ed il contesto utente. Se usate :c:func:`spin_lock()` per
911 proteggerlo, il contesto utente potrebbe essere interrotto da un softirq
912 mentre trattiene il lock, da qui il softirq rimarrà in attesa attiva provando
913 ad acquisire il *lock* già trattenuto nel contesto utente.
915 Questi casi sono chiamati stalli (*deadlock*), e come mostrato qui sopra,
916 può succedere anche con un solo processore (Ma non sui sistemi
917 monoprocessore perché gli spinlock spariscano quando il kernel è compilato
918 con ``CONFIG_SMP``\ =n. Nonostante ciò, nel secondo caso avrete comunque
919 una corruzione dei dati).
921 Questi casi sono facili da diagnosticare; sui sistemi multi-processore
922 il supervisione (*watchdog*) o l'opzione di compilazione ``DEBUG_SPINLOCK``
923 (``include/linux/spinlock.h``) permettono di scovare immediatamente quando
926 Esiste un caso più complesso che è conosciuto come l'abbraccio della morte;
927 questo coinvolge due o più *lock*. Diciamo che avete un vettore di hash in cui
928 ogni elemento è uno spinlock a cui è associata una lista di elementi con lo
929 stesso hash. In un gestore di interruzioni software, dovete modificare un
930 oggetto e spostarlo su un altro hash; quindi dovrete trattenete lo spinlock
931 del vecchio hash e di quello nuovo, quindi rimuovere l'oggetto dal vecchio ed
934 Qui abbiamo due problemi. Primo, se il vostro codice prova a spostare un
935 oggetto all'interno della stessa lista, otterrete uno stallo visto che
936 tenterà di trattenere lo stesso *lock* due volte. Secondo, se la stessa
937 interruzione software su un altro processore sta tentando di spostare
938 un altro oggetto nella direzione opposta, potrebbe accadere quanto segue:
940 +---------------------------------+---------------------------------+
942 +=================================+=================================+
943 | Trattiene *lock* A -> OK | Trattiene *lock* B -> OK |
944 +---------------------------------+---------------------------------+
945 | Trattiene *lock* B -> attesa | Trattiene *lock* A -> attesa |
946 +---------------------------------+---------------------------------+
950 Entrambe i processori rimarranno in attesa attiva sul *lock* per sempre,
951 aspettando che l'altro lo rilasci. Sembra e puzza come un blocco totale.
956 I libri di testo vi diranno che se trattenete i *lock* sempre nello stesso
957 ordine non avrete mai un simile stallo. La pratica vi dirà che questo
958 approccio non funziona all'ingrandirsi del sistema: quando creo un nuovo
959 *lock* non ne capisco abbastanza del kernel per dire in quale dei 5000 *lock*
962 I *lock* migliori sono quelli incapsulati: non vengono esposti nei file di
963 intestazione, e non vengono mai trattenuti fuori dallo stesso file. Potete
964 rileggere questo codice e vedere che non ci sarà mai uno stallo perché
965 non tenterà mai di trattenere un altro *lock* quando lo ha già.
966 Le persone che usano il vostro codice non devono nemmeno sapere che voi
967 state usando dei *lock*.
969 Un classico problema deriva dall'uso di *callback* e di *hook*: se li
970 chiamate mentre trattenete un *lock*, rischiate uno stallo o un abbraccio
971 della morte (chi lo sa cosa farà una *callback*?).
973 Ossessiva prevenzione degli stalli
974 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
976 Gli stalli sono un problema, ma non così terribile come la corruzione dei dati.
977 Un pezzo di codice trattiene un *lock* di lettura, cerca in una lista,
978 fallisce nel trovare quello che vuole, quindi rilascia il *lock* di lettura,
979 trattiene un *lock* di scrittura ed inserisce un oggetto; questo genere di
980 codice presenta una corsa critica.
982 Se non riuscite a capire il perché, per favore state alla larga dal mio
985 corsa fra temporizzatori: un passatempo del kernel
986 --------------------------------------------------
988 I temporizzatori potrebbero avere dei problemi con le corse critiche.
989 Considerate una collezione di oggetti (liste, hash, eccetera) dove ogni oggetto
990 ha un temporizzatore che sta per distruggerlo.
992 Se volete eliminare l'intera collezione (diciamo quando rimuovete un modulo),
993 potreste fare come segue::
995 /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
996 HUNGARIAN NOTATION */
997 spin_lock_bh(&list_lock);
1000 struct foo *next = list->next;
1001 del_timer(&list->timer);
1006 spin_unlock_bh(&list_lock);
1008 Primo o poi, questo esploderà su un sistema multiprocessore perché un
1009 temporizzatore potrebbe essere già partiro prima di :c:func:`spin_lock_bh()`,
1010 e prenderà il *lock* solo dopo :c:func:`spin_unlock_bh()`, e cercherà
1011 di eliminare il suo oggetto (che però è già stato eliminato).
1013 Questo può essere evitato controllando il valore di ritorno di
1014 :c:func:`del_timer()`: se ritorna 1, il temporizzatore è stato già
1015 rimosso. Se 0, significa (in questo caso) che il temporizzatore è in
1016 esecuzione, quindi possiamo fare come segue::
1019 spin_lock_bh(&list_lock);
1022 struct foo *next = list->next;
1023 if (!del_timer(&list->timer)) {
1024 /* Give timer a chance to delete this */
1025 spin_unlock_bh(&list_lock);
1032 spin_unlock_bh(&list_lock);
1034 Un altro problema è l'eliminazione dei temporizzatori che si riavviano
1035 da soli (chiamando :c:func:`add_timer()` alla fine della loro esecuzione).
1036 Dato che questo è un problema abbastanza comune con una propensione
1037 alle corse critiche, dovreste usare :c:func:`del_timer_sync()`
1038 (``include/linux/timer.h``) per gestire questo caso. Questa ritorna il
1039 numero di volte che il temporizzatore è stato interrotto prima che
1040 fosse in grado di fermarlo senza che si riavviasse.
1042 Velocità della sincronizzazione
1043 ===============================
1045 Ci sono tre cose importanti da tenere in considerazione quando si valuta
1046 la velocità d'esecuzione di un pezzo di codice che necessita di
1047 sincronizzazione. La prima è la concorrenza: quante cose rimangono in attesa
1048 mentre qualcuno trattiene un *lock*. La seconda è il tempo necessario per
1049 acquisire (senza contese) e rilasciare un *lock*. La terza è di usare meno
1050 *lock* o di più furbi. Immagino che i *lock* vengano usati regolarmente,
1051 altrimenti, non sareste interessati all'efficienza.
1053 La concorrenza dipende da quanto a lungo un *lock* è trattenuto: dovreste
1054 trattenere un *lock* solo il tempo minimo necessario ma non un istante in più.
1055 Nella memoria dell'esempio precedente, creiamo gli oggetti senza trattenere
1056 il *lock*, poi acquisiamo il *lock* quando siamo pronti per inserirlo nella
1059 Il tempo di acquisizione di un *lock* dipende da quanto danno fa
1060 l'operazione sulla *pipeline* (ovvero stalli della *pipeline*) e quant'è
1061 probabile che il processore corrente sia stato anche l'ultimo ad acquisire
1062 il *lock* (in pratica, il *lock* è nella memoria cache del processore
1063 corrente?): su sistemi multi-processore questa probabilità precipita
1064 rapidamente. Consideriamo un processore Intel Pentium III a 700Mhz: questo
1065 esegue un'istruzione in 0.7ns, un incremento atomico richiede 58ns, acquisire
1066 un *lock* che è nella memoria cache del processore richiede 160ns, e un
1067 trasferimento dalla memoria cache di un altro processore richiede altri
1068 170/360ns (Leggetevi l'articolo di Paul McKenney's `Linux Journal RCU
1069 article <http://www.linuxjournal.com/article.php?sid=6993>`__).
1071 Questi due obiettivi sono in conflitto: trattenere un *lock* per il minor
1072 tempo possibile potrebbe richiedere la divisione in più *lock* per diverse
1073 parti (come nel nostro ultimo esempio con un *lock* per ogni oggetto),
1074 ma questo aumenta il numero di acquisizioni di *lock*, ed il risultato
1075 spesso è che tutto è più lento che con un singolo *lock*. Questo è un altro
1076 argomento in favore della semplicità quando si parla di sincronizzazione.
1078 Il terzo punto è discusso di seguito: ci sono alcune tecniche per ridurre
1079 il numero di sincronizzazioni che devono essere fatte.
1081 Read/Write Lock Variants
1082 ------------------------
1084 Sia gli spinlock che i mutex hanno una variante per la lettura/scrittura
1085 (read/write): ``rwlock_t`` e :c:type:`struct rw_semaphore <rw_semaphore>`.
1086 Queste dividono gli utenti in due categorie: i lettori e gli scrittori.
1087 Se state solo leggendo i dati, potete acquisire il *lock* di lettura, ma
1088 per scrivere avrete bisogno del *lock* di scrittura. Molti possono trattenere
1089 il *lock* di lettura, ma solo uno scrittore alla volta può trattenere
1090 quello di scrittura.
1092 Se il vostro codice si divide chiaramente in codice per lettori e codice
1093 per scrittori (come nel nostro esempio), e il *lock* dei lettori viene
1094 trattenuto per molto tempo, allora l'uso di questo tipo di *lock* può aiutare.
1095 Questi sono leggermente più lenti rispetto alla loro versione normale, quindi
1096 nella pratica l'uso di ``rwlock_t`` non ne vale la pena.
1098 Evitare i *lock*: Read Copy Update
1099 --------------------------------------------
1101 Esiste un metodo di sincronizzazione per letture e scritture detto
1102 Read Copy Update. Con l'uso della tecnica RCU, i lettori possono scordarsi
1103 completamente di trattenere i *lock*; dato che nel nostro esempio ci
1104 aspettiamo d'avere più lettore che scrittori (altrimenti questa memoria
1105 sarebbe uno spreco) possiamo dire che questo meccanismo permette
1108 Come facciamo a sbarazzarci dei *lock* di lettura? Sbarazzarsi dei *lock* di
1109 lettura significa che uno scrittore potrebbe cambiare la lista sotto al naso
1110 dei lettori. Questo è abbastanza semplice: possiamo leggere una lista
1111 concatenata se lo scrittore aggiunge elementi alla fine e con certe
1112 precauzioni. Per esempio, aggiungendo ``new`` ad una lista concatenata
1115 new->next = list->next;
1119 La funzione :c:func:`wmb()` è una barriera di sincronizzazione delle
1120 scritture. Questa garantisce che la prima operazione (impostare l'elemento
1121 ``next`` del nuovo elemento) venga completata e vista da tutti i processori
1122 prima che venga eseguita la seconda operazione (che sarebbe quella di mettere
1123 il nuovo elemento nella lista). Questo è importante perché i moderni
1124 compilatori ed i moderni processori possono, entrambe, riordinare le istruzioni
1125 se non vengono istruiti altrimenti: vogliamo che i lettori non vedano
1126 completamente il nuovo elemento; oppure che lo vedano correttamente e quindi
1127 il puntatore ``next`` deve puntare al resto della lista.
1129 Fortunatamente, c'è una funzione che fa questa operazione sulle liste
1130 :c:type:`struct list_head <list_head>`: :c:func:`list_add_rcu()`
1131 (``include/linux/list.h``).
1133 Rimuovere un elemento dalla lista è anche più facile: sostituiamo il puntatore
1134 al vecchio elemento con quello del suo successore, e i lettori vedranno
1135 l'elemento o lo salteranno.
1139 list->next = old->next;
1141 La funzione :c:func:`list_del_rcu()` (``include/linux/list.h``) fa esattamente
1142 questo (la versione normale corrompe il vecchio oggetto, e non vogliamo che
1145 Anche i lettori devono stare attenti: alcuni processori potrebbero leggere
1146 attraverso il puntatore ``next`` il contenuto dell'elemento successivo
1147 troppo presto, ma non accorgersi che il contenuto caricato è sbagliato quando
1148 il puntatore ``next`` viene modificato alla loro spalle. Ancora una volta
1149 c'è una funzione che viene in vostro aiuto :c:func:`list_for_each_entry_rcu()`
1150 (``include/linux/list.h``). Ovviamente, gli scrittori possono usare
1151 :c:func:`list_for_each_entry()` dato che non ci possono essere due scrittori
1154 Il nostro ultimo dilemma è il seguente: quando possiamo realmente distruggere
1155 l'elemento rimosso? Ricordate, un lettore potrebbe aver avuto accesso a questo
1156 elemento proprio ora: se eliminiamo questo elemento ed il puntatore ``next``
1157 cambia, il lettore salterà direttamente nella spazzatura e scoppierà. Dobbiamo
1158 aspettare finché tutti i lettori che stanno attraversando la lista abbiano
1159 finito. Utilizziamo :c:func:`call_rcu()` per registrare una funzione di
1160 richiamo che distrugga l'oggetto quando tutti i lettori correnti hanno
1161 terminato. In alternative, potrebbe essere usata la funzione
1162 :c:func:`synchronize_rcu()` che blocca l'esecuzione finché tutti i lettori
1163 non terminano di ispezionare la lista.
1165 Ma come fa l'RCU a sapere quando i lettori sono finiti? Il meccanismo è
1166 il seguente: innanzi tutto i lettori accedono alla lista solo fra la coppia
1167 :c:func:`rcu_read_lock()`/:c:func:`rcu_read_unlock()` che disabilita la
1168 prelazione così che i lettori non vengano sospesi mentre stanno leggendo
1171 Poi, l'RCU aspetta finché tutti i processori non abbiano dormito almeno
1172 una volta; a questo punto, dato che i lettori non possono dormire, possiamo
1173 dedurre che un qualsiasi lettore che abbia consultato la lista durante la
1174 rimozione abbia già terminato, quindi la *callback* viene eseguita. Il vero
1175 codice RCU è un po' più ottimizzato di così, ma questa è l'idea di fondo.
1179 --- cache.c.perobjectlock 2003-12-11 17:15:03.000000000 +1100
1180 +++ cache.c.rcupdate 2003-12-11 17:55:14.000000000 +1100
1182 #include <linux/list.h>
1183 #include <linux/slab.h>
1184 #include <linux/string.h>
1185 +#include <linux/rcupdate.h>
1186 #include <linux/mutex.h>
1187 #include <asm/errno.h>
1191 - /* These two protected by cache_lock. */
1192 + /* This is protected by RCU */
1193 struct list_head list;
1196 + struct rcu_head rcu;
1200 /* Doesn't change once created. */
1205 - list_for_each_entry(i, &cache, list) {
1206 + list_for_each_entry_rcu(i, &cache, list) {
1214 +/* Final discard done once we know no readers are looking. */
1215 +static void cache_delete_rcu(void *arg)
1220 /* Must be holding cache_lock */
1221 static void __cache_delete(struct object *obj)
1224 - list_del(&obj->list);
1226 + list_del_rcu(&obj->list);
1228 + call_rcu(&obj->rcu, cache_delete_rcu);
1231 /* Must be holding cache_lock */
1232 static void __cache_add(struct object *obj)
1234 - list_add(&obj->list, &cache);
1235 + list_add_rcu(&obj->list, &cache);
1236 if (++cache_num > MAX_CACHE_SIZE) {
1237 struct object *i, *outcast = NULL;
1238 list_for_each_entry(i, &cache, list) {
1239 @@ -104,12 +114,11 @@
1240 struct object *cache_find(int id)
1243 - unsigned long flags;
1245 - spin_lock_irqsave(&cache_lock, flags);
1247 obj = __cache_find(id);
1250 - spin_unlock_irqrestore(&cache_lock, flags);
1251 + rcu_read_unlock();
1255 Da notare che i lettori modificano il campo popularity nella funzione
1256 :c:func:`__cache_find()`, e ora non trattiene alcun *lock*. Una soluzione
1257 potrebbe essere quella di rendere la variabile ``atomic_t``, ma per l'uso
1258 che ne abbiamo fatto qui, non ci interessano queste corse critiche perché un
1259 risultato approssimativo è comunque accettabile, quindi non l'ho cambiato.
1261 Il risultato è che la funzione :c:func:`cache_find()` non ha bisogno di alcuna
1262 sincronizzazione con le altre funzioni, quindi è veloce su un sistema
1263 multi-processore tanto quanto lo sarebbe su un sistema mono-processore.
1265 Esiste un'ulteriore ottimizzazione possibile: vi ricordate il codice originale
1266 della nostra memoria dove non c'erano contatori di riferimenti e il chiamante
1267 semplicemente tratteneva il *lock* prima di accedere ad un oggetto? Questo è
1268 ancora possibile: se trattenete un *lock* nessuno potrà cancellare l'oggetto,
1269 quindi non avete bisogno di incrementare e decrementare il contatore di
1272 Ora, dato che il '*lock* di lettura' di un RCU non fa altro che disabilitare
1273 la prelazione, un chiamante che ha sempre la prelazione disabilitata fra le
1274 chiamate :c:func:`cache_find()` e :c:func:`object_put()` non necessita
1275 di incrementare e decrementare il contatore di riferimenti. Potremmo
1276 esporre la funzione :c:func:`__cache_find()` dichiarandola non-static,
1277 e quel chiamante potrebbe usare direttamente questa funzione.
1279 Il beneficio qui sta nel fatto che il contatore di riferimenti no
1280 viene scritto: l'oggetto non viene alterato in alcun modo e quindi diventa
1281 molto più veloce su sistemi molti-processore grazie alla loro memoria cache.
1288 Un'altra tecnica comunemente usata per evitare la sincronizzazione è quella
1289 di duplicare le informazioni per ogni processore. Per esempio, se volete
1290 avere un contatore di qualcosa, potreste utilizzare uno spinlock ed un
1291 singolo contatore. Facile e pulito.
1293 Se questo dovesse essere troppo lento (solitamente non lo è, ma se avete
1294 dimostrato che lo è devvero), potreste usare un contatore per ogni processore
1295 e quindi non sarebbe più necessaria la mutua esclusione. Vedere
1296 :c:func:`DEFINE_PER_CPU()`, :c:func:`get_cpu_var()` e :c:func:`put_cpu_var()`
1297 (``include/linux/percpu.h``).
1299 Il tipo di dato ``local_t``, la funzione :c:func:`cpu_local_inc()` e tutte
1300 le altre funzioni associate, sono di particolare utilità per semplici contatori
1301 per-processore; su alcune architetture sono anche più efficienti
1302 (``include/asm/local.h``).
1304 Da notare che non esiste un modo facile ed affidabile per ottenere il valore
1305 di un simile contatore senza introdurre altri *lock*. In alcuni casi questo
1308 Dati che sono usati prevalentemente dai gestori d'interruzioni
1309 --------------------------------------------------------------
1311 Se i dati vengono utilizzati sempre dallo stesso gestore d'interruzioni,
1312 allora i *lock* non vi servono per niente: il kernel già vi garantisce che
1313 il gestore d'interruzione non verrà eseguito in contemporanea su diversi
1316 Manfred Spraul fa notare che potreste comunque comportarvi così anche
1317 se i dati vengono occasionalmente utilizzati da un contesto utente o
1318 da un'interruzione software. Il gestore d'interruzione non utilizza alcun
1319 *lock*, e tutti gli altri accessi verranno fatti così::
1327 La funzione :c:func:`disable_irq()` impedisce al gestore d'interruzioni
1328 d'essere eseguito (e aspetta che finisca nel caso fosse in esecuzione su
1329 un altro processore). Lo spinlock, invece, previene accessi simultanei.
1330 Naturalmente, questo è più lento della semplice chiamata
1331 :c:func:`spin_lock_irq()`, quindi ha senso solo se questo genere di accesso
1332 è estremamente raro.
1334 .. _`it_sleeping-things`:
1336 Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni?
1337 =========================================================================
1339 Molte funzioni del kernel dormono (in sostanza, chiamano ``schedule()``)
1340 direttamente od indirettamente: non potete chiamarle se trattenere uno
1341 spinlock o avete la prelazione disabilitata, mai. Questo significa che
1342 dovete necessariamente essere nel contesto utente: chiamarle da un
1343 contesto d'interruzione è illegale.
1345 Alcune funzioni che dormono
1346 ---------------------------
1348 Le più comuni sono elencate qui di seguito, ma solitamente dovete leggere
1349 il codice per scoprire se altre chiamate sono sicure. Se chiunque altro
1350 le chiami dorme, allora dovreste poter dormire anche voi. In particolar
1351 modo, le funzioni di registrazione e deregistrazione solitamente si
1352 aspettano d'essere chiamante da un contesto utente e quindi che possono
1355 - Accessi allo spazio utente:
1357 - :c:func:`copy_from_user()`
1359 - :c:func:`copy_to_user()`
1361 - :c:func:`get_user()`
1363 - :c:func:`put_user()`
1365 - :c:func:`kmalloc(GFP_KERNEL) <kmalloc>`
1367 - :c:func:`mutex_lock_interruptible()` and
1368 :c:func:`mutex_lock()`
1370 C'è anche :c:func:`mutex_trylock()` che però non dorme.
1371 Comunque, non deve essere usata in un contesto d'interruzione dato
1372 che la sua implementazione non è sicura in quel contesto.
1373 Anche :c:func:`mutex_unlock()` non dorme mai. Non può comunque essere
1374 usata in un contesto d'interruzione perché un mutex deve essere rilasciato
1375 dallo stesso processo che l'ha acquisito.
1377 Alcune funzioni che non dormono
1378 -------------------------------
1380 Alcune funzioni possono essere chiamate tranquillamente da qualsiasi
1381 contesto, o trattenendo un qualsiasi *lock*.
1383 - :c:func:`printk()`
1387 - :c:func:`add_timer()` e :c:func:`del_timer()`
1389 Riferimento per l'API dei Mutex
1390 ===============================
1392 .. kernel-doc:: include/linux/mutex.h
1395 .. kernel-doc:: kernel/locking/mutex.c
1398 Riferimento per l'API dei Futex
1399 ===============================
1401 .. kernel-doc:: kernel/futex.c
1407 - ``Documentation/locking/spinlocks.rst``: la guida di Linus Torvalds agli
1408 spinlock del kernel.
1410 - Unix Systems for Modern Architectures: Symmetric Multiprocessing and
1411 Caching for Kernel Programmers.
1413 L'introduzione alla sincronizzazione a livello di kernel di Curt Schimmel
1414 è davvero ottima (non è scritta per Linux, ma approssimativamente si adatta
1415 a tutte le situazioni). Il libro è costoso, ma vale ogni singolo spicciolo
1416 per capire la sincronizzazione nei sistemi multi-processore.
1422 Grazie a Telsa Gwynne per aver formattato questa guida in DocBook, averla
1423 pulita e aggiunto un po' di stile.
1425 Grazie a Martin Pool, Philipp Rumpf, Stephen Rothwell, Paul Mackerras,
1426 Ruedi Aschwanden, Alan Cox, Manfred Spraul, Tim Waugh, Pete Zaitcev,
1427 James Morris, Robert Love, Paul McKenney, John Ashby per aver revisionato,
1428 corretto, maledetto e commentato.
1430 Grazie alla congrega per non aver avuto alcuna influenza su questo documento.
1436 Prima del kernel 2.5, o quando ``CONFIG_PREEMPT`` non è impostato, i processi
1437 in contesto utente non si avvicendano nell'esecuzione (in pratica, il
1438 processo userà il processore fino al proprio termine, a meno che non ci siano
1439 delle interruzioni). Con l'aggiunta di ``CONFIG_PREEMPT`` nella versione
1440 2.5.4 questo è cambiato: quando si è in contesto utente, processi con una
1441 priorità maggiore possono subentrare nell'esecuzione: gli spinlock furono
1442 cambiati per disabilitare la prelazioni, anche su sistemi monoprocessore.
1445 Bottom Half: per ragioni storiche, le funzioni che contengono '_bh' nel
1446 loro nome ora si riferiscono a qualsiasi interruzione software; per esempio,
1447 :c:func:`spin_lock_bh()` blocca qualsiasi interuzione software sul processore
1448 corrente. I *Bottom Halves* sono deprecati, e probabilmente verranno
1449 sostituiti dai tasklet. In un dato momento potrà esserci solo un
1450 *bottom half* in esecuzione.
1452 contesto d'interruzione
1453 Non è il contesto utente: qui si processano le interruzioni hardware e
1454 software. La macro :c:func:`in_interrupt()` ritorna vero.
1457 Il kernel che esegue qualcosa per conto di un particolare processo (per
1458 esempio una chiamata di sistema) o di un thread del kernel. Potete
1459 identificare il processo con la macro ``current``. Da non confondere
1460 con lo spazio utente. Può essere interrotto sia da interruzioni software
1463 interruzione hardware
1464 Richiesta di interruzione hardware. :c:func:`in_irq()` ritorna vero in un
1465 gestore d'interruzioni hardware.
1467 interruzione software / softirq
1468 Gestore di interruzioni software: :c:func:`in_irq()` ritorna falso;
1469 :c:func:`in_softirq()` ritorna vero. I tasklet e le softirq sono entrambi
1470 considerati 'interruzioni software'.
1472 In soldoni, un softirq è uno delle 32 interruzioni software che possono
1473 essere eseguite su più processori in contemporanea. A volte si usa per
1474 riferirsi anche ai tasklet (in pratica tutte le interruzioni software).
1477 (Uni-Processor) un solo processore, ovvero non è SMP. (``CONFIG_SMP=n``).
1479 multi-processore / SMP
1480 (Symmetric Multi-Processor) kernel compilati per sistemi multi-processore
1484 Un processo che esegue il proprio codice fuori dal kernel.
1487 Un'interruzione software registrabile dinamicamente che ha la garanzia
1488 d'essere eseguita solo su un processore alla volta.
1491 Un'interruzione software registrabile dinamicamente che viene eseguita
1492 (circa) in un determinato momento. Quando è in esecuzione è come un tasklet
1493 (infatti, sono chiamati da ``TIMER_SOFTIRQ``).