panic: uma_zone_slab is looping
Peter Holm
peter at holm.cc
Tue Dec 28 00:47:39 PST 2004
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 at technokratis.com
> bmilekic at 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
More information about the freebsd-current
mailing list