Add missing M_NOWAIT flag

The LinuxKPI linux_dma code calls PCTRIE_INSERT with a
mutex held, but does not set M_NOWAIT when allocating
nodes, leading to a potential panic.  All of this code
can handle an allocation failure here, so prefer an
allocation failure to sleeping on memory.

Also fix a related case where NOWAIT/WAITOK was not
specified.  In this case it's not clear whether sleeping
is allowed so be conservative and assume not.  There are
a lot of other paths in this code that can fail due to
a lack of memory anyway.

Differential Revision: https://reviews.freebsd.org/D22127
Reviewed by: imp
Sponsored by: Dell EMC Isilon
MFC After: 1 week
This commit is contained in:
rstone 2019-10-23 17:20:20 +00:00
parent 1cdfabf5f2
commit 3878ab63de

View File

@ -500,7 +500,7 @@ static void *
linux_dma_trie_alloc(struct pctrie *ptree)
{
return (uma_zalloc(linux_dma_trie_zone, 0));
return (uma_zalloc(linux_dma_trie_zone, M_NOWAIT));
}
static void
@ -569,7 +569,10 @@ linux_dma_map_phys(struct device *dev, vm_paddr_t phys, size_t len)
if (bus_dma_id_mapped(priv->dmat, phys, len))
return (phys);
obj = uma_zalloc(linux_dma_obj_zone, 0);
obj = uma_zalloc(linux_dma_obj_zone, M_NOWAIT);
if (obj == NULL) {
return (0);
}
DMA_PRIV_LOCK(priv);
if (bus_dmamap_create(priv->dmat, 0, &obj->dmamap) != 0) {