Re: contigmalloc(9) doesn't honour M_NOWAIT.

From: Brian Fundakowski Feldman <green_at_FreeBSD.org>
Date: Tue, 9 May 2006 11:26:42 -0400
On Tue, May 09, 2006 at 04:03:12PM +0200, Pawel Jakub Dawidek wrote:
> Hi.
> 
> Using a USB pendrive can lead to kernel panic because of the issue
> mentioned in the subject.
> 
> Trying sleep, but thread marked as sleeping prohibited
> KDB: stack backtrace:
> kdb_backtrace(c0602d36,1,c0602cb2,112,2) at kdb_backtrace+0x2e
> sleepq_add(d7e13af0,c064c0e8,c060f7fd,0,0) at sleepq_add+0xba
> msleep(d7e13af0,c064c0e8,44,c060f7fd,0) at msleep+0x209
> bwait(d7e13af0,44,c060f7fd,50a,0) at bwait+0x60
> swap_pager_putpages(c701ed98,e3c3ba44,1,1,e3c3ba00) at swap_pager_putpages+0x497
> vm_pageout_flush(e3c3ba44,1,1,61,3db) at vm_pageout_flush+0x172
> vm_contig_launder_page(c1ccbdb8,0,0,1ff,ffffffff) at vm_contig_launder_page+0x29b
> vm_page_alloc_contig(4,0,0,ffffffff,1) at vm_page_alloc_contig+0x398
> contigmalloc(4000,c0627840,1,0,ffffffff) at contigmalloc+0xb5
> bus_dmamem_alloc(c455b280,c6531048,5,c6531044,ffffffff) at bus_dmamem_alloc+0xde
> usb_block_allocmem(1,c51a913c,c479969c,c51a9100,c51a9100) at usb_block_allocmem+0x11a
> usb_allocmem(c455f000,4000,0,c51a913c,e3c3bbc4) at usb_allocmem+0x11c
> ehci_allocm(c455f000,c51a913c,4000,0,e3c3bbf0) at ehci_allocm+0x25
> usbd_transfer(c51a9100,c4816400,c503ac00,d9cc1000,4000) at usbd_transfer+0xec
> umass_setup_transfer(d9cc1000,4000,4,c51a9100,e3c3bc1c) at umass_setup_transfer+0x49
> umass_bbb_state(c51b8c00,c503ac00,0,1f,0) at umass_bbb_state+0xd6
> usb_transfer_complete(c51b8c00,c51b8c70,adc,e3c3bcb0,0) at usb_transfer_complete+0x1e7
> ehci_softintr(c455f000,c05fd1d2,e3c3bcb0,c0499a28,e6047000) at ehci_softintr+0x17d
> ehci_intr1(c455f000,0,c05fd1d2,295,1) at ehci_intr1+0x276
> ithread_execute_handlers(c45da8d0,c4510800,c05fd1d2,2f9,c45db1b0) at ithread_execute_handlers+0x128
> ithread_loop(c460c2f0,e3c3bd38,c05fcfab,32b,0) at ithread_loop+0x83
> fork_exit(c048b2e0,c460c2f0,e3c3bd38) at fork_exit+0xc3
> fork_trampoline() at fork_trampoline+0x8
> --- trap 0x1, eip = 0, esp = 0xe3c3bd6c, ebp = 0 ---
> 
> Umass tries to allocate memory using bus_dmamem_alloc() with
> BUS_DMA_NOWAIT flag, but contigmalloc() ignores the flag and simply can
> sleep waiting for some memory to be reclaimed.
> We don't allow to sleep in interrupt context, so the kernel panics.
> 
> PS. I replaced the assertion on my laptop with a printf, because it was
>     triggered way too often.

Please refer to the documentation:
     The flags parameter modifies contigmalloc()'s behaviour as follows:

     M_ZERO  Causes the allocated physical memory to be zero filled.
     Other flags (if present) are ignored.

-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green_at_FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\
Received on Tue May 09 2006 - 13:26:43 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:55 UTC