Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Oct 2015 23:45:10 +0000 (UTC)
From:      "Conrad E. Meyer" <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r289905 - head/sys/dev/ioat
Message-ID:  <201510242345.t9ONjAt7011811@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 



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