From owner-freebsd-current@FreeBSD.ORG Tue Dec 28 08:47:39 2004 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 06E1F16A4CE for ; Tue, 28 Dec 2004 08:47:39 +0000 (GMT) Received: from relay03.pair.com (relay03.pair.com [209.68.5.17]) by mx1.FreeBSD.org (Postfix) with SMTP id 528E543D53 for ; Tue, 28 Dec 2004 08:47:38 +0000 (GMT) (envelope-from pho@holm.cc) Received: (qmail 7038 invoked from network); 28 Dec 2004 08:47:37 -0000 Received: from unknown (HELO peter.osted.lan) (unknown) by unknown with SMTP; 28 Dec 2004 08:47:37 -0000 X-pair-Authenticated: 80.164.63.199 Received: from peter.osted.lan (localhost.osted.lan [127.0.0.1]) by peter.osted.lan (8.13.1/8.13.1) with ESMTP id iBS8lahR006647; Tue, 28 Dec 2004 09:47:36 +0100 (CET) (envelope-from pho@peter.osted.lan) Received: (from pho@localhost) by peter.osted.lan (8.13.1/8.13.1/Submit) id iBS8lVe4006646; Tue, 28 Dec 2004 09:47:31 +0100 (CET) (envelope-from pho) Date: Tue, 28 Dec 2004 09:47:31 +0100 From: Peter Holm To: Bosko Milekic Message-ID: <20041228084731.GA766@peter.osted.lan> References: <20041209144233.GA46928@peter.osted.lan> <20041220234103.GA59225@technokratis.com> <20041222210553.GA28108@peter.osted.lan> <20041222221540.GA70052@technokratis.com> <20041226161153.GA74592@peter.osted.lan> <20041226181738.GA21533@technokratis.com> <20041226225651.GA87178@peter.osted.lan> <20041227013745.GA5267@technokratis.com> <20041227040216.GA44588@technokratis.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20041227040216.GA44588@technokratis.com> User-Agent: Mutt/1.4.2.1i cc: current@freebsd.org Subject: Re: panic: uma_zone_slab is looping X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Dec 2004 08:47:39 -0000 On Sun, Dec 26, 2004 at 11:02:16PM -0500, Bosko Milekic wrote: > > > I'll have to reserve some more time to think about this. One way I > > think it might be solvable would be to change that check that > > triggers the NULL return explicitly check for the bucketzone, and not > > for all UMA_ZONE_INTERNAL zones; I need to think this through a little > > more. > > Please try the attached patch and let me know if with it you can or > cannot trigger the original (seemingly infinite) looping. Although I > still haven't quite figured out how the described scenario could lead > to infinite looping exactly (I did conclude that it could lead to some > looping, though), the patch is worth trying as I believe the scenario > *could* occur. > After more than 18 hours of testing with your patch I ran into a (unrelated ?) "panic: mutex vm object not owned": http://www.holm.cc/stress/log/freeze06.html > -- > Bosko Milekic > bmilekic@technokratis.com > bmilekic@FreeBSD.org > Index: uma_core.c > =================================================================== > RCS file: /home/ncvs/src/sys/vm/uma_core.c,v > retrieving revision 1.111 > diff -u -r1.111 uma_core.c > --- uma_core.c 26 Dec 2004 00:35:12 -0000 1.111 > +++ uma_core.c 27 Dec 2004 03:58:25 -0000 > @@ -1939,9 +1939,19 @@ > * buckets there too we will recurse in kmem_alloc and bad > * things happen. So instead we return a NULL bucket, and make > * the code that allocates buckets smart enough to deal with it > + * > + * XXX: While we want this protection for the bucket zones so that > + * recursion from the VM is handled (and the calling code that > + * allocates buckets knows how to deal with it), we do not want > + * to prevent allocation from the slab header zones (slabzone > + * and slabrefzone) if uk_recurse is not zero for them. The > + * reason is that it could lead to NULL being returned for > + * slab header allocations even in the M_WAITOK case, and the > + * caller can't handle that. > */ > if (keg->uk_flags & UMA_ZFLAG_INTERNAL && keg->uk_recurse != 0) > - return (NULL); > + if ((zone != slabzone) && (zone != slabrefzone)) > + return (NULL); > > slab = NULL; > -- Peter Holm