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);
}