From owner-freebsd-hackers@FreeBSD.ORG Fri May 20 11:41:43 2005 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3F6C916A4CE for ; Fri, 20 May 2005 11:41:43 +0000 (GMT) Received: from swip.net (mailfe07.swip.net [212.247.154.193]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8512E43D98 for ; Fri, 20 May 2005 11:41:42 +0000 (GMT) (envelope-from hselasky@c2i.net) X-T2-Posting-ID: Y1QAsIk9O44SO+J/q9KNyQ== Received: from mp-217-209-234.daxnet.no ([193.217.209.234] verified) by mailfe07.swip.net (CommuniGate Pro SMTP 4.3c5) with ESMTP id 174416752 for freebsd-hackers@freebsd.org; Fri, 20 May 2005 13:39:47 +0200 From: Hans Petter Selasky To: freebsd-hackers@freebsd.org Date: Fri, 20 May 2005 13:40:35 +0200 User-Agent: KMail/1.7 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200505201340.36176.hselasky@c2i.net> Subject: problems with new the "contigmalloc" routine X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: hselasky@c2i.net List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 May 2005 11:41:43 -0000 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