[so2] [Tema 3] Problema write crc

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Wed May 1 16:40:30 EEST 2019


Catalin Neagu via so2 <so2 at cursuri.cs.pub.ro> writes:
> Salut,
>
> Am ajuns la partea la care trebuie sa scriu in sectiunea de CRC-uri. La un
> moment dat, incerc sa imi fac un bio special pentru a scrie un CRC pentru
> un sector, "crc_bio = bio_alloc(GFP_NOIO, 1)", dar ajung la un kernel bug:
>
> "BUG: sleeping function called from invalid context at mm/mempool.c:375
> in_atomic(): 1, irqs_disabled(): 0, pid: 238, name: run-test
> INFO: lockdep is turned off.
> CPU: 0 PID: 238 Comm: run-test Tainted: G           O      4.19.0+ #1
> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1
> 04/01/2014
> Call Trace:
>  dump_stack+0x66/0x96
>  ___might_sleep+0x155/0x250
>  __might_sleep+0x32/0x90
>  mempool_alloc+0x89/0x140
>  bio_alloc_bioset+0x16d/0x300
>  ? vprintk_func+0x38/0xc0
>  ? kmap_atomic_prot+0x36/0xc0
>  ssr_make_request+0x29b/0x6a6 [ssr]
>  ? wait_woken+0xa0/0xa0
>  generic_make_request+0x24e/0x450
> ..."
>
> Gresesc ceva cand aloc bio-ul? Am incercat si cu GFP_NOIO | GFP_ATOMIC si
> nu rezolva nimic... Poate nu am inteles prea bine cum sa fac partea de
> scriere a crc-urilor. Daca a mai avut cineva problema sau daca cumva
> gresesc abordarea, puteti sa-mi dati un hint, va rog?

ssr_make_request rulează în context întrerupere/botom-half. Cel mai bine
este ca tratarea bio-urilor, incluzând alocarea și așteptarea lor să o
faceți într-un work, așa cum e precizat și în enunț:
---
O singură funcție de prelucrare a cererilor pentru dispozitive de tip
bloc poate fi activă la un moment dat în cadrul unei stive de apeluri
(mai multe detalii aici). Va trebui să submiteți cererile pentru
dispozitivele fizice dintr-un kernel thread; recomandăm folosirea
workqueues.
---

Răzvan


More information about the so2 mailing list