<div dir="ltr"><div>Multumesc, asta era problema.<br><br></div>Catalin<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 1 May 2019 at 16:40, Razvan Deaconescu via so2 <<a href="mailto:so2@cursuri.cs.pub.ro">so2@cursuri.cs.pub.ro</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Catalin Neagu via so2 <<a href="mailto:so2@cursuri.cs.pub.ro" target="_blank">so2@cursuri.cs.pub.ro</a>> writes:<br>
> Salut,<br>
><br>
> Am ajuns la partea la care trebuie sa scriu in sectiunea de CRC-uri. La un<br>
> moment dat, incerc sa imi fac un bio special pentru a scrie un CRC pentru<br>
> un sector, "crc_bio = bio_alloc(GFP_NOIO, 1)", dar ajung la un kernel bug:<br>
><br>
> "BUG: sleeping function called from invalid context at mm/mempool.c:375<br>
> in_atomic(): 1, irqs_disabled(): 0, pid: 238, name: run-test<br>
> INFO: lockdep is turned off.<br>
> CPU: 0 PID: 238 Comm: run-test Tainted: G O 4.19.0+ #1<br>
> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1<br>
> 04/01/2014<br>
> Call Trace:<br>
> dump_stack+0x66/0x96<br>
> ___might_sleep+0x155/0x250<br>
> __might_sleep+0x32/0x90<br>
> mempool_alloc+0x89/0x140<br>
> bio_alloc_bioset+0x16d/0x300<br>
> ? vprintk_func+0x38/0xc0<br>
> ? kmap_atomic_prot+0x36/0xc0<br>
> ssr_make_request+0x29b/0x6a6 [ssr]<br>
> ? wait_woken+0xa0/0xa0<br>
> generic_make_request+0x24e/0x450<br>
> ..."<br>
><br>
> Gresesc ceva cand aloc bio-ul? Am incercat si cu GFP_NOIO | GFP_ATOMIC si<br>
> nu rezolva nimic... Poate nu am inteles prea bine cum sa fac partea de<br>
> scriere a crc-urilor. Daca a mai avut cineva problema sau daca cumva<br>
> gresesc abordarea, puteti sa-mi dati un hint, va rog?<br>
<br>
ssr_make_request rulează în context întrerupere/botom-half. Cel mai bine<br>
este ca tratarea bio-urilor, incluzând alocarea și așteptarea lor să o<br>
faceți într-un work, așa cum e precizat și în enunț:<br>
---<br>
O singură funcție de prelucrare a cererilor pentru dispozitive de tip<br>
bloc poate fi activă la un moment dat în cadrul unei stive de apeluri<br>
(mai multe detalii aici). Va trebui să submiteți cererile pentru<br>
dispozitivele fizice dintr-un kernel thread; recomandăm folosirea<br>
workqueues.<br>
---<br>
<br>
Răzvan<br>
_______________________________________________<br>
<a href="http://ocw.cs.pub.ro/courses/so2/resurse/lista-discutii" rel="noreferrer" target="_blank">http://ocw.cs.pub.ro/courses/so2/resurse/lista-discutii</a></blockquote></div>