svn commit: r289905 - head/sys/dev/ioat

Conrad E. Meyer cem at FreeBSD.org
Sat Oct 24 23:45:11 UTC 2015


Author: cem
Date: Sat Oct 24 23:45:10 2015
New Revision: 289905
URL: https://svnweb.freebsd.org/changeset/base/289905

Log:
  ioat: Don't use sleeping allocation in lock path
  
  This is still the worst possible way to allocate memory if it will ever
  be under pressure, but at least it won't deadlock.
  
  Suggested by:	WITNESS
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/sys/dev/ioat/ioat.c

Modified: head/sys/dev/ioat/ioat.c
==============================================================================
--- head/sys/dev/ioat/ioat.c	Sat Oct 24 23:44:58 2015	(r289904)
+++ head/sys/dev/ioat/ioat.c	Sat Oct 24 23:45:10 2015	(r289905)
@@ -738,22 +738,33 @@ ioat_alloc_ring_entry(struct ioat_softc 
 {
 	struct ioat_dma_hw_descriptor *hw_desc;
 	struct ioat_descriptor *desc;
+	int error;
 
-	desc = malloc(sizeof(struct ioat_descriptor), M_IOAT, M_NOWAIT);
-	if (desc == NULL)
-		return (NULL);
+	error = ENOMEM;
+	hw_desc = NULL;
 
-	bus_dmamem_alloc(ioat->hw_desc_tag, (void **)&hw_desc, BUS_DMA_ZERO,
-	    &ioat->hw_desc_map);
-	if (hw_desc == NULL) {
-		free(desc, M_IOAT);
-		return (NULL);
-	}
+	desc = malloc(sizeof(*desc), M_IOAT, M_NOWAIT);
+	if (desc == NULL)
+		goto out;
 
-	bus_dmamap_load(ioat->hw_desc_tag, ioat->hw_desc_map, hw_desc,
-	    sizeof(*hw_desc), ioat_dmamap_cb, &desc->hw_desc_bus_addr, 0);
+	bus_dmamem_alloc(ioat->hw_desc_tag, (void **)&hw_desc,
+	    BUS_DMA_ZERO | BUS_DMA_NOWAIT, &ioat->hw_desc_map);
+	if (hw_desc == NULL)
+		goto out;
 
 	desc->u.dma = hw_desc;
+
+	error = bus_dmamap_load(ioat->hw_desc_tag, ioat->hw_desc_map, hw_desc,
+	    sizeof(*hw_desc), ioat_dmamap_cb, &desc->hw_desc_bus_addr,
+	    BUS_DMA_NOWAIT);
+	if (error)
+		goto out;
+
+out:
+	if (error) {
+		ioat_free_ring_entry(ioat, desc);
+		return (NULL);
+	}
 	return (desc);
 }
 


More information about the svn-src-head mailing list