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>