summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenlu chen - Sun Microsystems - Beijing China <Chenlu.Chen@Sun.COM>2010-01-20 07:47:06 +0800
committerchenlu chen - Sun Microsystems - Beijing China <Chenlu.Chen@Sun.COM>2010-01-20 07:47:06 +0800
commitb227c420ebc30f71999e5e7cd26ca1b23d2cb088 (patch)
treef425aad558cbde310e48e13eccbd1c91ca2f1e5a
parentc40ba10d39e7750947725517ec5639ef2d6e90e5 (diff)
downloadillumos-gate-b227c420ebc30f71999e5e7cd26ca1b23d2cb088.tar.gz
6917570 mutex lock leak in igb
-rw-r--r--usr/src/uts/common/io/igb/igb_main.c3
-rw-r--r--usr/src/uts/common/io/igb/igb_tx.c2
2 files changed, 4 insertions, 1 deletions
diff --git a/usr/src/uts/common/io/igb/igb_main.c b/usr/src/uts/common/io/igb/igb_main.c
index 635930b5be..6cd7e1cb7f 100644
--- a/usr/src/uts/common/io/igb/igb_main.c
+++ b/usr/src/uts/common/io/igb/igb_main.c
@@ -29,7 +29,7 @@
#include "igb_sw.h"
static char ident[] = "Intel 1Gb Ethernet";
-static char igb_version[] = "igb 1.1.11";
+static char igb_version[] = "igb 1.1.12";
/*
* Local function protoypes
@@ -3974,6 +3974,7 @@ igb_intr_legacy(void *arg1, void *arg2)
icr = E1000_READ_REG(&igb->hw, E1000_ICR);
if (igb_check_acc_handle(igb->osdep.reg_handle) != DDI_FM_OK) {
+ mutex_exit(&igb->gen_lock);
ddi_fm_service_impact(igb->dip, DDI_SERVICE_DEGRADED);
atomic_or_32(&igb->igb_state, IGB_ERROR);
return (DDI_INTR_UNCLAIMED);
diff --git a/usr/src/uts/common/io/igb/igb_tx.c b/usr/src/uts/common/io/igb/igb_tx.c
index 9deef24989..b77afe1a5d 100644
--- a/usr/src/uts/common/io/igb/igb_tx.c
+++ b/usr/src/uts/common/io/igb/igb_tx.c
@@ -1091,6 +1091,7 @@ igb_tx_recycle_legacy(igb_tx_ring_t *tx_ring)
if (igb_check_dma_handle(
tx_ring->tbd_area.dma_handle) != DDI_FM_OK) {
+ mutex_exit(&tx_ring->recycle_lock);
ddi_fm_service_impact(igb->dip, DDI_SERVICE_DEGRADED);
atomic_or_32(&igb->igb_state, IGB_ERROR);
return (0);
@@ -1239,6 +1240,7 @@ igb_tx_recycle_head_wb(igb_tx_ring_t *tx_ring)
if (igb_check_dma_handle(
tx_ring->tbd_area.dma_handle) != DDI_FM_OK) {
+ mutex_exit(&tx_ring->recycle_lock);
ddi_fm_service_impact(igb->dip, DDI_SERVICE_DEGRADED);
atomic_or_32(&igb->igb_state, IGB_ERROR);
return (0);