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:
parent
8c06ac50fc
commit
67314b8bd2
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user