diff options
author | gallatin <gallatin@FreeBSD.org> | 2010-03-17 20:13:09 +0000 |
---|---|---|
committer | gallatin <gallatin@FreeBSD.org> | 2010-03-17 20:13:09 +0000 |
commit | 0824be03226071fed1114ef047a461f21ecee2ab (patch) | |
tree | eb50baaa17ae89319dcf30f7c2e6347f3ed7efb9 /sys/dev/mxge | |
parent | 0e5db580ee230ddfec7cc705eef0634383c57c3c (diff) | |
download | FreeBSD-src-0824be03226071fed1114ef047a461f21ecee2ab.zip FreeBSD-src-0824be03226071fed1114ef047a461f21ecee2ab.tar.gz |
Fix 2 bugs in mxge_attach()
- Don't leak slice resources when mxge_alloc_rings() fails
- Start taskq threads only after we know attach will succeed. At
boot time, taskqueue_terminate() will loop infinately, waiting
for the threads to exit, and hang the system.
Submitted by: Panasas
MFC After: 3 days
Diffstat (limited to 'sys/dev/mxge')
-rw-r--r-- | sys/dev/mxge/if_mxge.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c index 5b8bb99..d7f5825 100644 --- a/sys/dev/mxge/if_mxge.c +++ b/sys/dev/mxge/if_mxge.c @@ -4616,8 +4616,6 @@ mxge_attach(device_t dev) err = ENOMEM; goto abort_with_nothing; } - taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq", - device_get_nameunit(sc->dev)); err = bus_dma_tag_create(NULL, /* parent */ 1, /* alignment */ @@ -4723,7 +4721,7 @@ mxge_attach(device_t dev) err = mxge_alloc_rings(sc); if (err != 0) { device_printf(sc->dev, "failed to allocate rings\n"); - goto abort_with_dmabench; + goto abort_with_slices; } err = mxge_add_irq(sc); @@ -4781,6 +4779,8 @@ mxge_attach(device_t dev) ifp->if_transmit = mxge_transmit; ifp->if_qflush = mxge_qflush; #endif + taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq", + device_get_nameunit(sc->dev)); callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc); return 0; |