contigmalloc(9) doesn't honour M_NOWAIT.

From: Pawel Jakub Dawidek <pjd_at_FreeBSD.org>
Date: Tue, 9 May 2006 16:03:12 +0200
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.

-- 
Pawel Jakub Dawidek                       http://www.wheel.pl
pjd_at_FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!

Received on Tue May 09 2006 - 12:05:01 UTC

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