hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/Documentation/translations/it_IT/kernel-hacking/locking.rst
....@@ -1,5 +1,7 @@
11 .. include:: ../disclaimer-ita.rst
22
3
+.. c:namespace:: it_IT
4
+
35 :Original: :ref:`Documentation/kernel-hacking/locking.rst <kernel_hacking_lock>`
46 :Translator: Federico Vaga <federico.vaga@vaga.pv.it>
57
....@@ -159,17 +161,17 @@
159161 Se avete una struttura dati che verrà utilizzata solo dal contesto utente,
160162 allora, per proteggerla, potete utilizzare un semplice mutex
161163 (``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
+mutex; invocate mutex_lock_interruptible() per trattenerlo e
165
+mutex_unlock() per rilasciarlo. C'è anche mutex_lock()
164166 ma questa dovrebbe essere evitata perché non ritorna in caso di segnali.
165167
166168 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
+di nuove chiamate per setsockopt() e getsockopt()
170
+usando la funzione nf_register_sockopt(). La registrazione e
169171 la rimozione vengono eseguite solamente quando il modulo viene caricato
170172 o scaricato (e durante l'avvio del sistema, qui non abbiamo concorrenza),
171173 e la lista delle funzioni registrate viene consultata solamente quando
172
-:c:func:`setsockopt()` o :c:func:`getsockopt()` sono sconosciute al sistema.
174
+setsockopt() o getsockopt() sono sconosciute al sistema.
173175 In questo caso ``nf_sockopt_mutex`` è perfetto allo scopo, in particolar modo
174176 visto che setsockopt e getsockopt potrebbero dormire.
175177
....@@ -179,19 +181,19 @@
179181 Se un softirq condivide dati col contesto utente, avete due problemi.
180182 Primo, il contesto utente corrente potrebbe essere interroto da un softirq,
181183 e secondo, la sezione critica potrebbe essere eseguita da un altro
182
-processore. Questo è quando :c:func:`spin_lock_bh()`
184
+processore. Questo è quando spin_lock_bh()
183185 (``include/linux/spinlock.h``) viene utilizzato. Questo disabilita i softirq
184
-sul processore e trattiene il *lock*. Invece, :c:func:`spin_unlock_bh()` fa
186
+sul processore e trattiene il *lock*. Invece, spin_unlock_bh() fa
185187 l'opposto. (Il suffisso '_bh' è un residuo storico che fa riferimento al
186188 "Bottom Halves", il vecchio nome delle interruzioni software. In un mondo
187189 perfetto questa funzione si chiamerebbe 'spin_lock_softirq()').
188190
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
+Da notare che in questo caso potete utilizzare anche spin_lock_irq()
192
+o spin_lock_irqsave(), queste fermano anche le interruzioni hardware:
191193 vedere :ref:`Contesto di interruzione hardware <it_hardirq-context>`.
192194
193195 Questo funziona alla perfezione anche sui sistemi monoprocessore: gli spinlock
194
-svaniscono e questa macro diventa semplicemente :c:func:`local_bh_disable()`
196
+svaniscono e questa macro diventa semplicemente local_bh_disable()
195197 (``include/linux/interrupt.h``), la quale impedisce ai softirq d'essere
196198 eseguiti.
197199
....@@ -224,8 +226,8 @@
224226 ~~~~~~~~~~~~~~~~~~~~~~~~
225227
226228 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
+allora avrete bisogno entrambe di spin_lock() e
230
+spin_unlock(). Qui spin_lock_bh() è inutile, siete già
229231 in un tasklet ed avete la garanzia che nessun altro verrà eseguito sullo
230232 stesso processore.
231233
....@@ -243,13 +245,13 @@
243245 fino a questo punto nell'uso dei softirq, probabilmente tenete alla scalabilità
244246 delle prestazioni abbastanza da giustificarne la complessità aggiuntiva.
245247
246
-Dovete utilizzare :c:func:`spin_lock()` e :c:func:`spin_unlock()` per
248
+Dovete utilizzare spin_lock() e spin_unlock() per
247249 proteggere i dati condivisi.
248250
249251 Diversi Softirqs
250252 ~~~~~~~~~~~~~~~~
251253
252
-Dovete utilizzare :c:func:`spin_lock()` e :c:func:`spin_unlock()` per
254
+Dovete utilizzare spin_lock() e spin_unlock() per
253255 proteggere i dati condivisi, che siano timer, tasklet, diversi softirq o
254256 lo stesso o altri softirq: uno qualsiasi di essi potrebbe essere in esecuzione
255257 su un diverso processore.
....@@ -270,40 +272,40 @@
270272 avrete due preoccupazioni. Primo, il softirq può essere interrotto da
271273 un'interruzione hardware, e secondo, la sezione critica potrebbe essere
272274 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()`
275
+dove spin_lock_irq() viene utilizzato. Disabilita le interruzioni
276
+sul processore che l'esegue, poi trattiene il lock. spin_unlock_irq()
275277 fa l'opposto.
276278
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'
279
+Il gestore d'interruzione hardware non ha bisogno di usare spin_lock_irq()
280
+perché i softirq non possono essere eseguiti quando il gestore d'interruzione
281
+hardware è in esecuzione: per questo si può usare spin_lock(), che è un po'
280282 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
283
+hardware utilizza lo stesso *lock*: spin_lock_irq() impedirà a questo
282284 secondo gestore di interrompere quello in esecuzione.
283285
284286 Questo funziona alla perfezione anche sui sistemi monoprocessore: gli spinlock
285
-svaniscono e questa macro diventa semplicemente :c:func:`local_irq_disable()`
287
+svaniscono e questa macro diventa semplicemente local_irq_disable()
286288 (``include/asm/smp.h``), la quale impedisce a softirq/tasklet/BH d'essere
287289 eseguiti.
288290
289
-:c:func:`spin_lock_irqsave()` (``include/linux/spinlock.h``) è una variante che
291
+spin_lock_irqsave() (``include/linux/spinlock.h``) è una variante che
290292 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
293
+a spin_unlock_irqrestore(). Questo significa che lo stesso codice
292294 potrà essere utilizzato in un'interruzione hardware (dove le interruzioni sono
293295 già disabilitate) e in un softirq (dove la disabilitazione delle interruzioni
294296 è richiesta).
295297
296298 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
299
+da un'interruzione hardware, quindi spin_lock_irq() interrompe
298300 anche questi. Tenuto conto di questo si può dire che
299
-:c:func:`spin_lock_irqsave()` è la funzione di sincronizzazione più generica
301
+spin_lock_irqsave() è la funzione di sincronizzazione più generica
300302 e potente.
301303
302304 Sincronizzazione fra due gestori d'interruzioni hardware
303305 --------------------------------------------------------
304306
305307 Condividere dati fra due gestori di interruzione hardware è molto raro, ma se
306
-succede, dovreste usare :c:func:`spin_lock_irqsave()`: è una specificità
308
+succede, dovreste usare spin_lock_irqsave(): è una specificità
307309 dell'architettura il fatto che tutte le interruzioni vengano interrotte
308310 quando si eseguono di gestori di interruzioni.
309311
....@@ -317,11 +319,11 @@
317319 il mutex e dormire (``copy_from_user*(`` o ``kmalloc(x,GFP_KERNEL)``).
318320
319321 - Altrimenti (== i dati possono essere manipolati da un'interruzione) usate
320
- :c:func:`spin_lock_irqsave()` e :c:func:`spin_unlock_irqrestore()`.
322
+ spin_lock_irqsave() e spin_unlock_irqrestore().
321323
322324 - Evitate di trattenere uno spinlock per più di 5 righe di codice incluse
323325 le chiamate a funzione (ad eccezione di quell per l'accesso come
324
- :c:func:`readb()`).
326
+ readb()).
325327
326328 Tabella dei requisiti minimi
327329 ----------------------------
....@@ -334,7 +336,7 @@
334336 la sincronizzazione è necessaria).
335337
336338 Ricordatevi il suggerimento qui sopra: potete sempre usare
337
-:c:func:`spin_lock_irqsave()`, che è un sovrainsieme di tutte le altre funzioni
339
+spin_lock_irqsave(), che è un sovrainsieme di tutte le altre funzioni
338340 per spinlock.
339341
340342 ============== ============= ============= ========= ========= ========= ========= ======= ======= ============== ==============
....@@ -378,13 +380,13 @@
378380 trattenendo il *lock*. Potrete acquisire il *lock* più tardi se vi
379381 serve accedere ai dati protetti da questo *lock*.
380382
381
-La funzione :c:func:`spin_trylock()` non ritenta di acquisire il *lock*,
383
+La funzione spin_trylock() non ritenta di acquisire il *lock*,
382384 se ci riesce al primo colpo ritorna un valore diverso da zero, altrimenti
383385 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
386
+contesto, ma come spin_lock(): dovete disabilitare i contesti che
385387 potrebbero interrompervi e quindi trattenere lo spinlock.
386388
387
-La funzione :c:func:`mutex_trylock()` invece di sospendere il vostro processo
389
+La funzione mutex_trylock() invece di sospendere il vostro processo
388390 ritorna un valore diverso da zero se è possibile trattenere il lock al primo
389391 colpo, altrimenti se fallisce ritorna 0. Nonostante non dorma, questa funzione
390392 non può essere usata in modo sicuro in contesti di interruzione hardware o
....@@ -468,7 +470,7 @@
468470 if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
469471 return -ENOMEM;
470472
471
- strlcpy(obj->name, name, sizeof(obj->name));
473
+ strscpy(obj->name, name, sizeof(obj->name));
472474 obj->id = id;
473475 obj->popularity = 0;
474476
....@@ -506,7 +508,7 @@
506508 caso è semplice dato che copiamo i dati dall'utente e non permettiamo
507509 mai loro di accedere direttamente agli oggetti.
508510
509
-C'è una piccola ottimizzazione qui: nella funzione :c:func:`cache_add()`
511
+C'è una piccola ottimizzazione qui: nella funzione cache_add()
510512 impostiamo i campi dell'oggetto prima di acquisire il *lock*. Questo è
511513 sicuro perché nessun altro potrà accedervi finché non lo inseriremo
512514 nella memoria.
....@@ -514,7 +516,7 @@
514516 Accesso dal contesto utente
515517 ---------------------------
516518
517
-Ora consideriamo il caso in cui :c:func:`cache_find()` può essere invocata
519
+Ora consideriamo il caso in cui cache_find() può essere invocata
518520 dal contesto d'interruzione: sia hardware che software. Un esempio potrebbe
519521 essere un timer che elimina oggetti dalla memoria.
520522
....@@ -583,18 +585,18 @@
583585 return ret;
584586 }
585587
586
-Da notare che :c:func:`spin_lock_irqsave()` disabiliterà le interruzioni
588
+Da notare che spin_lock_irqsave() disabiliterà le interruzioni
587589 se erano attive, altrimenti non farà niente (quando siamo già in un contesto
588590 d'interruzione); dunque queste funzioni possono essere chiamante in
589591 sicurezza da qualsiasi contesto.
590592
591
-Sfortunatamente, :c:func:`cache_add()` invoca :c:func:`kmalloc()` con
593
+Sfortunatamente, cache_add() invoca kmalloc() con
592594 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()`.
595
+che cache_add() venga chiamata dal contesto utente, altrimenti
596
+questa opzione deve diventare un parametro di cache_add().
595597
596
-Exposing Objects Outside This File
597
-----------------------------------
598
+Esporre gli oggetti al di fuori del file
599
+----------------------------------------
598600
599601 Se i vostri oggetti contengono più informazioni, potrebbe non essere
600602 sufficiente copiare i dati avanti e indietro: per esempio, altre parti del
....@@ -610,7 +612,7 @@
610612 mantiene un puntatore ad un oggetto, presumibilmente si aspetta che questo
611613 puntatore rimanga valido. Sfortunatamente, questo è garantito solo mentre
612614 si trattiene il *lock*, altrimenti qualcuno potrebbe chiamare
613
-:c:func:`cache_delete()` o peggio, aggiungere un oggetto che riutilizza lo
615
+cache_delete() o peggio, aggiungere un oggetto che riutilizza lo
614616 stesso indirizzo.
615617
616618 Dato che c'è un solo *lock*, non potete trattenerlo a vita: altrimenti
....@@ -678,7 +680,7 @@
678680 }
679681
680682 @@ -63,6 +94,7 @@
681
- strlcpy(obj->name, name, sizeof(obj->name));
683
+ strscpy(obj->name, name, sizeof(obj->name));
682684 obj->id = id;
683685 obj->popularity = 0;
684686 + obj->refcnt = 1; /* The cache holds a reference */
....@@ -710,9 +712,9 @@
710712 }
711713
712714 Abbiamo incapsulato il contatore di riferimenti nelle tipiche funzioni
713
-di 'get' e 'put'. Ora possiamo ritornare l'oggetto da :c:func:`cache_find()`
715
+di 'get' e 'put'. Ora possiamo ritornare l'oggetto da cache_find()
714716 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
+copy_to_user() per copiare il nome verso lo spazio utente).
716718
717719 Un altro punto da notare è che ho detto che il contatore dovrebbe incrementarsi
718720 per ogni puntatore ad un oggetto: quindi il contatore di riferimenti è 1
....@@ -727,8 +729,8 @@
727729 in ``include/asm/atomic.h``: queste sono garantite come atomiche su qualsiasi
728730 processore del sistema, quindi non sono necessari i *lock*. In questo caso è
729731 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
+sia più elegante per casi non banali. Le funzioni atomic_inc() e
733
+atomic_dec_and_test() vengono usate al posto dei tipici operatori di
732734 incremento e decremento, e i *lock* non sono più necessari per proteggere il
733735 contatore stesso.
734736
....@@ -792,7 +794,7 @@
792794 }
793795
794796 @@ -94,7 +76,7 @@
795
- strlcpy(obj->name, name, sizeof(obj->name));
797
+ strscpy(obj->name, name, sizeof(obj->name));
796798 obj->id = id;
797799 obj->popularity = 0;
798800 - obj->refcnt = 1; /* The cache holds a reference */
....@@ -820,7 +822,7 @@
820822 - Si può togliere static da ``cache_lock`` e dire agli utenti che devono
821823 trattenere il *lock* prima di modificare il nome di un oggetto.
822824
823
-- Si può fornire una funzione :c:func:`cache_obj_rename()` che prende il
825
+- Si può fornire una funzione cache_obj_rename() che prende il
824826 *lock* e cambia il nome per conto del chiamante; si dirà poi agli utenti
825827 di usare questa funzione.
826828
....@@ -878,11 +880,11 @@
878880 protetto da ``cache_lock`` piuttosto che dal *lock* dell'oggetto; questo
879881 perché è logicamente parte dell'infrastruttura (come
880882 :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
883
+in __cache_add(), non ho bisogno di trattenere il *lock* di ogni
882884 oggetto mentre si cerca il meno popolare.
883885
884886 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()`
887
+trattenere il lock dell'oggetto quando si usa __cache_find()
886888 per leggere questo campo; il *lock* dell'oggetto è usato solo dal chiamante
887889 che vuole leggere o scrivere il campo name.
888890
....@@ -907,7 +909,7 @@
907909 sveglio 5 notti a parlare da solo.
908910
909911 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
912
+fra un softirq ed il contesto utente. Se usate spin_lock() per
911913 proteggerlo, il contesto utente potrebbe essere interrotto da un softirq
912914 mentre trattiene il lock, da qui il softirq rimarrà in attesa attiva provando
913915 ad acquisire il *lock* già trattenuto nel contesto utente.
....@@ -1006,12 +1008,12 @@
10061008 spin_unlock_bh(&list_lock);
10071009
10081010 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
+temporizzatore potrebbe essere già partiro prima di spin_lock_bh(),
1012
+e prenderà il *lock* solo dopo spin_unlock_bh(), e cercherà
10111013 di eliminare il suo oggetto (che però è già stato eliminato).
10121014
10131015 Questo può essere evitato controllando il valore di ritorno di
1014
-:c:func:`del_timer()`: se ritorna 1, il temporizzatore è stato già
1016
+del_timer(): se ritorna 1, il temporizzatore è stato già
10151017 rimosso. Se 0, significa (in questo caso) che il temporizzatore è in
10161018 esecuzione, quindi possiamo fare come segue::
10171019
....@@ -1032,9 +1034,9 @@
10321034 spin_unlock_bh(&list_lock);
10331035
10341036 Un altro problema è l'eliminazione dei temporizzatori che si riavviano
1035
-da soli (chiamando :c:func:`add_timer()` alla fine della loro esecuzione).
1037
+da soli (chiamando add_timer() alla fine della loro esecuzione).
10361038 Dato che questo è un problema abbastanza comune con una propensione
1037
-alle corse critiche, dovreste usare :c:func:`del_timer_sync()`
1039
+alle corse critiche, dovreste usare del_timer_sync()
10381040 (``include/linux/timer.h``) per gestire questo caso. Questa ritorna il
10391041 numero di volte che il temporizzatore è stato interrotto prima che
10401042 fosse in grado di fermarlo senza che si riavviasse.
....@@ -1116,7 +1118,7 @@
11161118 wmb();
11171119 list->next = new;
11181120
1119
-La funzione :c:func:`wmb()` è una barriera di sincronizzazione delle
1121
+La funzione wmb() è una barriera di sincronizzazione delle
11201122 scritture. Questa garantisce che la prima operazione (impostare l'elemento
11211123 ``next`` del nuovo elemento) venga completata e vista da tutti i processori
11221124 prima che venga eseguita la seconda operazione (che sarebbe quella di mettere
....@@ -1127,7 +1129,7 @@
11271129 il puntatore ``next`` deve puntare al resto della lista.
11281130
11291131 Fortunatamente, c'è una funzione che fa questa operazione sulle liste
1130
-:c:type:`struct list_head <list_head>`: :c:func:`list_add_rcu()`
1132
+:c:type:`struct list_head <list_head>`: list_add_rcu()
11311133 (``include/linux/list.h``).
11321134
11331135 Rimuovere un elemento dalla lista è anche più facile: sostituiamo il puntatore
....@@ -1138,7 +1140,7 @@
11381140
11391141 list->next = old->next;
11401142
1141
-La funzione :c:func:`list_del_rcu()` (``include/linux/list.h``) fa esattamente
1143
+La funzione list_del_rcu() (``include/linux/list.h``) fa esattamente
11421144 questo (la versione normale corrompe il vecchio oggetto, e non vogliamo che
11431145 accada).
11441146
....@@ -1146,9 +1148,9 @@
11461148 attraverso il puntatore ``next`` il contenuto dell'elemento successivo
11471149 troppo presto, ma non accorgersi che il contenuto caricato è sbagliato quando
11481150 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()`
1151
+c'è una funzione che viene in vostro aiuto list_for_each_entry_rcu()
11501152 (``include/linux/list.h``). Ovviamente, gli scrittori possono usare
1151
-:c:func:`list_for_each_entry()` dato che non ci possono essere due scrittori
1153
+list_for_each_entry() dato che non ci possono essere due scrittori
11521154 in contemporanea.
11531155
11541156 Il nostro ultimo dilemma è il seguente: quando possiamo realmente distruggere
....@@ -1156,15 +1158,15 @@
11561158 elemento proprio ora: se eliminiamo questo elemento ed il puntatore ``next``
11571159 cambia, il lettore salterà direttamente nella spazzatura e scoppierà. Dobbiamo
11581160 aspettare finché tutti i lettori che stanno attraversando la lista abbiano
1159
-finito. Utilizziamo :c:func:`call_rcu()` per registrare una funzione di
1161
+finito. Utilizziamo call_rcu() per registrare una funzione di
11601162 richiamo che distrugga l'oggetto quando tutti i lettori correnti hanno
11611163 terminato. In alternative, potrebbe essere usata la funzione
1162
-:c:func:`synchronize_rcu()` che blocca l'esecuzione finché tutti i lettori
1164
+synchronize_rcu() che blocca l'esecuzione finché tutti i lettori
11631165 non terminano di ispezionare la lista.
11641166
11651167 Ma come fa l'RCU a sapere quando i lettori sono finiti? Il meccanismo è
11661168 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
1169
+rcu_read_lock()/rcu_read_unlock() che disabilita la
11681170 prelazione così che i lettori non vengano sospesi mentre stanno leggendo
11691171 la lista.
11701172
....@@ -1253,12 +1255,12 @@
12531255 }
12541256
12551257 Da notare che i lettori modificano il campo popularity nella funzione
1256
-:c:func:`__cache_find()`, e ora non trattiene alcun *lock*. Una soluzione
1258
+__cache_find(), e ora non trattiene alcun *lock*. Una soluzione
12571259 potrebbe essere quella di rendere la variabile ``atomic_t``, ma per l'uso
12581260 che ne abbiamo fatto qui, non ci interessano queste corse critiche perché un
12591261 risultato approssimativo è comunque accettabile, quindi non l'ho cambiato.
12601262
1261
-Il risultato è che la funzione :c:func:`cache_find()` non ha bisogno di alcuna
1263
+Il risultato è che la funzione cache_find() non ha bisogno di alcuna
12621264 sincronizzazione con le altre funzioni, quindi è veloce su un sistema
12631265 multi-processore tanto quanto lo sarebbe su un sistema mono-processore.
12641266
....@@ -1271,9 +1273,9 @@
12711273
12721274 Ora, dato che il '*lock* di lettura' di un RCU non fa altro che disabilitare
12731275 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
1276
+chiamate cache_find() e object_put() non necessita
12751277 di incrementare e decrementare il contatore di riferimenti. Potremmo
1276
-esporre la funzione :c:func:`__cache_find()` dichiarandola non-static,
1278
+esporre la funzione __cache_find() dichiarandola non-static,
12771279 e quel chiamante potrebbe usare direttamente questa funzione.
12781280
12791281 Il beneficio qui sta nel fatto che il contatore di riferimenti no
....@@ -1293,10 +1295,10 @@
12931295 Se questo dovesse essere troppo lento (solitamente non lo è, ma se avete
12941296 dimostrato che lo è devvero), potreste usare un contatore per ogni processore
12951297 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()`
1298
+DEFINE_PER_CPU(), get_cpu_var() e put_cpu_var()
12971299 (``include/linux/percpu.h``).
12981300
1299
-Il tipo di dato ``local_t``, la funzione :c:func:`cpu_local_inc()` e tutte
1301
+Il tipo di dato ``local_t``, la funzione cpu_local_inc() e tutte
13001302 le altre funzioni associate, sono di particolare utilità per semplici contatori
13011303 per-processore; su alcune architetture sono anche più efficienti
13021304 (``include/asm/local.h``).
....@@ -1324,11 +1326,11 @@
13241326 enable_irq(irq);
13251327 spin_unlock(&lock);
13261328
1327
-La funzione :c:func:`disable_irq()` impedisce al gestore d'interruzioni
1329
+La funzione disable_irq() impedisce al gestore d'interruzioni
13281330 d'essere eseguito (e aspetta che finisca nel caso fosse in esecuzione su
13291331 un altro processore). Lo spinlock, invece, previene accessi simultanei.
13301332 Naturalmente, questo è più lento della semplice chiamata
1331
-:c:func:`spin_lock_irq()`, quindi ha senso solo se questo genere di accesso
1333
+spin_lock_irq(), quindi ha senso solo se questo genere di accesso
13321334 è estremamente raro.
13331335
13341336 .. _`it_sleeping-things`:
....@@ -1336,7 +1338,7 @@
13361338 Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni?
13371339 =========================================================================
13381340
1339
-Molte funzioni del kernel dormono (in sostanza, chiamano ``schedule()``)
1341
+Molte funzioni del kernel dormono (in sostanza, chiamano schedule())
13401342 direttamente od indirettamente: non potete chiamarle se trattenere uno
13411343 spinlock o avete la prelazione disabilitata, mai. Questo significa che
13421344 dovete necessariamente essere nel contesto utente: chiamarle da un
....@@ -1354,23 +1356,23 @@
13541356
13551357 - Accessi allo spazio utente:
13561358
1357
- - :c:func:`copy_from_user()`
1359
+ - copy_from_user()
13581360
1359
- - :c:func:`copy_to_user()`
1361
+ - copy_to_user()
13601362
1361
- - :c:func:`get_user()`
1363
+ - get_user()
13621364
1363
- - :c:func:`put_user()`
1365
+ - put_user()
13641366
1365
-- :c:func:`kmalloc(GFP_KERNEL) <kmalloc>`
1367
+- kmalloc(GFP_KERNEL) <kmalloc>`
13661368
1367
-- :c:func:`mutex_lock_interruptible()` and
1368
- :c:func:`mutex_lock()`
1369
+- mutex_lock_interruptible() and
1370
+ mutex_lock()
13691371
1370
- C'è anche :c:func:`mutex_trylock()` che però non dorme.
1372
+ C'è anche mutex_trylock() che però non dorme.
13711373 Comunque, non deve essere usata in un contesto d'interruzione dato
13721374 che la sua implementazione non è sicura in quel contesto.
1373
- Anche :c:func:`mutex_unlock()` non dorme mai. Non può comunque essere
1375
+ Anche mutex_unlock() non dorme mai. Non può comunque essere
13741376 usata in un contesto d'interruzione perché un mutex deve essere rilasciato
13751377 dallo stesso processo che l'ha acquisito.
13761378
....@@ -1380,11 +1382,11 @@
13801382 Alcune funzioni possono essere chiamate tranquillamente da qualsiasi
13811383 contesto, o trattenendo un qualsiasi *lock*.
13821384
1383
-- :c:func:`printk()`
1385
+- printk()
13841386
1385
-- :c:func:`kfree()`
1387
+- kfree()
13861388
1387
-- :c:func:`add_timer()` e :c:func:`del_timer()`
1389
+- add_timer() e del_timer()
13881390
13891391 Riferimento per l'API dei Mutex
13901392 ===============================
....@@ -1398,13 +1400,13 @@
13981400 Riferimento per l'API dei Futex
13991401 ===============================
14001402
1401
-.. kernel-doc:: kernel/futex.c
1403
+.. kernel-doc:: kernel/futex/core.c
14021404 :internal:
14031405
14041406 Approfondimenti
14051407 ===============
14061408
1407
-- ``Documentation/locking/spinlocks.txt``: la guida di Linus Torvalds agli
1409
+- ``Documentation/locking/spinlocks.rst``: la guida di Linus Torvalds agli
14081410 spinlock del kernel.
14091411
14101412 - Unix Systems for Modern Architectures: Symmetric Multiprocessing and
....@@ -1444,14 +1446,14 @@
14441446 bh
14451447 Bottom Half: per ragioni storiche, le funzioni che contengono '_bh' nel
14461448 loro nome ora si riferiscono a qualsiasi interruzione software; per esempio,
1447
- :c:func:`spin_lock_bh()` blocca qualsiasi interuzione software sul processore
1449
+ spin_lock_bh() blocca qualsiasi interuzione software sul processore
14481450 corrente. I *Bottom Halves* sono deprecati, e probabilmente verranno
14491451 sostituiti dai tasklet. In un dato momento potrà esserci solo un
14501452 *bottom half* in esecuzione.
14511453
14521454 contesto d'interruzione
14531455 Non è il contesto utente: qui si processano le interruzioni hardware e
1454
- software. La macro :c:func:`in_interrupt()` ritorna vero.
1456
+ software. La macro in_interrupt() ritorna vero.
14551457
14561458 contesto utente
14571459 Il kernel che esegue qualcosa per conto di un particolare processo (per
....@@ -1461,12 +1463,12 @@
14611463 che hardware.
14621464
14631465 interruzione hardware
1464
- Richiesta di interruzione hardware. :c:func:`in_irq()` ritorna vero in un
1466
+ Richiesta di interruzione hardware. in_irq() ritorna vero in un
14651467 gestore d'interruzioni hardware.
14661468
14671469 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
+ Gestore di interruzioni software: in_irq() ritorna falso;
1471
+ in_softirq() ritorna vero. I tasklet e le softirq sono entrambi
14701472 considerati 'interruzioni software'.
14711473
14721474 In soldoni, un softirq è uno delle 32 interruzioni software che possono