Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Oct 2019 17:20:21 +0000 (UTC)
From:      Ryan Stone <rstone@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r353938 - head/sys/compat/linuxkpi/common/src
Message-ID:  <201910231720.x9NHKLFd051559@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rstone
Date: Wed Oct 23 17:20:20 2019
New Revision: 353938
URL: https://svnweb.freebsd.org/changeset/base/353938

Log:
  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

Modified:
  head/sys/compat/linuxkpi/common/src/linux_pci.c

Modified: head/sys/compat/linuxkpi/common/src/linux_pci.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_pci.c	Wed Oct 23 17:02:45 2019	(r353937)
+++ head/sys/compat/linuxkpi/common/src/linux_pci.c	Wed Oct 23 17:20:20 2019	(r353938)
@@ -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
 	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) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201910231720.x9NHKLFd051559>