Consistently enforce the restriction against calling malloc/free when in a
authorjtl <jtl@FreeBSD.org>
Thu, 19 Nov 2015 14:04:53 +0000 (14:04 +0000)
committerjtl <jtl@FreeBSD.org>
Thu, 19 Nov 2015 14:04:53 +0000 (14:04 +0000)
commitf2aa140123cb6701c58f52302538181a623480c4
treeb9519811576c3140a10c27aaa98b1ae5987e9610
parent5ec1c28867cc831823aa9d848fa6fb9012148ff8
Consistently enforce the restriction against calling malloc/free when in a
critical section.

uma_zalloc_arg()/uma_zalloc_free() may acquire a sleepable lock on the
zone. The malloc() family of functions may call uma_zalloc_arg() or
uma_zalloc_free().

The malloc(9) man page currently claims that free() will never sleep.
It also implies that the malloc() family of functions will not sleep
when called with M_NOWAIT. However, it is more correct to say that
these functions will not sleep indefinitely. Indeed, they may acquire
a sleepable lock. However, a developer may overlook this restriction
because the WITNESS check that catches attempts to call the malloc()
family of functions within a critical section is inconsistenly
applied.

This change clarifies the language of the malloc(9) man page to clarify
the restriction against calling the malloc() family of functions
while in a critical section or holding a spin lock. It also adds
KASSERTs at appropriate points to make the enforcement of this
restriction more consistent.

PR: 204633
Differential Revision: https://reviews.freebsd.org/D4197
Reviewed by: markj
Approved by: gnn (mentor)
Sponsored by: Juniper Networks
share/man/man9/malloc.9
sys/kern/kern_malloc.c
sys/vm/uma_core.c