Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 May 2005 13:40:35 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        freebsd-hackers@freebsd.org
Subject:   problems with new the "contigmalloc" routine
Message-ID:  <200505201340.36176.hselasky@c2i.net>

next in thread | raw e-mail | index | archive | help
Hi,

I just hit some problems with the new "contigmalloc()" routine in 
FreeBSD-6-current, which is used by "bus_dmamem_alloc()".

Firstly it locks Giant, which cause locking order reversals when allocating 
memory from certain contexts. Secondly it sleeps even if flag M_NOWAIT is 
passed. Thirdly it does not support flag M_ZERO.


Can someone explain why these changes have been made?


Why doesn't "contigmalloc()" give a warning when an invalid flag is passed?


Are these bugs in "contigmalloc()"? 


Or does the code using "contigmalloc()" have to be changed?


kernel: lock order reversal
kernel: 1st 0xc175a6c8 ugen lock (ugen lock) 
@ /usr/src/sys/dev/usb2/_ugen.c:1452
kernel: 2nd 0xc09bdde0 Giant (Giant) 
@ /usr/src/sys/vm/vm_contig.c:550
kernel: KDB: stack backtrace:
kernel: witness_checkorder(c09bdde0,9,c08e34af,226) at 
witness_checkorder+0x50c
kernel: _mtx_lock_flags(c09bdde0,0,c08e34af,226,8) at 
_mtx_lock_flags+0x40
kernel: contigmalloc(184ec,c0952c60,1,0,ffffffff) at 
contigmalloc+0x45
kernel: bus_dmamem_alloc(c1aacc00,d4cd7974,5,d4cd7978) at 
bus_dmamem_alloc+0x61
kernel: usb_alloc_mem(184e0,4,8,8,d4164ae4) at 
usb_alloc_mem+0x53
...

kernel: malloc(M_WAITOK) of "g_bio", forcing M_NOWAIT with 
the following non-sleepable locks held:
kernel: exclusive sleep mutex ugen lock r = 0 (0xc175a6c8) 
locked @ /usr/src/sys/dev/usb2/_ugen.c:1452
kernel: KDB: stack backtrace:
kernel: witness_warn(5,0,c08e3022,c08c3c87) at 
witness_warn+0x1a8
kernel: uma_zalloc_arg(c103dc60,0,102) at uma_zalloc_arg+0x4b
kernel: g_allotpages(c1af918c,d4cd783c,1,1,d4cd7800) at 
swap_pager_putpages+0x413
kernel: vm_pageout_flush(d4cd783c,1,1,c1460d88,c1461058) at 
vm_pageout_flush+0xf5
kernel: vm_contig_launder_page(e269,0,c0a0b8d0,ffffffff,f) at  
vm_contig_launder_page+0xa8
kernel: vm_page_alloc_contig(19,0,0,ffffffff,10) at 
vm_page_alloc_contig+0x204
kernel: contigmalloc(184ec,c0952c60,1,0,ffffffff) at 
contigmalloc+0x337
kernel: bus_dmamem_alloc(c1aacc00,d4cd7974,5,d4cd7978) at 
bus_dmamem_alloc+0x61
kernel: usb_alloc_mem(184e0,4,8,8,d4164ae4) at 
usb_alloc_mem+0x53
...

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200505201340.36176.hselasky>