Module Name: src Committed By: rin Date: Sun May 29 10:43:46 UTC 2022
Modified Files: src/sys/dev/hyperv: if_hvn.c src/sys/dev/ic: ciss.c elinkxl.c hme.c i82596.c src/sys/dev/isa: if_le_isa.c src/sys/dev/isapnp: if_le_isapnp.c src/sys/dev/sbus: if_le.c if_le_ledma.c src/sys/dev/tc: if_le_ioasic.c Log Message: Audit unload/unmap v.s. free against DMA buffer for sys/dev; make sure that bus_dmamap_unload(9) [or bus_dmamap_destroy(9)] or bus_dmamem_unmap(9) are preceding to freeing DMA buffer, if it is loaded or mapped, respectively. This is mandatory for some archs. See, e.g.: http://www.nerv.org/netbsd/?q=id:20210511T013030Z.013443cc790088147e4beed43f53dedabeaf9312 http://www.nerv.org/netbsd/?q=id:20220511T172220Z.561179f0b6fcc5b9cd73e274f69d74e2ce9e4c93 For some drivers, resource leaks for error paths are fixed at the same time. XXX XXX XXX Compile test only (at least one arch per driver). To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/dev/hyperv/if_hvn.c cvs rdiff -u -r1.53 -r1.54 src/sys/dev/ic/ciss.c cvs rdiff -u -r1.138 -r1.139 src/sys/dev/ic/elinkxl.c cvs rdiff -u -r1.108 -r1.109 src/sys/dev/ic/hme.c cvs rdiff -u -r1.45 -r1.46 src/sys/dev/ic/i82596.c cvs rdiff -u -r1.52 -r1.53 src/sys/dev/isa/if_le_isa.c cvs rdiff -u -r1.36 -r1.37 src/sys/dev/isapnp/if_le_isapnp.c cvs rdiff -u -r1.41 -r1.42 src/sys/dev/sbus/if_le.c cvs rdiff -u -r1.36 -r1.37 src/sys/dev/sbus/if_le_ledma.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/tc/if_le_ioasic.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/hyperv/if_hvn.c diff -u src/sys/dev/hyperv/if_hvn.c:1.22 src/sys/dev/hyperv/if_hvn.c:1.23 --- src/sys/dev/hyperv/if_hvn.c:1.22 Fri May 20 13:55:17 2022 +++ src/sys/dev/hyperv/if_hvn.c Sun May 29 10:43:45 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_hvn.c,v 1.22 2022/05/20 13:55:17 nonaka Exp $ */ +/* $NetBSD: if_hvn.c,v 1.23 2022/05/29 10:43:45 rin Exp $ */ /* $OpenBSD: if_hvn.c,v 1.39 2018/03/11 14:31:34 mikeb Exp $ */ /*- @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_hvn.c,v 1.22 2022/05/20 13:55:17 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_hvn.c,v 1.23 2022/05/29 10:43:45 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_if_hvn.h" @@ -3997,10 +3997,11 @@ hvn_rndis_init(struct hvn_softc *sc) PAGE_SIZE, NULL, BUS_DMA_WAITOK)) { DPRINTF("%s: failed to load RNDIS command map\n", device_xname(sc->sc_dev)); + bus_dmamem_unmap(sc->sc_dmat, rc->rc_req, PAGE_SIZE); + rc->rc_req = NULL; bus_dmamem_free(sc->sc_dmat, &rc->rc_segs, rc->rc_nsegs); bus_dmamap_destroy(sc->sc_dmat, rc->rc_dmap); - rc->rc_req = NULL; goto errout; } rc->rc_gpa = atop(rc->rc_dmap->dm_segs[0].ds_addr); @@ -4034,8 +4035,10 @@ hvn_rndis_destroy(struct hvn_softc *sc) continue; TAILQ_REMOVE(&sc->sc_cntl_fq, rc, rc_entry); - bus_dmamem_free(sc->sc_dmat, &rc->rc_segs, rc->rc_nsegs); + bus_dmamap_unload(sc->sc_dmat, rc->rc_dmap); + bus_dmamem_unmap(sc->sc_dmat, rc->rc_req, PAGE_SIZE); rc->rc_req = NULL; + bus_dmamem_free(sc->sc_dmat, &rc->rc_segs, rc->rc_nsegs); bus_dmamap_destroy(sc->sc_dmat, rc->rc_dmap); mutex_destroy(&rc->rc_lock); cv_destroy(&rc->rc_cv); Index: src/sys/dev/ic/ciss.c diff -u src/sys/dev/ic/ciss.c:1.53 src/sys/dev/ic/ciss.c:1.54 --- src/sys/dev/ic/ciss.c:1.53 Sat Jan 1 09:53:32 2022 +++ src/sys/dev/ic/ciss.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ciss.c,v 1.53 2022/01/01 09:53:32 msaitoh Exp $ */ +/* $NetBSD: ciss.c,v 1.54 2022/05/29 10:43:46 rin Exp $ */ /* $OpenBSD: ciss.c,v 1.68 2013/05/30 16:15:02 deraadt Exp $ */ /* @@ -19,7 +19,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ciss.c,v 1.53 2022/01/01 09:53:32 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ciss.c,v 1.54 2022/05/29 10:43:46 rin Exp $"); #include "bio.h" @@ -334,8 +334,8 @@ ciss_attach(struct ciss_softc *sc) if ((error = bus_dmamap_load(sc->sc_dmat, sc->cmdmap, sc->ccbs, total, NULL, BUS_DMA_NOWAIT))) { aprint_error(": cannot load CCBs dmamap (%d)\n", error); - bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); bus_dmamap_destroy(sc->sc_dmat, sc->cmdmap); + bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); return -1; } @@ -370,8 +370,8 @@ ciss_attach(struct ciss_softc *sc) aprint_error(": cannot create ccb#%d dmamap (%d)\n", i, error); if (i == 0) { /* TODO leaking cmd's dmamaps and shitz */ - bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); bus_dmamap_destroy(sc->sc_dmat, sc->cmdmap); + bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); return -1; } } @@ -395,8 +395,8 @@ ciss_attach(struct ciss_softc *sc) if (ciss_inq(sc, inq)) { aprint_error(": adapter inquiry failed\n"); mutex_exit(&sc->sc_mutex_scratch); - bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); bus_dmamap_destroy(sc->sc_dmat, sc->cmdmap); + bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); return -1; } @@ -404,8 +404,8 @@ ciss_attach(struct ciss_softc *sc) aprint_error(": big map is not supported, flags=0x%x\n", inq->flags); mutex_exit(&sc->sc_mutex_scratch); - bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); bus_dmamap_destroy(sc->sc_dmat, sc->cmdmap); + bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); return -1; } @@ -434,8 +434,8 @@ ciss_attach(struct ciss_softc *sc) /* map LDs */ if (ciss_ldmap(sc)) { aprint_error_dev(sc->sc_dev, "adapter LD map failed\n"); - bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); bus_dmamap_destroy(sc->sc_dmat, sc->cmdmap); + bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); return -1; } @@ -446,8 +446,8 @@ ciss_attach(struct ciss_softc *sc) if (!(sc->sc_sh = shutdownhook_establish(ciss_shutdown, sc))) { aprint_error_dev(sc->sc_dev, "unable to establish shutdown hook\n"); - bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); bus_dmamap_destroy(sc->sc_dmat, sc->cmdmap); + bus_dmamem_free(sc->sc_dmat, sc->cmdseg, 1); return -1; } Index: src/sys/dev/ic/elinkxl.c diff -u src/sys/dev/ic/elinkxl.c:1.138 src/sys/dev/ic/elinkxl.c:1.139 --- src/sys/dev/ic/elinkxl.c:1.138 Thu Mar 12 03:01:46 2020 +++ src/sys/dev/ic/elinkxl.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: elinkxl.c,v 1.138 2020/03/12 03:01:46 thorpej Exp $ */ +/* $NetBSD: elinkxl.c,v 1.139 2022/05/29 10:43:46 rin Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.138 2020/03/12 03:01:46 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.139 2022/05/29 10:43:46 rin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1598,10 +1598,10 @@ ex_stop(struct ifnet *ifp, int disable) for (tx = sc->tx_head ; tx != NULL; tx = tx->tx_next) { if (tx->tx_mbhead == NULL) continue; - m_freem(tx->tx_mbhead); - tx->tx_mbhead = NULL; bus_dmamap_unload(sc->sc_dmat, tx->tx_dmamap); tx->tx_dpd->dpd_fsh = tx->tx_dpd->dpd_nextptr = 0; + m_freem(tx->tx_mbhead); + tx->tx_mbhead = NULL; bus_dmamap_sync(sc->sc_dmat, sc->sc_dpd_dmamap, ((char *)tx->tx_dpd - (char *)sc->sc_dpd), sizeof (struct ex_dpd), Index: src/sys/dev/ic/hme.c diff -u src/sys/dev/ic/hme.c:1.108 src/sys/dev/ic/hme.c:1.109 --- src/sys/dev/ic/hme.c:1.108 Thu Mar 12 03:01:46 2020 +++ src/sys/dev/ic/hme.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: hme.c,v 1.108 2020/03/12 03:01:46 thorpej Exp $ */ +/* $NetBSD: hme.c,v 1.109 2022/05/29 10:43:46 rin Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.108 2020/03/12 03:01:46 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.109 2022/05/29 10:43:46 rin Exp $"); /* #define HMEDEBUG */ @@ -198,16 +198,14 @@ hme_config(struct hme_softc *sc) BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { aprint_error_dev(sc->sc_dev, "DMA buffer map error %d\n", error); - bus_dmamap_unload(dmatag, sc->sc_dmamap); - bus_dmamem_free(dmatag, &seg, rseg); - return; + goto bad_free; } if ((error = bus_dmamap_create(dmatag, size, 1, size, 0, BUS_DMA_NOWAIT, &sc->sc_dmamap)) != 0) { aprint_error_dev(sc->sc_dev, "DMA map create error %d\n", error); - return; + goto bad_unmap; } /* Load the buffer */ @@ -216,8 +214,7 @@ hme_config(struct hme_softc *sc) BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { aprint_error_dev(sc->sc_dev, "DMA buffer map load error %d\n", error); - bus_dmamem_free(dmatag, &seg, rseg); - return; + goto bad_destroy; } sc->sc_rb.rb_dmabase = sc->sc_dmamap->dm_segs[0].ds_addr; @@ -316,6 +313,15 @@ hme_config(struct hme_softc *sc) callout_init(&sc->sc_tick_ch, 0); callout_setfunc(&sc->sc_tick_ch, hme_tick, sc); + + return; + + bad_destroy: + bus_dmamap_destroy(dmatag, sc->sc_dmamap); + bad_unmap: + bus_dmamem_unmap(dmatag, sc->sc_rb.rb_membase, size); + bad_free: + bus_dmamem_free(dmatag, &seg, rseg); } void Index: src/sys/dev/ic/i82596.c diff -u src/sys/dev/ic/i82596.c:1.45 src/sys/dev/ic/i82596.c:1.46 --- src/sys/dev/ic/i82596.c:1.45 Wed Nov 10 17:19:30 2021 +++ src/sys/dev/ic/i82596.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: i82596.c,v 1.45 2021/11/10 17:19:30 msaitoh Exp $ */ +/* $NetBSD: i82596.c,v 1.46 2022/05/29 10:43:46 rin Exp $ */ /* * Copyright (c) 2003 Jochen Kunz. @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i82596.c,v 1.45 2021/11/10 17:19:30 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i82596.c,v 1.46 2022/05/29 10:43:46 rin Exp $"); /* autoconfig and device stuff */ #include <sys/param.h> @@ -330,10 +330,10 @@ iee_intr(void *intarg) if (sc->sc_next_tbd != 0) { /* A TX CMD list finished, cleanup */ for (n = 0 ; n < sc->sc_next_cb ; n++) { - m_freem(sc->sc_tx_mbuf[n]); - sc->sc_tx_mbuf[n] = NULL; bus_dmamap_unload(sc->sc_dmat, sc->sc_tx_map[n]); + m_freem(sc->sc_tx_mbuf[n]); + sc->sc_tx_mbuf[n] = NULL; IEE_CBSYNC(sc, n, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); @@ -968,11 +968,11 @@ iee_init(struct ifnet *ifp) IEE_SWAPA32(IEE_PHYS_SHMEM(sc->sc_rbd_off)); if (err != 0) { for (n = 0 ; n < r; n++) { - m_freem(sc->sc_rx_mbuf[n]); - sc->sc_rx_mbuf[n] = NULL; bus_dmamap_unload(sc->sc_dmat, sc->sc_rx_map[n]); bus_dmamap_destroy(sc->sc_dmat, sc->sc_rx_map[n]); sc->sc_rx_map[n] = NULL; + m_freem(sc->sc_rx_mbuf[n]); + sc->sc_rx_mbuf[n] = NULL; } for (n = 0 ; n < t ; n++) { bus_dmamap_destroy(sc->sc_dmat, sc->sc_tx_map[n]); @@ -1034,14 +1034,14 @@ iee_stop(struct ifnet *ifp, int disable) sc->sc_tx_map[n] = NULL; } for (n = 0 ; n < IEE_NRFD ; n++) { - if (sc->sc_rx_mbuf[n] != NULL) - m_freem(sc->sc_rx_mbuf[n]); - sc->sc_rx_mbuf[n] = NULL; if (sc->sc_rx_map[n] != NULL) { bus_dmamap_unload(sc->sc_dmat, sc->sc_rx_map[n]); bus_dmamap_destroy(sc->sc_dmat, sc->sc_rx_map[n]); } sc->sc_rx_map[n] = NULL; + if (sc->sc_rx_mbuf[n] != NULL) + m_freem(sc->sc_rx_mbuf[n]); + sc->sc_rx_mbuf[n] = NULL; } } Index: src/sys/dev/isa/if_le_isa.c diff -u src/sys/dev/isa/if_le_isa.c:1.52 src/sys/dev/isa/if_le_isa.c:1.53 --- src/sys/dev/isa/if_le_isa.c:1.52 Wed Dec 8 20:50:02 2021 +++ src/sys/dev/isa/if_le_isa.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le_isa.c,v 1.52 2021/12/08 20:50:02 andvar Exp $ */ +/* $NetBSD: if_le_isa.c,v 1.53 2022/05/29 10:43:46 rin Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le_isa.c,v 1.52 2021/12/08 20:50:02 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le_isa.c,v 1.53 2022/05/29 10:43:46 rin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -328,13 +328,13 @@ le_isa_attach(device_t parent, struct le &rseg, BUS_DMA_NOWAIT)) { aprint_error_dev(sc->sc_dev, "couldn't allocate memory for card\n"); - return; + goto bad_bsunmap; } if (bus_dmamem_map(dmat, &seg, rseg, LE_ISA_MEMSIZE, (void **)&sc->sc_mem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { aprint_error_dev(sc->sc_dev, "couldn't map memory for card\n"); - return; + goto bad_free; } /* @@ -343,14 +343,12 @@ le_isa_attach(device_t parent, struct le if (bus_dmamap_create(dmat, LE_ISA_MEMSIZE, 1, LE_ISA_MEMSIZE, 0, BUS_DMA_NOWAIT, &lesc->sc_dmam)) { aprint_error_dev(sc->sc_dev, "couldn't create DMA map\n"); - bus_dmamem_free(dmat, &seg, rseg); - return; + goto bad_unmap; } if (bus_dmamap_load(dmat, lesc->sc_dmam, sc->sc_mem, LE_ISA_MEMSIZE, NULL, BUS_DMA_NOWAIT)) { aprint_error_dev(sc->sc_dev, "couldn't load DMA map\n"); - bus_dmamem_free(dmat, &seg, rseg); - return; + goto bad_destroy; } sc->sc_conf3 = 0; @@ -372,7 +370,7 @@ le_isa_attach(device_t parent, struct le ia->ia_drq[0].ir_drq)) != 0) { aprint_error_dev(sc->sc_dev, "unable to cascade DRQ, error = %d\n", error); - return; + goto bad_destroy; } } @@ -381,6 +379,17 @@ le_isa_attach(device_t parent, struct le aprint_normal("%s", device_xname(sc->sc_dev)); am7990_config(&lesc->sc_am7990); + + return; + + bad_destroy: + bus_dmamap_destroy(dmat, lesc->sc_dmam); + bad_unmap: + bus_dmamem_unmap(dmat, sc->sc_mem, LE_ISA_MEMSIZE); + bad_free: + bus_dmamem_free(dmat, &seg, rseg); + bad_bsunmap: + bus_space_unmap(iot, ioh, p->iosize); } /* Index: src/sys/dev/isapnp/if_le_isapnp.c diff -u src/sys/dev/isapnp/if_le_isapnp.c:1.36 src/sys/dev/isapnp/if_le_isapnp.c:1.37 --- src/sys/dev/isapnp/if_le_isapnp.c:1.36 Wed Dec 8 20:50:02 2021 +++ src/sys/dev/isapnp/if_le_isapnp.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le_isapnp.c,v 1.36 2021/12/08 20:50:02 andvar Exp $ */ +/* $NetBSD: if_le_isapnp.c,v 1.37 2022/05/29 10:43:46 rin Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le_isapnp.c,v 1.36 2021/12/08 20:50:02 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le_isapnp.c,v 1.37 2022/05/29 10:43:46 rin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -206,7 +206,7 @@ le_isapnp_attach(device_t parent, device if (bus_dmamem_map(dmat, &seg, rseg, LE_ISAPNP_MEMSIZE, (void **)&sc->sc_mem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { aprint_error(": couldn't map memory for card\n"); - return; + goto bad_free; } /* @@ -215,14 +215,12 @@ le_isapnp_attach(device_t parent, device if (bus_dmamap_create(dmat, LE_ISAPNP_MEMSIZE, 1, LE_ISAPNP_MEMSIZE, 0, BUS_DMA_NOWAIT, &lesc->sc_dmam)) { aprint_error(": couldn't create DMA map\n"); - bus_dmamem_free(dmat, &seg, rseg); - return; + goto bad_unmap; } if (bus_dmamap_load(dmat, lesc->sc_dmam, sc->sc_mem, LE_ISAPNP_MEMSIZE, NULL, BUS_DMA_NOWAIT)) { aprint_error(": couldn't load DMA map\n"); - bus_dmamem_free(dmat, &seg, rseg); - return; + goto bad_destroy; } sc->sc_conf3 = 0; @@ -244,7 +242,7 @@ le_isapnp_attach(device_t parent, device ipa->ipa_drq[0].num)) != 0) { aprint_error(": unable to cascade DRQ, error = %d\n", error); - return; + goto bad_destroy; } } @@ -255,6 +253,15 @@ le_isapnp_attach(device_t parent, device aprint_normal("%s", device_xname(self)); am7990_config(&lesc->sc_am7990); + + return; + + bad_destroy: + bus_dmamap_destroy(dmat, lesc->sc_dmam); + bad_unmap: + bus_dmamem_unmap(dmat, sc->sc_mem, LE_ISAPNP_MEMSIZE); + bad_free: + bus_dmamem_free(dmat, &seg, rseg); } Index: src/sys/dev/sbus/if_le.c diff -u src/sys/dev/sbus/if_le.c:1.41 src/sys/dev/sbus/if_le.c:1.42 --- src/sys/dev/sbus/if_le.c:1.41 Wed May 29 06:21:58 2019 +++ src/sys/dev/sbus/if_le.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le.c,v 1.41 2019/05/29 06:21:58 msaitoh Exp $ */ +/* $NetBSD: if_le.c,v 1.42 2022/05/29 10:43:46 rin Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.41 2019/05/29 06:21:58 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.42 2022/05/29 10:43:46 rin Exp $"); #include "opt_inet.h" @@ -233,6 +233,7 @@ leattach_sbus(device_t parent, device_t &seg, 1, &rseg, BUS_DMA_NOWAIT | BUS_DMA_24BIT)) != 0) { aprint_error(": DMA buffer allocation error %d\n", error); + bus_dmamap_destroy(dmatag, lesc->sc_dmamap); return; } @@ -242,6 +243,7 @@ leattach_sbus(device_t parent, device_t != 0) { aprint_error(": DMA buffer map error %d\n", error); bus_dmamem_free(lesc->sc_dmatag, &seg, rseg); + bus_dmamap_destroy(dmatag, lesc->sc_dmamap); return; } @@ -249,8 +251,9 @@ leattach_sbus(device_t parent, device_t if ((error = bus_dmamap_load(dmatag, lesc->sc_dmamap, sc->sc_mem, MEMSIZE, NULL, BUS_DMA_NOWAIT)) != 0) { aprint_error(": DMA buffer map load error %d\n", error); - bus_dmamem_free(dmatag, &seg, rseg); bus_dmamem_unmap(dmatag, sc->sc_mem, MEMSIZE); + bus_dmamem_free(lesc->sc_dmatag, &seg, rseg); + bus_dmamap_destroy(dmatag, lesc->sc_dmamap); return; } Index: src/sys/dev/sbus/if_le_ledma.c diff -u src/sys/dev/sbus/if_le_ledma.c:1.36 src/sys/dev/sbus/if_le_ledma.c:1.37 --- src/sys/dev/sbus/if_le_ledma.c:1.36 Thu Apr 25 10:44:53 2019 +++ src/sys/dev/sbus/if_le_ledma.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le_ledma.c,v 1.36 2019/04/25 10:44:53 msaitoh Exp $ */ +/* $NetBSD: if_le_ledma.c,v 1.37 2022/05/29 10:43:46 rin Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le_ledma.c,v 1.36 2019/04/25 10:44:53 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le_ledma.c,v 1.37 2022/05/29 10:43:46 rin Exp $"); #include "opt_inet.h" @@ -360,24 +360,21 @@ leattach_ledma(device_t parent, device_t if ((error = bus_dmamem_alloc(dmatag, MEMSIZE, 0, LEDMA_BOUNDARY, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) { aprint_error(": DMA buffer alloc error %d\n",error); - return; + goto bad_destroy; } /* Map DMA buffer into kernel space */ if ((error = bus_dmamem_map(dmatag, &seg, rseg, MEMSIZE, (void **)&sc->sc_mem, BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { aprint_error(": DMA buffer map error %d\n", error); - bus_dmamem_free(dmatag, &seg, rseg); - return; + goto bad_free; } /* Load DMA buffer */ if ((error = bus_dmamap_load(dmatag, lesc->sc_dmamap, sc->sc_mem, MEMSIZE, NULL, BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { aprint_error(": DMA buffer map load error %d\n", error); - bus_dmamem_free(dmatag, &seg, rseg); - bus_dmamem_unmap(dmatag, sc->sc_mem, MEMSIZE); - return; + goto bad_unmap; } lesc->sc_laddr = lesc->sc_dmamap->dm_segs[0].ds_addr; @@ -414,4 +411,13 @@ leattach_ledma(device_t parent, device_t /* now initialize DMA */ lehwreset(sc); + + return; + + bad_unmap: + bus_dmamem_unmap(dmatag, sc->sc_mem, MEMSIZE); + bad_free: + bus_dmamem_free(dmatag, &seg, rseg); + bad_destroy: + bus_dmamap_destroy(dmatag, lesc->sc_dmamap); } Index: src/sys/dev/tc/if_le_ioasic.c diff -u src/sys/dev/tc/if_le_ioasic.c:1.34 src/sys/dev/tc/if_le_ioasic.c:1.35 --- src/sys/dev/tc/if_le_ioasic.c:1.34 Mon Sep 3 16:29:33 2018 +++ src/sys/dev/tc/if_le_ioasic.c Sun May 29 10:43:46 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le_ioasic.c,v 1.34 2018/09/03 16:29:33 riastradh Exp $ */ +/* $NetBSD: if_le_ioasic.c,v 1.35 2022/05/29 10:43:46 rin Exp $ */ /* * Copyright (c) 1996 Carnegie-Mellon University. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le_ioasic.c,v 1.34 2018/09/03 16:29:33 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le_ioasic.c,v 1.35 2022/05/29 10:43:46 rin Exp $"); #include "opt_inet.h" @@ -130,8 +130,7 @@ le_ioasic_attach(device_t parent, device if (bus_dmamem_map(dmat, &seg, rseg, LE_IOASIC_MEMSIZE, &le_iomem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { aprint_error(": can't map DMA area for LANCE\n"); - bus_dmamem_free(dmat, &seg, rseg); - return; + goto bad_free; } /* * Create and load the DMA map for the DMA area. @@ -139,12 +138,12 @@ le_ioasic_attach(device_t parent, device if (bus_dmamap_create(dmat, LE_IOASIC_MEMSIZE, 1, LE_IOASIC_MEMSIZE, 0, BUS_DMA_NOWAIT, &sc->sc_dmamap)) { aprint_error(": can't create DMA map\n"); - goto bad; + goto bad_unmap; } if (bus_dmamap_load(dmat, sc->sc_dmamap, le_iomem, LE_IOASIC_MEMSIZE, NULL, BUS_DMA_NOWAIT)) { aprint_error(": can't load DMA map\n"); - goto bad; + goto bad_destroy; } /* * Bind 128KB buffer with IOASIC DMA. @@ -171,8 +170,11 @@ le_ioasic_attach(device_t parent, device am7990_intr, sc); return; - bad: + bad_destroy: + bus_dmamap_destroy(dmat, sc->sc_dmamap); + bad_unmap: bus_dmamem_unmap(dmat, le_iomem, LE_IOASIC_MEMSIZE); + bad_free: bus_dmamem_free(dmat, &seg, rseg); }