€•+éŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_CN/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_TW/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ja_JP/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ko_KR/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/pt_BR/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/sp_SP/process/botching-up-ioctls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒItalian”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”hŒ paragraph”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”(hŒ·In caso di dubbi sulla correttezza del contenuto di questa traduzione, l’unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le ”…””}”(hh½h²hh³Nh´Nubh)”}”(hŒ!:ref:`avvertenze `”h]”hŒinline”“”)”}”(hhÇh]”hŒ avvertenze”…””}”(hhËh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hÉhhÅubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ-translations/it_IT/process/botching-up-ioctls”Œ refdomain”hÖŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ it_disclaimer”uh1hh³Œ3Documentation/translations/it_IT/disclaimer-ita.rst”h´Khh½ubhŒ.”…””}”(hh½h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hêh´Khh·ubah}”(h]”h ]”h"]”h$]”h&]”uh1hµhhh²hh³hêh´NubhŒ field_list”“”)”}”(hhh]”hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjh³Œ[/var/lib/git/docbuild/linux/Documentation/translations/it_IT/process/botching-up-ioctls.rst”h´KubhŒ field_body”“”)”}”(hŒ-Documentation/process/botching-up-ioctls.rst ”h]”h¼)”}”(hŒ,Documentation/process/botching-up-ioctls.rst”h]”hŒ,Documentation/process/botching-up-ioctls.rst”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jh´Khhýh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hûhhh²hh³jh´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ*(Come evitare di) Raffazzonare delle ioctl”h]”hŒ*(Come evitare di) Raffazzonare delle ioctl”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj>h²hh³jh´Kubh¼)”}”(hŒ?Preso da: https://blog.ffwll.ch/2013/11/botching-up-ioctls.html”h]”(hŒ Preso da: ”…””}”(hjQh²hh³Nh´NubhŒ reference”“”)”}”(hŒ5https://blog.ffwll.ch/2013/11/botching-up-ioctls.html”h]”hŒ5https://blog.ffwll.ch/2013/11/botching-up-ioctls.html”…””}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j]uh1jYhjQubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K hj>h²hubh¼)”}”(hŒ?Scritto da : Daniel Vetter, Copyright © 2013 Intel Corporation”h]”hŒ?Scritto da : Daniel Vetter, Copyright © 2013 Intel Corporation”…””}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K hj>h²hubh¼)”}”(hXUna cosa che gli sviluppatori del sottosistema grafico del kernel Linux hanno imparato negli ultimi anni è l'inutilità di cercare di creare un'interfaccia unificata per gestire la memoria e le unità esecutive di diverse GPU. Dunque, oggigiorno ogni driver ha il suo insieme di ioctl per allocare memoria ed inviare dei programmi alla GPU. Il che è va bene dato che non c'è più un insano sistema che finge di essere generico, ma al suo posto ci sono interfacce dedicate. Ma al tempo stesso è più facile incasinare le cose.”h]”hXUna cosa che gli sviluppatori del sottosistema grafico del kernel Linux hanno imparato negli ultimi anni è l’inutilità di cercare di creare un’interfaccia unificata per gestire la memoria e le unità esecutive di diverse GPU. Dunque, oggigiorno ogni driver ha il suo insieme di ioctl per allocare memoria ed inviare dei programmi alla GPU. Il che è va bene dato che non c’è più un insano sistema che finge di essere generico, ma al suo posto ci sono interfacce dedicate. Ma al tempo stesso è più facile incasinare le cose.”…””}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K hj>h²hubh¼)”}”(hXŸPer evitare di ripetere gli stessi errori ho preso nota delle lezioni imparate mentre raffazzonavo il driver drm/i915. La maggior parte di queste lezioni si focalizzano sui tecnicismi e non sulla visione d'insieme, come le discussioni riguardo al modo migliore per implementare una ioctl per inviare compiti alla GPU. Probabilmente, ogni sviluppatore di driver per GPU dovrebbe imparare queste lezioni in autonomia.”h]”hX¡Per evitare di ripetere gli stessi errori ho preso nota delle lezioni imparate mentre raffazzonavo il driver drm/i915. La maggior parte di queste lezioni si focalizzano sui tecnicismi e non sulla visione d’insieme, come le discussioni riguardo al modo migliore per implementare una ioctl per inviare compiti alla GPU. Probabilmente, ogni sviluppatore di driver per GPU dovrebbe imparare queste lezioni in autonomia.”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Khj>h²hubj=)”}”(hhh]”(jB)”}”(hŒ Prerequisiti”h]”hŒ Prerequisiti”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjšh²hh³jh´Kubh¼)”}”(hŒ™Prima i prerequisiti. Seguite i seguenti suggerimenti se non volete fallire in partenza e ritrovarvi ad aggiungere un livello di compatibilità a 32-bit.”h]”hŒ™Prima i prerequisiti. Seguite i seguenti suggerimenti se non volete fallire in partenza e ritrovarvi ad aggiungere un livello di compatibilità a 32-bit.”…””}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K hjšh²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ¸Usate solamente interi a lunghezza fissa. Per evitare i conflitti coi tipi definiti nello spazio utente, il kernel definisce alcuni tipi speciali, come: ``__u32``, ``__s64``. Usateli. ”h]”h¼)”}”(hŒ·Usate solamente interi a lunghezza fissa. Per evitare i conflitti coi tipi definiti nello spazio utente, il kernel definisce alcuni tipi speciali, come: ``__u32``, ``__s64``. Usateli.”h]”(hŒ™Usate solamente interi a lunghezza fissa. Per evitare i conflitti coi tipi definiti nello spazio utente, il kernel definisce alcuni tipi speciali, come: ”…””}”(hjÄh²hh³Nh´NubhŒliteral”“”)”}”(hŒ ``__u32``”h]”hŒ__u32”…””}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhjÄubhŒ, ”…””}”(hjÄh²hh³Nh´NubjÍ)”}”(hŒ ``__s64``”h]”hŒ__s64”…””}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhjÄubhŒ . Usateli.”…””}”(hjÄh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K#hjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³jh´Nubj¿)”}”(hXDAllineate tutto alla lunghezza naturale delle piattaforma in uso e riempite esplicitamente i vuoti. Non necessariamente le piattaforme a 32-bit allineano i valori a 64-bit rispettandone l'allineamento, ma le piattaforme a 64-bit lo fanno. Dunque, per farlo correttamente in entrambe i casi dobbiamo sempre riempire i vuoti. ”h]”h¼)”}”(hXCAllineate tutto alla lunghezza naturale delle piattaforma in uso e riempite esplicitamente i vuoti. Non necessariamente le piattaforme a 32-bit allineano i valori a 64-bit rispettandone l'allineamento, ma le piattaforme a 64-bit lo fanno. Dunque, per farlo correttamente in entrambe i casi dobbiamo sempre riempire i vuoti.”h]”hXEAllineate tutto alla lunghezza naturale delle piattaforma in uso e riempite esplicitamente i vuoti. Non necessariamente le piattaforme a 32-bit allineano i valori a 64-bit rispettandone l’allineamento, ma le piattaforme a 64-bit lo fanno. Dunque, per farlo correttamente in entrambe i casi dobbiamo sempre riempire i vuoti.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K'hjþubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³jh´Nubj¿)”}”(hXrSe una struttura dati contiene valori a 64-bit, allora fate si che la sua dimensione sia allineata a 64-bit, altrimenti la sua dimensione varierà su sistemi a 32-bit e 64-bit. Avere una dimensione differente causa problemi quando si passano vettori di strutture dati al kernel, o quando il kernel effettua verifiche sulla dimensione (per esempio il sistema drm lo fa). ”h]”h¼)”}”(hXqSe una struttura dati contiene valori a 64-bit, allora fate si che la sua dimensione sia allineata a 64-bit, altrimenti la sua dimensione varierà su sistemi a 32-bit e 64-bit. Avere una dimensione differente causa problemi quando si passano vettori di strutture dati al kernel, o quando il kernel effettua verifiche sulla dimensione (per esempio il sistema drm lo fa).”h]”hXqSe una struttura dati contiene valori a 64-bit, allora fate si che la sua dimensione sia allineata a 64-bit, altrimenti la sua dimensione varierà su sistemi a 32-bit e 64-bit. Avere una dimensione differente causa problemi quando si passano vettori di strutture dati al kernel, o quando il kernel effettua verifiche sulla dimensione (per esempio il sistema drm lo fa).”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K-hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³jh´Nubj¿)”}”(hXËI puntatori sono di tipo ``__u64``, con un *cast* da/a ``uintptr_t`` da lato spazio utente e da/a ``void __user *`` nello spazio kernel. Sforzatevi il più possibile per non ritardare la conversione, o peggio maneggiare ``__u64`` nel vostro codice perché questo riduce le verifiche che strumenti come sparse possono effettuare. La macro u64_to_user_ptr() può essere usata nel kernel per evitare avvisi riguardo interi e puntatori di dimensioni differenti. ”h]”h¼)”}”(hXÉI puntatori sono di tipo ``__u64``, con un *cast* da/a ``uintptr_t`` da lato spazio utente e da/a ``void __user *`` nello spazio kernel. Sforzatevi il più possibile per non ritardare la conversione, o peggio maneggiare ``__u64`` nel vostro codice perché questo riduce le verifiche che strumenti come sparse possono effettuare. La macro u64_to_user_ptr() può essere usata nel kernel per evitare avvisi riguardo interi e puntatori di dimensioni differenti.”h]”(hŒI puntatori sono di tipo ”…””}”(hj2h²hh³Nh´NubjÍ)”}”(hŒ ``__u64``”h]”hŒ__u64”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhj2ubhŒ , con un ”…””}”(hj2h²hh³Nh´NubhŒemphasis”“”)”}”(hŒ*cast*”h]”hŒcast”…””}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj2ubhŒ da/a ”…””}”(hj2h²hh³Nh´NubjÍ)”}”(hŒ ``uintptr_t``”h]”hŒ uintptr_t”…””}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhj2ubhŒ da lato spazio utente e da/a ”…””}”(hj2h²hh³Nh´NubjÍ)”}”(hŒ``void __user *``”h]”hŒ void __user *”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhj2ubhŒi nello spazio kernel. Sforzatevi il più possibile per non ritardare la conversione, o peggio maneggiare ”…””}”(hj2h²hh³Nh´NubjÍ)”}”(hŒ ``__u64``”h]”hŒ__u64”…””}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhj2ubhŒä nel vostro codice perché questo riduce le verifiche che strumenti come sparse possono effettuare. La macro u64_to_user_ptr() può essere usata nel kernel per evitare avvisi riguardo interi e puntatori di dimensioni differenti.”…””}”(hj2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K3hj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»h²hh³jh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1j¹h³jh´K#hjšh²hubeh}”(h]”Œ prerequisiti”ah ]”h"]”Œ prerequisiti”ah$]”h&]”uh1j<hj>h²hh³jh´Kubj=)”}”(hhh]”(jB)”}”(hŒLe Basi”h]”hŒLe Basi”…””}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj²h²hh³jh´Khj²h²hubjº)”}”(hhh]”(j¿)”}”(hXàAbbiate un modo chiaro per capire dallo spazio utente se una nuova ioctl, o l'estensione di una esistente, sia supportata dal kernel in esecuzione. Se non potete fidarvi del fatto che un vecchio kernel possa rifiutare correttamente un nuovo *flag*, modalità, o ioctl, (probabilmente perché avevate raffazzonato qualcosa nel passato) allora dovrete implementare nel driver un meccanismo per notificare quali funzionalità sono supportate, o in alternativa un numero di versione. ”h]”h¼)”}”(hXßAbbiate un modo chiaro per capire dallo spazio utente se una nuova ioctl, o l'estensione di una esistente, sia supportata dal kernel in esecuzione. Se non potete fidarvi del fatto che un vecchio kernel possa rifiutare correttamente un nuovo *flag*, modalità, o ioctl, (probabilmente perché avevate raffazzonato qualcosa nel passato) allora dovrete implementare nel driver un meccanismo per notificare quali funzionalità sono supportate, o in alternativa un numero di versione.”h]”(hŒóAbbiate un modo chiaro per capire dallo spazio utente se una nuova ioctl, o l’estensione di una esistente, sia supportata dal kernel in esecuzione. Se non potete fidarvi del fatto che un vecchio kernel possa rifiutare correttamente un nuovo ”…””}”(hjØh²hh³Nh´NubjM)”}”(hŒ*flag*”h]”hŒflag”…””}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjØubhŒè, modalità, o ioctl, (probabilmente perché avevate raffazzonato qualcosa nel passato) allora dovrete implementare nel driver un meccanismo per notificare quali funzionalità sono supportate, o in alternativa un numero di versione.”…””}”(hjØh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KChjÔubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjÑh²hh³jh´Nubj¿)”}”(hXëAbbiate un piano per estendere le ioctl con nuovi *flag* o campi alla fine di una struttura dati. Il sistema drm verifica la dimensione di ogni ioctl in arrivo, ed estende con zeri ogni incongruenza fra kernel e spazio utente. Questo aiuta, ma non è una soluzione completa dato che uno spazio utente nuovo su un kernel vecchio non noterebbe che i campi nuovi alla fine della struttura vengono ignorati. Dunque, anche questo avrà bisogno di essere notificato dal driver allo spazio utente. ”h]”h¼)”}”(hXêAbbiate un piano per estendere le ioctl con nuovi *flag* o campi alla fine di una struttura dati. Il sistema drm verifica la dimensione di ogni ioctl in arrivo, ed estende con zeri ogni incongruenza fra kernel e spazio utente. Questo aiuta, ma non è una soluzione completa dato che uno spazio utente nuovo su un kernel vecchio non noterebbe che i campi nuovi alla fine della struttura vengono ignorati. Dunque, anche questo avrà bisogno di essere notificato dal driver allo spazio utente.”h]”(hŒ2Abbiate un piano per estendere le ioctl con nuovi ”…””}”(hjh²hh³Nh´NubjM)”}”(hŒ*flag*”h]”hŒflag”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjubhX² o campi alla fine di una struttura dati. Il sistema drm verifica la dimensione di ogni ioctl in arrivo, ed estende con zeri ogni incongruenza fra kernel e spazio utente. Questo aiuta, ma non è una soluzione completa dato che uno spazio utente nuovo su un kernel vecchio non noterebbe che i campi nuovi alla fine della struttura vengono ignorati. Dunque, anche questo avrà bisogno di essere notificato dal driver allo spazio utente.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KKhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjÑh²hh³jh´Nubj¿)”}”(hXZVerificate tutti i campi e *flag* inutilizzati ed i riempimenti siano a 0, altrimenti rifiutare la ioctl. Se non lo fate il vostro bel piano per estendere le ioctl andrà a rotoli dato che qualcuno userà delle ioctl con strutture dati con valori casuali dallo stack nei campi inutilizzati. Il che si traduce nell'avere questi campi nell'ABI, e la cui unica utilità sarà quella di contenere spazzatura. Per questo dovrete esplicitamente riempire i vuoti di tutte le vostre strutture dati, anche se non le userete in un vettore. Il riempimento fatto dal compilatore potrebbe contenere valori casuali. ”h]”h¼)”}”(hXYVerificate tutti i campi e *flag* inutilizzati ed i riempimenti siano a 0, altrimenti rifiutare la ioctl. Se non lo fate il vostro bel piano per estendere le ioctl andrà a rotoli dato che qualcuno userà delle ioctl con strutture dati con valori casuali dallo stack nei campi inutilizzati. Il che si traduce nell'avere questi campi nell'ABI, e la cui unica utilità sarà quella di contenere spazzatura. Per questo dovrete esplicitamente riempire i vuoti di tutte le vostre strutture dati, anche se non le userete in un vettore. Il riempimento fatto dal compilatore potrebbe contenere valori casuali.”h]”(hŒVerificate tutti i campi e ”…””}”(hj,h²hh³Nh´NubjM)”}”(hŒ*flag*”h]”hŒflag”…””}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj,ubhX< inutilizzati ed i riempimenti siano a 0, altrimenti rifiutare la ioctl. Se non lo fate il vostro bel piano per estendere le ioctl andrà a rotoli dato che qualcuno userà delle ioctl con strutture dati con valori casuali dallo stack nei campi inutilizzati. Il che si traduce nell’avere questi campi nell’ABI, e la cui unica utilità sarà quella di contenere spazzatura. Per questo dovrete esplicitamente riempire i vuoti di tutte le vostre strutture dati, anche se non le userete in un vettore. Il riempimento fatto dal compilatore potrebbe contenere valori casuali.”…””}”(hj,h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KShj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjÑh²hh³jh´Nubj¿)”}”(hŒEAbbiate un semplice codice di test per ognuno dei casi sopracitati. ”h]”h¼)”}”(hŒCAbbiate un semplice codice di test per ognuno dei casi sopracitati.”h]”hŒCAbbiate un semplice codice di test per ognuno dei casi sopracitati.”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K]hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjÑh²hh³jh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j¹h³jh´KChj²h²hubeh}”(h]”Œle-basi”ah ]”h"]”Œle basi”ah$]”h&]”uh1j<hj>h²hh³jh´Kh²hh³jh´Kaubj=)”}”(hhh]”(jB)”}”(hŒ Tempi, attese e mancate scadenze”h]”hŒ Tempi, attese e mancate scadenze”…””}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj¾h²hh³jh´Kubh¼)”}”(hX:Le GPU fanno quasi tutto in modo asincrono, dunque dobbiamo regolare le operazioni ed attendere quelle in sospeso. Questo è davvero difficile; al momento nessuna delle ioctl supportante dal driver drm/i915 riesce a farlo perfettamente, il che significa che qui ci sono ancora una valanga di lezioni da apprendere.”h]”hX:Le GPU fanno quasi tutto in modo asincrono, dunque dobbiamo regolare le operazioni ed attendere quelle in sospeso. Questo è davvero difficile; al momento nessuna delle ioctl supportante dal driver drm/i915 riesce a farlo perfettamente, il che significa che qui ci sono ancora una valanga di lezioni da apprendere.”…””}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K’hj¾h²hubj˜)”}”(hX* Per fare riferimento al tempo usate sempre ``CLOCK_MONOTONIC``. Oggigiorno questo è quello che viene usato di base da alsa, drm, e v4l. Tuttavia, lasciate allo spazio utente la possibilità di capire quali *timestamp* derivano da domini temporali diversi come il vostro orologio di sistema (fornito dal kernel) oppure un contatore hardware indipendente da qualche parte. Gli orologi divergeranno, ma con questa informazione gli strumenti di analisi delle prestazioni possono compensare il problema. Se il vostro spazio utente può ottenere i valori grezzi degli orologi, allora considerate di esporre anch'essi. * Per descrivere il tempo, usate ``__s64`` per i secondi e ``__u64`` per i nanosecondi. Non è il modo migliore per specificare il tempo, ma è praticamente uno standard. * Verificate che gli input di valori temporali siano normalizzati, e se non lo sono scartateli. Fate attenzione perché la struttura dati ``struct ktime`` del kernel usa interi con segni sia per i secondi che per i nanosecondi. * Per le scadenze (*timeout*) usate valori temporali assoluti. Se siete dei bravi ragazzi e avete reso la vostra ioctl rieseguibile, allora i tempi relativi tendono ad essere troppo grossolani e a causa degli arrotondamenti potrebbero estendere in modo indefinito i tempi di attesa ad ogni riesecuzione. Particolarmente vero se il vostro orologio di riferimento è qualcosa di molto lento come il contatore di *frame*. Con la giacca da avvocato delle specifiche diremmo che questo non è un baco perché tutte le scadenze potrebbero essere estese - ma sicuramente gli utenti vi odieranno quando le animazioni singhiozzano. * Considerate l'idea di eliminare tutte le ioctl sincrone con scadenze, e di sostituirle con una versione asincrona il cui stato può essere consultato attraverso il descrittore di file mediante ``poll``. Questo approccio si sposa meglio in un applicazione guidata dagli eventi. * Sviluppate dei test per i casi estremi, specialmente verificate che i valori di ritorno per gli eventi già completati, le attese terminate con successo, e le attese scadute abbiano senso e servano ai vostri scopi. ”h]”jº)”}”(hhh]”(j¿)”}”(hXePer fare riferimento al tempo usate sempre ``CLOCK_MONOTONIC``. Oggigiorno questo è quello che viene usato di base da alsa, drm, e v4l. Tuttavia, lasciate allo spazio utente la possibilità di capire quali *timestamp* derivano da domini temporali diversi come il vostro orologio di sistema (fornito dal kernel) oppure un contatore hardware indipendente da qualche parte. Gli orologi divergeranno, ma con questa informazione gli strumenti di analisi delle prestazioni possono compensare il problema. Se il vostro spazio utente può ottenere i valori grezzi degli orologi, allora considerate di esporre anch'essi. ”h]”h¼)”}”(hXdPer fare riferimento al tempo usate sempre ``CLOCK_MONOTONIC``. Oggigiorno questo è quello che viene usato di base da alsa, drm, e v4l. Tuttavia, lasciate allo spazio utente la possibilità di capire quali *timestamp* derivano da domini temporali diversi come il vostro orologio di sistema (fornito dal kernel) oppure un contatore hardware indipendente da qualche parte. Gli orologi divergeranno, ma con questa informazione gli strumenti di analisi delle prestazioni possono compensare il problema. Se il vostro spazio utente può ottenere i valori grezzi degli orologi, allora considerate di esporre anch'essi.”h]”(hŒ+Per fare riferimento al tempo usate sempre ”…””}”(hjèh²hh³Nh´NubjÍ)”}”(hŒ``CLOCK_MONOTONIC``”h]”hŒCLOCK_MONOTONIC”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhjèubhŒ‘. Oggigiorno questo è quello che viene usato di base da alsa, drm, e v4l. Tuttavia, lasciate allo spazio utente la possibilità di capire quali ”…””}”(hjèh²hh³Nh´NubjM)”}”(hŒ *timestamp*”h]”hŒ timestamp”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjèubhXŒ derivano da domini temporali diversi come il vostro orologio di sistema (fornito dal kernel) oppure un contatore hardware indipendente da qualche parte. Gli orologi divergeranno, ma con questa informazione gli strumenti di analisi delle prestazioni possono compensare il problema. Se il vostro spazio utente può ottenere i valori grezzi degli orologi, allora considerate di esporre anch’essi.”…””}”(hjèh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K˜hjäubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjáubj¿)”}”(hŒ©Per descrivere il tempo, usate ``__s64`` per i secondi e ``__u64`` per i nanosecondi. Non è il modo migliore per specificare il tempo, ma è praticamente uno standard. ”h]”h¼)”}”(hŒ¨Per descrivere il tempo, usate ``__s64`` per i secondi e ``__u64`` per i nanosecondi. Non è il modo migliore per specificare il tempo, ma è praticamente uno standard.”h]”(hŒPer descrivere il tempo, usate ”…””}”(hj$h²hh³Nh´NubjÍ)”}”(hŒ ``__s64``”h]”hŒ__s64”…””}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhj$ubhŒ per i secondi e ”…””}”(hj$h²hh³Nh´NubjÍ)”}”(hŒ ``__u64``”h]”hŒ__u64”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhj$ubhŒf per i nanosecondi. Non è il modo migliore per specificare il tempo, ma è praticamente uno standard.”…””}”(hj$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K¢hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjáubj¿)”}”(hŒâVerificate che gli input di valori temporali siano normalizzati, e se non lo sono scartateli. Fate attenzione perché la struttura dati ``struct ktime`` del kernel usa interi con segni sia per i secondi che per i nanosecondi. ”h]”h¼)”}”(hŒáVerificate che gli input di valori temporali siano normalizzati, e se non lo sono scartateli. Fate attenzione perché la struttura dati ``struct ktime`` del kernel usa interi con segni sia per i secondi che per i nanosecondi.”h]”(hŒˆVerificate che gli input di valori temporali siano normalizzati, e se non lo sono scartateli. Fate attenzione perché la struttura dati ”…””}”(hj`h²hh³Nh´NubjÍ)”}”(hŒ``struct ktime``”h]”hŒ struct ktime”…””}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhj`ubhŒI del kernel usa interi con segni sia per i secondi che per i nanosecondi.”…””}”(hj`h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K¦hj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjáubj¿)”}”(hXmPer le scadenze (*timeout*) usate valori temporali assoluti. Se siete dei bravi ragazzi e avete reso la vostra ioctl rieseguibile, allora i tempi relativi tendono ad essere troppo grossolani e a causa degli arrotondamenti potrebbero estendere in modo indefinito i tempi di attesa ad ogni riesecuzione. Particolarmente vero se il vostro orologio di riferimento è qualcosa di molto lento come il contatore di *frame*. Con la giacca da avvocato delle specifiche diremmo che questo non è un baco perché tutte le scadenze potrebbero essere estese - ma sicuramente gli utenti vi odieranno quando le animazioni singhiozzano. ”h]”h¼)”}”(hXlPer le scadenze (*timeout*) usate valori temporali assoluti. Se siete dei bravi ragazzi e avete reso la vostra ioctl rieseguibile, allora i tempi relativi tendono ad essere troppo grossolani e a causa degli arrotondamenti potrebbero estendere in modo indefinito i tempi di attesa ad ogni riesecuzione. Particolarmente vero se il vostro orologio di riferimento è qualcosa di molto lento come il contatore di *frame*. Con la giacca da avvocato delle specifiche diremmo che questo non è un baco perché tutte le scadenze potrebbero essere estese - ma sicuramente gli utenti vi odieranno quando le animazioni singhiozzano.”h]”(hŒPer le scadenze (”…””}”(hjŠh²hh³Nh´NubjM)”}”(hŒ *timeout*”h]”hŒtimeout”…””}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjŠubhX~) usate valori temporali assoluti. Se siete dei bravi ragazzi e avete reso la vostra ioctl rieseguibile, allora i tempi relativi tendono ad essere troppo grossolani e a causa degli arrotondamenti potrebbero estendere in modo indefinito i tempi di attesa ad ogni riesecuzione. Particolarmente vero se il vostro orologio di riferimento è qualcosa di molto lento come il contatore di ”…””}”(hjŠh²hh³Nh´NubjM)”}”(hŒ*frame*”h]”hŒframe”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhjŠubhŒÍ. Con la giacca da avvocato delle specifiche diremmo che questo non è un baco perché tutte le scadenze potrebbero essere estese - ma sicuramente gli utenti vi odieranno quando le animazioni singhiozzano.”…””}”(hjŠh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kªhj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjáubj¿)”}”(hXConsiderate l'idea di eliminare tutte le ioctl sincrone con scadenze, e di sostituirle con una versione asincrona il cui stato può essere consultato attraverso il descrittore di file mediante ``poll``. Questo approccio si sposa meglio in un applicazione guidata dagli eventi. ”h]”h¼)”}”(hXConsiderate l'idea di eliminare tutte le ioctl sincrone con scadenze, e di sostituirle con una versione asincrona il cui stato può essere consultato attraverso il descrittore di file mediante ``poll``. Questo approccio si sposa meglio in un applicazione guidata dagli eventi.”h]”(hŒÃConsiderate l’idea di eliminare tutte le ioctl sincrone con scadenze, e di sostituirle con una versione asincrona il cui stato può essere consultato attraverso il descrittore di file mediante ”…””}”(hjÆh²hh³Nh´NubjÍ)”}”(hŒ``poll``”h]”hŒpoll”…””}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhjÆubhŒK. Questo approccio si sposa meglio in un applicazione guidata dagli eventi.”…””}”(hjÆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K´hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjáubj¿)”}”(hŒØSviluppate dei test per i casi estremi, specialmente verificate che i valori di ritorno per gli eventi già completati, le attese terminate con successo, e le attese scadute abbiano senso e servano ai vostri scopi. ”h]”h¼)”}”(hŒÖSviluppate dei test per i casi estremi, specialmente verificate che i valori di ritorno per gli eventi già completati, le attese terminate con successo, e le attese scadute abbiano senso e servano ai vostri scopi.”h]”hŒÖSviluppate dei test per i casi estremi, specialmente verificate che i valori di ritorno per gli eventi già completati, le attese terminate con successo, e le attese scadute abbiano senso e servano ai vostri scopi.”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K¹hjìubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjáubeh}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j¹h³jh´K˜hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1j—h³jh´K˜hj¾h²hubeh}”(h]”Œtempi-attese-e-mancate-scadenze”ah ]”h"]”Œ tempi, attese e mancate scadenze”ah$]”h&]”uh1j<hj>h²hh³jh´Kubj=)”}”(hhh]”(jB)”}”(hŒNon perdere risorse”h]”hŒNon perdere risorse”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjh²hh³jh´K¿ubh¼)”}”(hXNel suo piccolo il driver drm implementa un sistema operativo specializzato per certe GPU. Questo significa che il driver deve esporre verso lo spazio utente tonnellate di agganci per accedere ad oggetti e altre risorse. Farlo correttamente porterà con se alcune insidie:”h]”hXNel suo piccolo il driver drm implementa un sistema operativo specializzato per certe GPU. Questo significa che il driver deve esporre verso lo spazio utente tonnellate di agganci per accedere ad oggetti e altre risorse. Farlo correttamente porterà con se alcune insidie:”…””}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KÀhjh²hubj˜)”}”(hXW* Collegate sempre la vita di una risorsa creata dinamicamente, a quella del descrittore di file. Considerate una mappatura 1:1 se la vostra risorsa dev'essere condivisa fra processi - passarsi descrittori di file sul socket unix semplifica la gestione anche per lo spazio utente. * Dev'esserci sempre Il supporto ``O_CLOEXEC``. * Assicuratevi di avere abbastanza isolamento fra utenti diversi. Di base impostate uno spazio dei nomi riservato per ogni descrittore di file, il che forzerà ogni condivisione ad essere esplicita. Usate uno spazio più globale per dispositivo solo se gli oggetti sono effettivamente unici per quel dispositivo. Un controesempio viene dall'interfaccia drm modeset, dove oggetti specifici di dispositivo, come i connettori, condividono uno spazio dei nomi con oggetti per il *framebuffer*, ma questi non sono per niente condivisi. Uno spazio separato, privato di base, per i *framebuffer* sarebbe stato meglio. * Pensate all'identificazione univoca degli agganci verso lo spazio utente. Per esempio, per la maggior parte dei driver drm, si considera fallace la doppia sottomissione di un oggetto allo stesso comando ioctl. Ma per evitarlo, se gli oggetti sono condivisibili, lo spazio utente ha bisogno di sapere se il driver ha importato un oggetto da un altro processo. Non l'ho ancora provato, ma considerate l'idea di usare il numero di inode come identificatore per i descrittori di file condivisi - che poi è come si distinguono i veri file. Sfortunatamente, questo richiederebbe lo sviluppo di un vero e proprio filesystem virtuale nel kernel. ”h]”jº)”}”(hhh]”(j¿)”}”(hXCollegate sempre la vita di una risorsa creata dinamicamente, a quella del descrittore di file. Considerate una mappatura 1:1 se la vostra risorsa dev'essere condivisa fra processi - passarsi descrittori di file sul socket unix semplifica la gestione anche per lo spazio utente. ”h]”h¼)”}”(hXCollegate sempre la vita di una risorsa creata dinamicamente, a quella del descrittore di file. Considerate una mappatura 1:1 se la vostra risorsa dev'essere condivisa fra processi - passarsi descrittori di file sul socket unix semplifica la gestione anche per lo spazio utente.”h]”hXCollegate sempre la vita di una risorsa creata dinamicamente, a quella del descrittore di file. Considerate una mappatura 1:1 se la vostra risorsa dev’essere condivisa fra processi - passarsi descrittori di file sul socket unix semplifica la gestione anche per lo spazio utente.”…””}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KÅhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj;ubj¿)”}”(hŒ.Dev'esserci sempre Il supporto ``O_CLOEXEC``. ”h]”h¼)”}”(hŒ-Dev'esserci sempre Il supporto ``O_CLOEXEC``.”h]”(hŒ!Dev’esserci sempre Il supporto ”…””}”(hjZh²hh³Nh´NubjÍ)”}”(hŒ ``O_CLOEXEC``”h]”hŒ O_CLOEXEC”…””}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÌhjZubhŒ.”…””}”(hjZh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KÊhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj;ubj¿)”}”(hXaAssicuratevi di avere abbastanza isolamento fra utenti diversi. Di base impostate uno spazio dei nomi riservato per ogni descrittore di file, il che forzerà ogni condivisione ad essere esplicita. Usate uno spazio più globale per dispositivo solo se gli oggetti sono effettivamente unici per quel dispositivo. Un controesempio viene dall'interfaccia drm modeset, dove oggetti specifici di dispositivo, come i connettori, condividono uno spazio dei nomi con oggetti per il *framebuffer*, ma questi non sono per niente condivisi. Uno spazio separato, privato di base, per i *framebuffer* sarebbe stato meglio. ”h]”h¼)”}”(hX`Assicuratevi di avere abbastanza isolamento fra utenti diversi. Di base impostate uno spazio dei nomi riservato per ogni descrittore di file, il che forzerà ogni condivisione ad essere esplicita. Usate uno spazio più globale per dispositivo solo se gli oggetti sono effettivamente unici per quel dispositivo. Un controesempio viene dall'interfaccia drm modeset, dove oggetti specifici di dispositivo, come i connettori, condividono uno spazio dei nomi con oggetti per il *framebuffer*, ma questi non sono per niente condivisi. Uno spazio separato, privato di base, per i *framebuffer* sarebbe stato meglio.”h]”(hXÛAssicuratevi di avere abbastanza isolamento fra utenti diversi. Di base impostate uno spazio dei nomi riservato per ogni descrittore di file, il che forzerà ogni condivisione ad essere esplicita. Usate uno spazio più globale per dispositivo solo se gli oggetti sono effettivamente unici per quel dispositivo. Un controesempio viene dall’interfaccia drm modeset, dove oggetti specifici di dispositivo, come i connettori, condividono uno spazio dei nomi con oggetti per il ”…””}”(hj„h²hh³Nh´NubjM)”}”(hŒ *framebuffer*”h]”hŒ framebuffer”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj„ubhŒW, ma questi non sono per niente condivisi. Uno spazio separato, privato di base, per i ”…””}”(hj„h²hh³Nh´NubjM)”}”(hŒ *framebuffer*”h]”hŒ framebuffer”…””}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jLhj„ubhŒ sarebbe stato meglio.”…””}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KÌhj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj;ubj¿)”}”(hX€Pensate all'identificazione univoca degli agganci verso lo spazio utente. Per esempio, per la maggior parte dei driver drm, si considera fallace la doppia sottomissione di un oggetto allo stesso comando ioctl. Ma per evitarlo, se gli oggetti sono condivisibili, lo spazio utente ha bisogno di sapere se il driver ha importato un oggetto da un altro processo. Non l'ho ancora provato, ma considerate l'idea di usare il numero di inode come identificatore per i descrittori di file condivisi - che poi è come si distinguono i veri file. Sfortunatamente, questo richiederebbe lo sviluppo di un vero e proprio filesystem virtuale nel kernel. ”h]”h¼)”}”(hX~Pensate all'identificazione univoca degli agganci verso lo spazio utente. Per esempio, per la maggior parte dei driver drm, si considera fallace la doppia sottomissione di un oggetto allo stesso comando ioctl. Ma per evitarlo, se gli oggetti sono condivisibili, lo spazio utente ha bisogno di sapere se il driver ha importato un oggetto da un altro processo. Non l'ho ancora provato, ma considerate l'idea di usare il numero di inode come identificatore per i descrittori di file condivisi - che poi è come si distinguono i veri file. Sfortunatamente, questo richiederebbe lo sviluppo di un vero e proprio filesystem virtuale nel kernel.”h]”hX„Pensate all’identificazione univoca degli agganci verso lo spazio utente. Per esempio, per la maggior parte dei driver drm, si considera fallace la doppia sottomissione di un oggetto allo stesso comando ioctl. Ma per evitarlo, se gli oggetti sono condivisibili, lo spazio utente ha bisogno di sapere se il driver ha importato un oggetto da un altro processo. Non l’ho ancora provato, ma considerate l’idea di usare il numero di inode come identificatore per i descrittori di file condivisi - che poi è come si distinguono i veri file. Sfortunatamente, questo richiederebbe lo sviluppo di un vero e proprio filesystem virtuale nel kernel.”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KÖhj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj;ubeh}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j¹h³jh´KÅhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j—h³jh´KÅhjh²hubeh}”(h]”Œnon-perdere-risorse”ah ]”h"]”Œnon perdere risorse”ah$]”h&]”uh1j<hj>h²hh³jh´K¿ubj=)”}”(hhh]”(jB)”}”(hŒUltimo, ma non meno importante”h]”hŒUltimo, ma non meno importante”…””}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjèh²hh³jh´Kâubh¼)”}”(hŒ6Non tutti i problemi si risolvono con una nuova ioctl:”h]”hŒ6Non tutti i problemi si risolvono con una nuova ioctl:”…””}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kähjèh²hubjº)”}”(hhh]”(j¿)”}”(hX¹Pensateci su due o tre volte prima di implementare un'interfaccia privata per un driver. Ovviamente è molto più veloce seguire questa via piuttosto che buttarsi in lunghe discussioni alla ricerca di una soluzione più generica. Ed a volte un'interfaccia privata è quello che serve per sviluppare un nuovo concetto. Ma alla fine, una volta che c'è un'interfaccia generica a disposizione finirete per mantenere due interfacce. Per sempre. ”h]”h¼)”}”(hX¸Pensateci su due o tre volte prima di implementare un'interfaccia privata per un driver. Ovviamente è molto più veloce seguire questa via piuttosto che buttarsi in lunghe discussioni alla ricerca di una soluzione più generica. Ed a volte un'interfaccia privata è quello che serve per sviluppare un nuovo concetto. Ma alla fine, una volta che c'è un'interfaccia generica a disposizione finirete per mantenere due interfacce. Per sempre.”h]”hXÀPensateci su due o tre volte prima di implementare un’interfaccia privata per un driver. Ovviamente è molto più veloce seguire questa via piuttosto che buttarsi in lunghe discussioni alla ricerca di una soluzione più generica. Ed a volte un’interfaccia privata è quello che serve per sviluppare un nuovo concetto. Ma alla fine, una volta che c’è un’interfaccia generica a disposizione finirete per mantenere due interfacce. Per sempre.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kæhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjh²hh³jh´Nubj¿)”}”(hXÇConsiderate interfacce alternative alle ioctl. Gli attributi sysfs sono molto meglio per impostazioni che sono specifiche di un dispositivo, o per sotto-oggetti con una vita piuttosto statica (come le uscite dei connettori in drm con tutti gli attributi per la sovrascrittura delle rilevazioni). O magari solo il vostro sistema di test ha bisogno di una certa interfaccia, e allora debugfs (che non ha un'interfaccia stabile) sarà la soluzione migliore. ”h]”h¼)”}”(hXÆConsiderate interfacce alternative alle ioctl. Gli attributi sysfs sono molto meglio per impostazioni che sono specifiche di un dispositivo, o per sotto-oggetti con una vita piuttosto statica (come le uscite dei connettori in drm con tutti gli attributi per la sovrascrittura delle rilevazioni). O magari solo il vostro sistema di test ha bisogno di una certa interfaccia, e allora debugfs (che non ha un'interfaccia stabile) sarà la soluzione migliore.”h]”hXÈConsiderate interfacce alternative alle ioctl. Gli attributi sysfs sono molto meglio per impostazioni che sono specifiche di un dispositivo, o per sotto-oggetti con una vita piuttosto statica (come le uscite dei connettori in drm con tutti gli attributi per la sovrascrittura delle rilevazioni). O magari solo il vostro sistema di test ha bisogno di una certa interfaccia, e allora debugfs (che non ha un’interfaccia stabile) sarà la soluzione migliore.”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kíhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjh²hh³jh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j¹h³jh´Kæhjèh²hubh¼)”}”(hX—Per concludere. Questo gioco consiste nel fare le cose giuste fin da subito, dato che se il vostro driver diventa popolare e la piattaforma hardware longeva finirete per mantenere le vostre ioctl per sempre. Potrete tentare di deprecare alcune orribili ioctl, ma ci vorranno anni per riuscirci effettivamente. E ancora, altri anni prima che sparisca l'ultimo utente capace di lamentarsi per una regressione.”h]”hX™Per concludere. Questo gioco consiste nel fare le cose giuste fin da subito, dato che se il vostro driver diventa popolare e la piattaforma hardware longeva finirete per mantenere le vostre ioctl per sempre. Potrete tentare di deprecare alcune orribili ioctl, ma ci vorranno anni per riuscirci effettivamente. E ancora, altri anni prima che sparisca l’ultimo utente capace di lamentarsi per una regressione.”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kôhjèh²hubeh}”(h]”Œultimo-ma-non-meno-importante”ah ]”h"]”Œultimo, ma non meno importante”ah$]”h&]”uh1j<hj>h²hh³jh´Kâubeh}”(h]”Œ(come-evitare-di-raffazzonare-delle-ioctl”ah ]”h"]”Œ*(come evitare di) raffazzonare delle ioctl”ah$]”h&]”uh1j<hhh²hh³jh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”juh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(jANŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”jŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j[jXj¯j¬jujrj»j¸jjjåjâjSjPuŒ nametypes”}”(j[‰j¯‰ju‰j»‰j‰jå‰jS‰uh}”(jXj>j¬jšjrj²j¸jxjj¾jâjjPjèuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ?Documentation/translations/it_IT/process/botching-up-ioctls.rst”(NNNNt”†”aŒ decoration”Nh²hub.