The manpage states that bus_dmamap_create(9) returns ENOMEM if it can't

allocate a map or mapping resources.  That seems to imply that any memory
allocations it does must use M_NOWAIT and check for NULL.

Submitted by:	Ian Lepore <freebsd@damnhippie.dyndns.org>
This commit is contained in:
Olivier Houchard 2012-12-22 01:04:29 +00:00
parent 8c06ac50fc
commit 67314b8bd2

View File

@ -567,16 +567,24 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)
bus_dmamap_t map;
int error = 0;
map = uma_zalloc_arg(dmamap_zone, dmat, M_WAITOK);
map = uma_zalloc_arg(dmamap_zone, dmat, M_NOWAIT);
*mapp = map;
if (map == NULL)
return (ENOMEM);
/*
* If the tag's segments haven't been allocated yet we need to do it
* now, because we can't sleep for resources at map load time.
*/
if (dmat->segments == NULL)
if (dmat->segments == NULL) {
dmat->segments = malloc(dmat->nsegments *
sizeof(*dmat->segments), M_DEVBUF, M_WAITOK);
sizeof(*dmat->segments), M_DEVBUF, M_NOWAIT);
if (dmat->segments == NULL) {
uma_zfree(dmamap_zone, map);
*mapp = NULL;
return (ENOMEM);
}
}
/*
* Bouncing might be required if the driver asks for an active