Aiuto per scrivere una patch

3 risposte [Ultimo contenuto]
Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Nel kernel di Wheezy se ricompilato disabilitando CONFIG_KALLSYMS poi inserendo un modulo (es. iso9660) restituisce nell'output di dmesg, il warning:

vmalloc: allocation failure: 0 bytes
modprobe: page allocation failure: order:0, mode:0xd2
Pid: 2078, comm: modprobe Not tainted 3.2.57 #2
Call Trace:
 [<ffffffff8107f1f8>] ? 0xffffffff8107f1f8
 [<ffffffff810587b7>] ? 0xffffffff810587b7
 [<ffffffff8109c261>] ? 0xffffffff8109c261
 [<ffffffff810587b7>] ? 0xffffffff810587b7
 [<ffffffff81015542>] ? 0xffffffff81015542
 [<ffffffff810587b7>] ? 0xffffffff810587b7
 [<ffffffff810587b7>] ? 0xffffffff810587b7
 [<ffffffff81058f12>] ? 0xffffffff81058f12
 [<ffffffff810597ec>] ? 0xffffffff810597ec
 [<ffffffff81385ffb>] ? 0xffffffff81385ffb
Mem-Info:
DMA32 per-cpu:
CPU    0: hi:  186, btch:  31 usd: 116
CPU    1: hi:  186, btch:  31 usd:  49
CPU    2: hi:  186, btch:  31 usd: 124
CPU    3: hi:  186, btch:  31 usd:  64
active_anon:1762 inactive_anon:29 isolated_anon:0
 active_file:2417 inactive_file:4069 isolated_file:0
 unevictable:0 dirty:34 writeback:0 unstable:0
 free:239765 slab_reclaimable:693 slab_unreclaimable:2382
 mapped:925 shmem:63 pagetables:267 bounce:0
DMA32 free:959060kB min:45056kB low:56320kB high:67584kB active_anon:7048kB inactive_anon:116kB active_file:9668kB inactive_file:16276kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:1031656kB mlocked:0kB dirty:136kB writeback:0kB mapped:3700kB shmem:252kB slab_reclaimable:2772kB slab_unreclaimable:9528kB kernel_stack:608kB pagetables:1068kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0
DMA32: 31*4kB 158*8kB 121*16kB 22*32kB 14*64kB 4*128kB 5*256kB 6*512kB 3*1024kB 2*2048kB 230*4096kB = 959036kB
6563 total pagecache pages
262112 pages RAM
6076 pages reserved
4486 pages shared
13757 pages non-shared

lo fa anche con il 3.2.60 e non vorrei abilitare quella opzione di compilazione perché senza ottengo un kernel molto più piccolo.
Stando a quanto discusso qui è stato fixato nella versione 3.8-rc1
Dopo un googling penso di aver trovato il codice da applicare, in questa pagina e suppongo il codice sia questo.
Qualche anima pia ha modo di dirmi come procedere per scrivere la patch? Smile

Ciao, Franco

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Cerco di esporre meglio il problema: il Debian kernel team decide di applicare le sue patch all'ultimo kernel vanilla, esempio il 3.2.60, come avviene questo procedimento? Visto che da un lato si trovano le loro patch dall'altro il nuovo sorgente cui applicarle, devono fare a mano o c'è un procedimento per automatizzare il tutto?
Per un sviluppatore possono sembrare cose ovvie, ma per chi li affronta per la prima volta è veramente poco chiaro.
Grazie per ogni risposta.

Ciao, Franco

Ritratto di mcortese
mcortese
(Moderatore)
Offline
Moderatore
Iscritto: 27/02/2009
Messaggi: 2918

Gli sviluppatori del kernel lavorano sempre sull'ultima versione del codice. Questo vuol dire che se prendi una patch scritta per il kernel X e cerchi di applicarla al kernel Y potrebbe funzionare oppure no, a seconda di quanto pesanti sono le altre differenze tra X e Y.

Nel tuo caso, visto che devi modificare un solo file e le righe che cambiano sono solo una ventina, ti consiglio di procedere a mano, cerando nei tuoi sorgenti quelle righe che la patch mostra in rosso e sostituendole con quelle in verde. Se sei fortunato, le troverai (probabilmente ad un numero di riga diverso da quello indicato) tali e quali e potrai sostituirle. Se però ti accorgessi che le righe da sostituire sono diverse, faresti meglio a rinunciare subito: modificare del codice che non si capisce è molto pericoloso!

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Avevo già controllato se le linee di codice corrispondevano Smile quindi ho roceduto alla modifica manualmente come mi hai suggerito, ma il sorgente del kernel cambia abbastanza spesso (il 3.2.60 è stato aggiornato 2 volte) e dopo aver letto il manuale diffutils mi sono scritto ugualmente una patch, per crearla ho proceduto come segue:
Prima di modificare i sorgenti ho fatto una copia dei files nella home directory:

~$ cp linux-source-3.2/kernel/module.c ~/module.c
~$ cp linux-source-3.2/arch/x86/Makefile ~/Makefile

Dopo l'editing con il comando diff ho creato la patch:
~$ diff -u module.c linux-source-3.2/kernel/module.c >Linux_vmalloc0+Optimization.patch
~$ diff -u Makefile linux-source-3.2/arch/x86/Makefile >>Linux_vmalloc0+Optimization.patch

Il comando patch permette di contenere patch per più files in un solo file .patch. Per applicare la patch ho spostato i files originali dalla home directory nelle directory dei sorgenti sovrascrivendo i files modificati, poi con il comando:
~$ patch -p0 -i Linux_vmalloc0+Optimization.patch
patch li ha modificati di nuovo.
Per comodità ho aggiunto alla patch di module.c delle ottimizzazioni al Makefile discusse qui
Ora il kernel non si arrabbia più con CONFIG_KALLSYMS=n quando carica isofs e ho notato che oltre al kernel anche i moduli ora sono più piccoli. Big Grin

Ciao, Franco