aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Leffler <sam@FreeBSD.org>2003-11-14 19:00:32 +0000
committerSam Leffler <sam@FreeBSD.org>2003-11-14 19:00:32 +0000
commit5120abbfb44aea8edaca3311a60e73429dc71942 (patch)
tree0e5901939d8633065a9035209aa5138fe4ea6820
parent274461c9441dd719a672a8fef48458e127b3885e (diff)
downloadsrc-5120abbfb44aea8edaca3311a60e73429dc71942.tar.gz
src-5120abbfb44aea8edaca3311a60e73429dc71942.zip
Drop the driver lock around calls to if_input to avoid a LOR when
the packets are immediately returned for sending (e.g. when bridging or packet forwarding). There are more efficient ways to do this but for now use the least intrusive approach. Reviewed by: imp, rwatson
Notes
Notes: svn path=/head/; revision=122689
-rw-r--r--sys/dev/an/if_an.c4
-rw-r--r--sys/dev/an/if_anreg.h1
-rw-r--r--sys/dev/bfe/if_bfe.c2
-rw-r--r--sys/dev/dc/if_dc.c10
-rw-r--r--sys/dev/dc/if_dcreg.h1
-rw-r--r--sys/dev/my/if_my.c2
-rw-r--r--sys/dev/owi/if_owi.c4
-rw-r--r--sys/dev/owi/if_wivar.h2
-rw-r--r--sys/dev/re/if_re.c4
-rw-r--r--sys/dev/sf/if_sf.c4
-rw-r--r--sys/dev/sf/if_sfreg.h1
-rw-r--r--sys/dev/sk/if_sk.c6
-rw-r--r--sys/dev/sk/if_skreg.h1
-rw-r--r--sys/dev/ti/if_ti.c4
-rw-r--r--sys/dev/ti/if_tireg.h1
-rw-r--r--sys/dev/vr/if_vr.c4
-rw-r--r--sys/dev/vr/if_vrreg.h1
-rw-r--r--sys/dev/wl/if_wl.c4
-rw-r--r--sys/pci/if_dc.c10
-rw-r--r--sys/pci/if_dcreg.h1
-rw-r--r--sys/pci/if_pcn.c4
-rw-r--r--sys/pci/if_pcnreg.h1
-rw-r--r--sys/pci/if_rl.c4
-rw-r--r--sys/pci/if_rlreg.h1
-rw-r--r--sys/pci/if_sf.c4
-rw-r--r--sys/pci/if_sfreg.h1
-rw-r--r--sys/pci/if_sis.c4
-rw-r--r--sys/pci/if_sisreg.h1
-rw-r--r--sys/pci/if_sk.c6
-rw-r--r--sys/pci/if_skreg.h1
-rw-r--r--sys/pci/if_ste.c4
-rw-r--r--sys/pci/if_stereg.h1
-rw-r--r--sys/pci/if_ti.c4
-rw-r--r--sys/pci/if_tireg.h1
-rw-r--r--sys/pci/if_tl.c4
-rw-r--r--sys/pci/if_tlreg.h1
-rw-r--r--sys/pci/if_vr.c4
-rw-r--r--sys/pci/if_vrreg.h1
-rw-r--r--sys/pci/if_wb.c4
-rw-r--r--sys/pci/if_wbreg.h1
-rw-r--r--sys/pci/if_xl.c4
-rw-r--r--sys/pci/if_xlreg.h2
42 files changed, 123 insertions, 2 deletions
diff --git a/sys/dev/an/if_an.c b/sys/dev/an/if_an.c
index 15cd3e0d8481..ec96d95d4ce8 100644
--- a/sys/dev/an/if_an.c
+++ b/sys/dev/an/if_an.c
@@ -833,6 +833,8 @@ an_rxeof(sc)
struct an_card_rx_desc an_rx_desc;
u_int8_t *buf;
+ AN_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
if (!sc->mpi350) {
@@ -981,7 +983,9 @@ an_rxeof(sc)
rx_frame.an_rx_signal_strength,
rx_frame.an_rsvd0);
#endif
+ AN_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ AN_LOCK(sc);
}
} else { /* MPI-350 */
diff --git a/sys/dev/an/if_anreg.h b/sys/dev/an/if_anreg.h
index 86b5efacb6a4..6ed2bf9ac894 100644
--- a/sys/dev/an/if_anreg.h
+++ b/sys/dev/an/if_anreg.h
@@ -502,6 +502,7 @@ struct an_softc {
#define AN_LOCK(_sc) mtx_lock(&(_sc)->an_mtx)
#define AN_UNLOCK(_sc) mtx_unlock(&(_sc)->an_mtx)
+#define AN_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->an_mtx, MA_OWNED)
void an_release_resources (device_t);
int an_alloc_port (device_t, int, int);
diff --git a/sys/dev/bfe/if_bfe.c b/sys/dev/bfe/if_bfe.c
index 3d5a7e7b4659..d91d4161e298 100644
--- a/sys/dev/bfe/if_bfe.c
+++ b/sys/dev/bfe/if_bfe.c
@@ -1153,7 +1153,9 @@ bfe_rxeof(struct bfe_softc *sc)
ifp->if_ipackets++;
m->m_pkthdr.rcvif = ifp;
+ BFE_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ BFE_LOCK(sc);
BFE_INC(cons, BFE_RX_LIST_CNT);
}
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c
index dc1c1b3ec88b..45ec33fc10de 100644
--- a/sys/dev/dc/if_dc.c
+++ b/sys/dev/dc/if_dc.c
@@ -2723,6 +2723,8 @@ dc_rxeof(struct dc_softc *sc)
int i, total_len = 0;
u_int32_t rxstat;
+ DC_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
i = sc->dc_cdata.dc_rx_prod;
@@ -2816,7 +2818,9 @@ dc_rxeof(struct dc_softc *sc)
}
ifp->if_ipackets++;
+ DC_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ DC_LOCK(sc);
}
sc->dc_cdata.dc_rx_prod = i;
@@ -3069,6 +3073,7 @@ dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
return;
}
+ DC_LOCK(sc);
sc->rxcycles = count;
dc_rxeof(sc);
dc_txeof(sc);
@@ -3082,8 +3087,10 @@ dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
status &= (DC_ISR_RX_WATDOGTIMEO | DC_ISR_RX_NOBUF |
DC_ISR_TX_NOBUF | DC_ISR_TX_IDLE | DC_ISR_TX_UNDERRUN |
DC_ISR_BUS_ERR);
- if (!status)
+ if (!status) {
+ DC_UNLOCK(sc);
return;
+ }
/* ack what we have */
CSR_WRITE_4(sc, DC_ISR, status);
@@ -3107,6 +3114,7 @@ dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
dc_init(sc);
}
}
+ DC_UNLOCK(sc);
}
#endif /* DEVICE_POLLING */
diff --git a/sys/dev/dc/if_dcreg.h b/sys/dev/dc/if_dcreg.h
index 14912b5bb457..fc77dd8c85d9 100644
--- a/sys/dev/dc/if_dcreg.h
+++ b/sys/dev/dc/if_dcreg.h
@@ -766,6 +766,7 @@ struct dc_softc {
#define DC_LOCK(_sc) mtx_lock(&(_sc)->dc_mtx)
#define DC_UNLOCK(_sc) mtx_unlock(&(_sc)->dc_mtx)
+#define DC_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->dc_mtx, MA_OWNED)
#define DC_TX_POLL 0x00000001
#define DC_TX_COALESCE 0x00000002
diff --git a/sys/dev/my/if_my.c b/sys/dev/my/if_my.c
index b1dffa8fa6ad..82b45afbaefb 100644
--- a/sys/dev/my/if_my.c
+++ b/sys/dev/my/if_my.c
@@ -1277,7 +1277,9 @@ my_rxeof(struct my_softc * sc)
}
}
#endif
+ MY_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ MY_LOCK(sc);
}
MY_UNLOCK(sc);
return;
diff --git a/sys/dev/owi/if_owi.c b/sys/dev/owi/if_owi.c
index 70f1941b323a..6f3488b7352f 100644
--- a/sys/dev/owi/if_owi.c
+++ b/sys/dev/owi/if_owi.c
@@ -449,6 +449,8 @@ wi_rxeof(sc)
struct mbuf *m;
int id;
+ WI_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
id = CSR_READ_2(sc, WI_RX_FID);
@@ -650,7 +652,9 @@ wi_rxeof(sc)
#ifdef WICACHE
wi_cache_store(sc, eh, m, rx_frame.wi_q_info);
#endif
+ WI_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ WI_LOCK(sc);
}
}
diff --git a/sys/dev/owi/if_wivar.h b/sys/dev/owi/if_wivar.h
index 723f2ca5a690..98f197069fd1 100644
--- a/sys/dev/owi/if_wivar.h
+++ b/sys/dev/owi/if_wivar.h
@@ -171,9 +171,11 @@ struct wi_card_ident {
#define ifaddr_byindex(idx) ifnet_addrs[(idx) - 1];
#define WI_LOCK(_sc, _s) s = splimp()
#define WI_UNLOCK(_sc, _s) splx(s)
+#define WI_LOCK_ASSERT(_sc)
#else
#define WI_LOCK(_sc, _s) _s = 1
#define WI_UNLOCK(_sc, _s)
+#define WI_LOCK_ASSERT(_sc)
#endif
int owi_generic_attach(device_t);
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index c72d43b1ca77..13b121637302 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -1517,6 +1517,8 @@ re_rxeof(sc)
struct rl_desc *cur_rx;
u_int32_t rxstat, rxvlan;
+ RL_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
i = sc->rl_ldata.rl_rx_prodidx;
@@ -1659,7 +1661,9 @@ re_rxeof(sc)
if (rxvlan & RL_RDESC_VLANCTL_TAG)
VLAN_INPUT_TAG(ifp, m,
ntohs((rxvlan & RL_RDESC_VLANCTL_DATA)), continue);
+ RL_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ RL_LOCK(sc);
}
/* Flush the RX DMA ring */
diff --git a/sys/dev/sf/if_sf.c b/sys/dev/sf/if_sf.c
index e1def22ec751..254277aff381 100644
--- a/sys/dev/sf/if_sf.c
+++ b/sys/dev/sf/if_sf.c
@@ -955,6 +955,8 @@ sf_rxeof(sc)
u_int32_t rxcons, rxprod;
int cmpprodidx, cmpconsidx, bufprodidx;
+ SF_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
rxcons = csr_read_4(sc, SF_CQ_CONSIDX);
@@ -988,7 +990,9 @@ sf_rxeof(sc)
m = m0;
ifp->if_ipackets++;
+ SF_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ SF_LOCK(sc);
}
csr_write_4(sc, SF_CQ_CONSIDX,
diff --git a/sys/dev/sf/if_sfreg.h b/sys/dev/sf/if_sfreg.h
index 1975cfce14b4..630f0b20dfac 100644
--- a/sys/dev/sf/if_sfreg.h
+++ b/sys/dev/sf/if_sfreg.h
@@ -1051,6 +1051,7 @@ struct sf_softc {
#define SF_LOCK(_sc) mtx_lock(&(_sc)->sf_mtx)
#define SF_UNLOCK(_sc) mtx_unlock(&(_sc)->sf_mtx)
+#define SF_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sf_mtx, MA_OWNED)
#define SF_TIMEOUT 1000
diff --git a/sys/dev/sk/if_sk.c b/sys/dev/sk/if_sk.c
index 1ef44935baec..3226d91694ce 100644
--- a/sys/dev/sk/if_sk.c
+++ b/sys/dev/sk/if_sk.c
@@ -1839,6 +1839,7 @@ static void
sk_rxeof(sc_if)
struct sk_if_softc *sc_if;
{
+ struct sk_softc *sc;
struct mbuf *m;
struct ifnet *ifp;
struct sk_chain *cur_rx;
@@ -1846,10 +1847,13 @@ sk_rxeof(sc_if)
int i;
u_int32_t rxstat;
+ sc = sc_if->sk_softc;
ifp = &sc_if->arpcom.ac_if;
i = sc_if->sk_cdata.sk_rx_prod;
cur_rx = &sc_if->sk_cdata.sk_rx_chain[i];
+ SK_LOCK_ASSERT(sc);
+
while(!(sc_if->sk_rdata->sk_rx_ring[i].sk_ctl & SK_RXCTL_OWN)) {
cur_rx = &sc_if->sk_cdata.sk_rx_chain[i];
@@ -1891,7 +1895,9 @@ sk_rxeof(sc_if)
}
ifp->if_ipackets++;
+ SK_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ SK_LOCK(sc);
}
sc_if->sk_cdata.sk_rx_prod = i;
diff --git a/sys/dev/sk/if_skreg.h b/sys/dev/sk/if_skreg.h
index 7309841592b0..8e2eb5349701 100644
--- a/sys/dev/sk/if_skreg.h
+++ b/sys/dev/sk/if_skreg.h
@@ -1423,6 +1423,7 @@ struct sk_softc {
#define SK_LOCK(_sc) mtx_lock(&(_sc)->sk_mtx)
#define SK_UNLOCK(_sc) mtx_unlock(&(_sc)->sk_mtx)
+#define SK_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sk_mtx, MA_OWNED)
#define SK_IF_LOCK(_sc) mtx_lock(&(_sc)->sk_softc->sk_mtx)
#define SK_IF_UNLOCK(_sc) mtx_unlock(&(_sc)->sk_softc->sk_mtx)
diff --git a/sys/dev/ti/if_ti.c b/sys/dev/ti/if_ti.c
index 4cbea9b77c20..c5f3fc032ea2 100644
--- a/sys/dev/ti/if_ti.c
+++ b/sys/dev/ti/if_ti.c
@@ -2384,6 +2384,8 @@ ti_rxeof(sc)
struct ifnet *ifp;
struct ti_cmd_desc cmd;
+ TI_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
while(sc->ti_rx_saved_considx != sc->ti_return_prodidx.ti_idx) {
@@ -2479,7 +2481,9 @@ ti_rxeof(sc)
*/
if (have_tag)
VLAN_INPUT_TAG(ifp, m, vlan_tag, continue);
+ TI_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ TI_LOCK(sc);
}
/* Only necessary on the Tigon 1. */
diff --git a/sys/dev/ti/if_tireg.h b/sys/dev/ti/if_tireg.h
index b15b28bb20f0..71d9661a5eb0 100644
--- a/sys/dev/ti/if_tireg.h
+++ b/sys/dev/ti/if_tireg.h
@@ -1030,6 +1030,7 @@ struct ti_softc {
#define TI_LOCK(_sc) mtx_lock(&(_sc)->ti_mtx)
#define TI_UNLOCK(_sc) mtx_unlock(&(_sc)->ti_mtx)
+#define TI_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->ti_mtx, MA_OWNED)
/*
* Microchip Technology 24Cxx EEPROM control bytes
diff --git a/sys/dev/vr/if_vr.c b/sys/dev/vr/if_vr.c
index 712bbea525d0..1d35c3fbf96f 100644
--- a/sys/dev/vr/if_vr.c
+++ b/sys/dev/vr/if_vr.c
@@ -1061,6 +1061,8 @@ vr_rxeof(sc)
int total_len = 0;
u_int32_t rxstat;
+ VR_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
while(!((rxstat = sc->vr_cdata.vr_rx_head->vr_ptr->vr_status) &
@@ -1122,7 +1124,9 @@ vr_rxeof(sc)
m = m0;
ifp->if_ipackets++;
+ VR_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ VR_LOCK(sc);
}
return;
diff --git a/sys/dev/vr/if_vrreg.h b/sys/dev/vr/if_vrreg.h
index 043c3edd36fe..2f8e810fd0ca 100644
--- a/sys/dev/vr/if_vrreg.h
+++ b/sys/dev/vr/if_vrreg.h
@@ -475,6 +475,7 @@ struct vr_softc {
#define VR_LOCK(_sc) mtx_lock(&(_sc)->vr_mtx)
#define VR_UNLOCK(_sc) mtx_unlock(&(_sc)->vr_mtx)
+#define VR_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->vr_mtx, MA_OWNED)
/*
* register space access macros
diff --git a/sys/dev/wl/if_wl.c b/sys/dev/wl/if_wl.c
index ecf1fa479857..465a49063cea 100644
--- a/sys/dev/wl/if_wl.c
+++ b/sys/dev/wl/if_wl.c
@@ -265,6 +265,7 @@ struct wl_softc{
};
#define WL_LOCK(_sc) mtx_lock(&(_sc)->wl_mtx)
+#define WL_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->wl_mtx, MA_OWNED)
#define WL_UNLOCK(_sc) mtx_unlock(&(_sc)->wl_mtx)
static int wlprobe(device_t);
@@ -1069,6 +1070,7 @@ wlread(struct wl_softc *sc, u_short fd_p)
u_short mlen, len;
u_short bytes_in_msg, bytes_in_mbuf, bytes;
+ WL_LOCK_ASSERT(sc);
#ifdef WLDEBUG
if (sc->wl_if.if_flags & IFF_DEBUG)
@@ -1212,7 +1214,9 @@ wlread(struct wl_softc *sc, u_short fd_p)
* received packet is now in a chain of mbuf's. next step is
* to pass the packet upwards.
*/
+ WL_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ WL_LOCK(sc);
return 1;
}
diff --git a/sys/pci/if_dc.c b/sys/pci/if_dc.c
index dc1c1b3ec88b..45ec33fc10de 100644
--- a/sys/pci/if_dc.c
+++ b/sys/pci/if_dc.c
@@ -2723,6 +2723,8 @@ dc_rxeof(struct dc_softc *sc)
int i, total_len = 0;
u_int32_t rxstat;
+ DC_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
i = sc->dc_cdata.dc_rx_prod;
@@ -2816,7 +2818,9 @@ dc_rxeof(struct dc_softc *sc)
}
ifp->if_ipackets++;
+ DC_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ DC_LOCK(sc);
}
sc->dc_cdata.dc_rx_prod = i;
@@ -3069,6 +3073,7 @@ dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
return;
}
+ DC_LOCK(sc);
sc->rxcycles = count;
dc_rxeof(sc);
dc_txeof(sc);
@@ -3082,8 +3087,10 @@ dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
status &= (DC_ISR_RX_WATDOGTIMEO | DC_ISR_RX_NOBUF |
DC_ISR_TX_NOBUF | DC_ISR_TX_IDLE | DC_ISR_TX_UNDERRUN |
DC_ISR_BUS_ERR);
- if (!status)
+ if (!status) {
+ DC_UNLOCK(sc);
return;
+ }
/* ack what we have */
CSR_WRITE_4(sc, DC_ISR, status);
@@ -3107,6 +3114,7 @@ dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
dc_init(sc);
}
}
+ DC_UNLOCK(sc);
}
#endif /* DEVICE_POLLING */
diff --git a/sys/pci/if_dcreg.h b/sys/pci/if_dcreg.h
index 14912b5bb457..fc77dd8c85d9 100644
--- a/sys/pci/if_dcreg.h
+++ b/sys/pci/if_dcreg.h
@@ -766,6 +766,7 @@ struct dc_softc {
#define DC_LOCK(_sc) mtx_lock(&(_sc)->dc_mtx)
#define DC_UNLOCK(_sc) mtx_unlock(&(_sc)->dc_mtx)
+#define DC_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->dc_mtx, MA_OWNED)
#define DC_TX_POLL 0x00000001
#define DC_TX_COALESCE 0x00000002
diff --git a/sys/pci/if_pcn.c b/sys/pci/if_pcn.c
index 914b54b999a9..56d57e1feccd 100644
--- a/sys/pci/if_pcn.c
+++ b/sys/pci/if_pcn.c
@@ -796,6 +796,8 @@ pcn_rxeof(sc)
struct pcn_rx_desc *cur_rx;
int i;
+ PCN_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
i = sc->pcn_cdata.pcn_rx_prod;
@@ -833,7 +835,9 @@ pcn_rxeof(sc)
cur_rx->pcn_rxlen - ETHER_CRC_LEN;
m->m_pkthdr.rcvif = ifp;
+ PCN_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ PCN_LOCK(sc);
}
sc->pcn_cdata.pcn_rx_prod = i;
diff --git a/sys/pci/if_pcnreg.h b/sys/pci/if_pcnreg.h
index 79ef53146792..0f3b86ddeb0b 100644
--- a/sys/pci/if_pcnreg.h
+++ b/sys/pci/if_pcnreg.h
@@ -453,6 +453,7 @@ struct pcn_softc {
#define PCN_LOCK(_sc) mtx_lock(&(_sc)->pcn_mtx)
#define PCN_UNLOCK(_sc) mtx_unlock(&(_sc)->pcn_mtx)
+#define PCN_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->pcn_mtx, MA_OWNED)
/*
* register space access macros
diff --git a/sys/pci/if_rl.c b/sys/pci/if_rl.c
index 9e25e2f1a2af..526b7271af5f 100644
--- a/sys/pci/if_rl.c
+++ b/sys/pci/if_rl.c
@@ -1236,6 +1236,8 @@ rl_rxeof(sc)
u_int16_t limit;
u_int16_t rx_bytes = 0, max_bytes;
+ RL_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
bus_dmamap_sync(sc->rl_tag, sc->rl_cdata.rl_rx_dmamap,
@@ -1336,7 +1338,9 @@ rl_rxeof(sc)
continue;
ifp->if_ipackets++;
+ RL_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ RL_LOCK(sc);
}
return;
diff --git a/sys/pci/if_rlreg.h b/sys/pci/if_rlreg.h
index 4d33c423d2c3..8bf6adae54c3 100644
--- a/sys/pci/if_rlreg.h
+++ b/sys/pci/if_rlreg.h
@@ -692,6 +692,7 @@ struct rl_softc {
#define RL_LOCK(_sc) mtx_lock(&(_sc)->rl_mtx)
#define RL_UNLOCK(_sc) mtx_unlock(&(_sc)->rl_mtx)
+#define RL_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->rl_mtx, MA_OWNED)
/*
* register space access macros
diff --git a/sys/pci/if_sf.c b/sys/pci/if_sf.c
index e1def22ec751..254277aff381 100644
--- a/sys/pci/if_sf.c
+++ b/sys/pci/if_sf.c
@@ -955,6 +955,8 @@ sf_rxeof(sc)
u_int32_t rxcons, rxprod;
int cmpprodidx, cmpconsidx, bufprodidx;
+ SF_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
rxcons = csr_read_4(sc, SF_CQ_CONSIDX);
@@ -988,7 +990,9 @@ sf_rxeof(sc)
m = m0;
ifp->if_ipackets++;
+ SF_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ SF_LOCK(sc);
}
csr_write_4(sc, SF_CQ_CONSIDX,
diff --git a/sys/pci/if_sfreg.h b/sys/pci/if_sfreg.h
index 1975cfce14b4..630f0b20dfac 100644
--- a/sys/pci/if_sfreg.h
+++ b/sys/pci/if_sfreg.h
@@ -1051,6 +1051,7 @@ struct sf_softc {
#define SF_LOCK(_sc) mtx_lock(&(_sc)->sf_mtx)
#define SF_UNLOCK(_sc) mtx_unlock(&(_sc)->sf_mtx)
+#define SF_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sf_mtx, MA_OWNED)
#define SF_TIMEOUT 1000
diff --git a/sys/pci/if_sis.c b/sys/pci/if_sis.c
index fec9a41b7cb8..bd3a26520140 100644
--- a/sys/pci/if_sis.c
+++ b/sys/pci/if_sis.c
@@ -1594,6 +1594,8 @@ sis_rxeof(sc)
int i, total_len = 0;
u_int32_t rxstat;
+ SIS_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
i = sc->sis_cdata.sis_rx_prod;
@@ -1661,7 +1663,9 @@ sis_rxeof(sc)
ifp->if_ipackets++;
m->m_pkthdr.rcvif = ifp;
+ SIS_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ SIS_LOCK(sc);
}
sc->sis_cdata.sis_rx_prod = i;
diff --git a/sys/pci/if_sisreg.h b/sys/pci/if_sisreg.h
index daccbb1e5834..e39bd0831f1a 100644
--- a/sys/pci/if_sisreg.h
+++ b/sys/pci/if_sisreg.h
@@ -479,6 +479,7 @@ struct sis_softc {
#define SIS_LOCK(_sc) mtx_lock(&(_sc)->sis_mtx)
#define SIS_UNLOCK(_sc) mtx_unlock(&(_sc)->sis_mtx)
+#define SIS_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sis_mtx, MA_OWNED)
/*
* register space access macros
diff --git a/sys/pci/if_sk.c b/sys/pci/if_sk.c
index 1ef44935baec..3226d91694ce 100644
--- a/sys/pci/if_sk.c
+++ b/sys/pci/if_sk.c
@@ -1839,6 +1839,7 @@ static void
sk_rxeof(sc_if)
struct sk_if_softc *sc_if;
{
+ struct sk_softc *sc;
struct mbuf *m;
struct ifnet *ifp;
struct sk_chain *cur_rx;
@@ -1846,10 +1847,13 @@ sk_rxeof(sc_if)
int i;
u_int32_t rxstat;
+ sc = sc_if->sk_softc;
ifp = &sc_if->arpcom.ac_if;
i = sc_if->sk_cdata.sk_rx_prod;
cur_rx = &sc_if->sk_cdata.sk_rx_chain[i];
+ SK_LOCK_ASSERT(sc);
+
while(!(sc_if->sk_rdata->sk_rx_ring[i].sk_ctl & SK_RXCTL_OWN)) {
cur_rx = &sc_if->sk_cdata.sk_rx_chain[i];
@@ -1891,7 +1895,9 @@ sk_rxeof(sc_if)
}
ifp->if_ipackets++;
+ SK_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ SK_LOCK(sc);
}
sc_if->sk_cdata.sk_rx_prod = i;
diff --git a/sys/pci/if_skreg.h b/sys/pci/if_skreg.h
index 7309841592b0..8e2eb5349701 100644
--- a/sys/pci/if_skreg.h
+++ b/sys/pci/if_skreg.h
@@ -1423,6 +1423,7 @@ struct sk_softc {
#define SK_LOCK(_sc) mtx_lock(&(_sc)->sk_mtx)
#define SK_UNLOCK(_sc) mtx_unlock(&(_sc)->sk_mtx)
+#define SK_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sk_mtx, MA_OWNED)
#define SK_IF_LOCK(_sc) mtx_lock(&(_sc)->sk_softc->sk_mtx)
#define SK_IF_UNLOCK(_sc) mtx_unlock(&(_sc)->sk_softc->sk_mtx)
diff --git a/sys/pci/if_ste.c b/sys/pci/if_ste.c
index cf1e920b43e8..5c08f8566e5d 100644
--- a/sys/pci/if_ste.c
+++ b/sys/pci/if_ste.c
@@ -693,6 +693,8 @@ ste_rxeof(sc)
int total_len = 0, count=0;
u_int32_t rxstat;
+ STE_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
while((rxstat = sc->ste_cdata.ste_rx_head->ste_ptr->ste_status)
@@ -750,7 +752,9 @@ ste_rxeof(sc)
m->m_pkthdr.len = m->m_len = total_len;
ifp->if_ipackets++;
+ STE_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ STE_LOCK(sc);
cur_rx->ste_ptr->ste_status = 0;
count++;
diff --git a/sys/pci/if_stereg.h b/sys/pci/if_stereg.h
index 5c1f8ff88ad9..99295acdb18c 100644
--- a/sys/pci/if_stereg.h
+++ b/sys/pci/if_stereg.h
@@ -530,6 +530,7 @@ struct ste_softc {
#define STE_LOCK(_sc) mtx_lock(&(_sc)->ste_mtx)
#define STE_UNLOCK(_sc) mtx_unlock(&(_sc)->ste_mtx)
+#define STE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->ste_mtx, MA_OWNED)
struct ste_mii_frame {
u_int8_t mii_stdelim;
diff --git a/sys/pci/if_ti.c b/sys/pci/if_ti.c
index 4cbea9b77c20..c5f3fc032ea2 100644
--- a/sys/pci/if_ti.c
+++ b/sys/pci/if_ti.c
@@ -2384,6 +2384,8 @@ ti_rxeof(sc)
struct ifnet *ifp;
struct ti_cmd_desc cmd;
+ TI_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
while(sc->ti_rx_saved_considx != sc->ti_return_prodidx.ti_idx) {
@@ -2479,7 +2481,9 @@ ti_rxeof(sc)
*/
if (have_tag)
VLAN_INPUT_TAG(ifp, m, vlan_tag, continue);
+ TI_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ TI_LOCK(sc);
}
/* Only necessary on the Tigon 1. */
diff --git a/sys/pci/if_tireg.h b/sys/pci/if_tireg.h
index b15b28bb20f0..71d9661a5eb0 100644
--- a/sys/pci/if_tireg.h
+++ b/sys/pci/if_tireg.h
@@ -1030,6 +1030,7 @@ struct ti_softc {
#define TI_LOCK(_sc) mtx_lock(&(_sc)->ti_mtx)
#define TI_UNLOCK(_sc) mtx_unlock(&(_sc)->ti_mtx)
+#define TI_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->ti_mtx, MA_OWNED)
/*
* Microchip Technology 24Cxx EEPROM control bytes
diff --git a/sys/pci/if_tl.c b/sys/pci/if_tl.c
index df7784f791ef..dd20b2afdfa8 100644
--- a/sys/pci/if_tl.c
+++ b/sys/pci/if_tl.c
@@ -1504,6 +1504,8 @@ tl_intvec_rxeof(xsc, type)
sc = xsc;
ifp = &sc->arpcom.ac_if;
+ TL_LOCK_ASSERT(sc);
+
while(sc->tl_cdata.tl_rx_head != NULL) {
cur_rx = sc->tl_cdata.tl_rx_head;
if (!(cur_rx->tl_ptr->tlist_cstat & TL_CSTAT_FRAMECMP))
@@ -1543,7 +1545,9 @@ tl_intvec_rxeof(xsc, type)
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = m->m_len = total_len;
+ TL_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ TL_LOCK(sc);
}
return(r);
diff --git a/sys/pci/if_tlreg.h b/sys/pci/if_tlreg.h
index fe711ac25408..086738d70d25 100644
--- a/sys/pci/if_tlreg.h
+++ b/sys/pci/if_tlreg.h
@@ -130,6 +130,7 @@ struct tl_softc {
#define TL_LOCK(_sc) mtx_lock(&(_sc)->tl_mtx)
#define TL_UNLOCK(_sc) mtx_unlock(&(_sc)->tl_mtx)
+#define TL_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->tl_mtx, MA_OWNED)
/*
* Transmit interrupt threshold.
diff --git a/sys/pci/if_vr.c b/sys/pci/if_vr.c
index 712bbea525d0..1d35c3fbf96f 100644
--- a/sys/pci/if_vr.c
+++ b/sys/pci/if_vr.c
@@ -1061,6 +1061,8 @@ vr_rxeof(sc)
int total_len = 0;
u_int32_t rxstat;
+ VR_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
while(!((rxstat = sc->vr_cdata.vr_rx_head->vr_ptr->vr_status) &
@@ -1122,7 +1124,9 @@ vr_rxeof(sc)
m = m0;
ifp->if_ipackets++;
+ VR_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ VR_LOCK(sc);
}
return;
diff --git a/sys/pci/if_vrreg.h b/sys/pci/if_vrreg.h
index 043c3edd36fe..2f8e810fd0ca 100644
--- a/sys/pci/if_vrreg.h
+++ b/sys/pci/if_vrreg.h
@@ -475,6 +475,7 @@ struct vr_softc {
#define VR_LOCK(_sc) mtx_lock(&(_sc)->vr_mtx)
#define VR_UNLOCK(_sc) mtx_unlock(&(_sc)->vr_mtx)
+#define VR_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->vr_mtx, MA_OWNED)
/*
* register space access macros
diff --git a/sys/pci/if_wb.c b/sys/pci/if_wb.c
index 13b29b005fa3..14be7224aea8 100644
--- a/sys/pci/if_wb.c
+++ b/sys/pci/if_wb.c
@@ -1132,6 +1132,8 @@ wb_rxeof(sc)
int total_len = 0;
u_int32_t rxstat;
+ WB_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
while(!((rxstat = sc->wb_cdata.wb_rx_head->wb_ptr->wb_status) &
@@ -1186,7 +1188,9 @@ wb_rxeof(sc)
m = m0;
ifp->if_ipackets++;
+ WB_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ WB_LOCK(sc);
}
}
diff --git a/sys/pci/if_wbreg.h b/sys/pci/if_wbreg.h
index 983886b6270c..5467de6a27ac 100644
--- a/sys/pci/if_wbreg.h
+++ b/sys/pci/if_wbreg.h
@@ -383,6 +383,7 @@ struct wb_softc {
#define WB_LOCK(_sc) mtx_lock(&(_sc)->wb_mtx)
#define WB_UNLOCK(_sc) mtx_unlock(&(_sc)->wb_mtx)
+#define WB_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->wb_mtx, MA_OWNED)
/*
* register space access macros
diff --git a/sys/pci/if_xl.c b/sys/pci/if_xl.c
index ae078ffc8323..3f5e8c997bed 100644
--- a/sys/pci/if_xl.c
+++ b/sys/pci/if_xl.c
@@ -2046,6 +2046,8 @@ xl_rxeof(sc)
int total_len = 0;
u_int32_t rxstat;
+ XL_LOCK_ASSERT(sc);
+
ifp = &sc->arpcom.ac_if;
again:
@@ -2137,7 +2139,9 @@ again:
}
}
+ XL_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ XL_LOCK(sc);
}
/*
diff --git a/sys/pci/if_xlreg.h b/sys/pci/if_xlreg.h
index d32d63619d3b..2fb139c9416a 100644
--- a/sys/pci/if_xlreg.h
+++ b/sys/pci/if_xlreg.h
@@ -610,9 +610,11 @@ struct xl_softc {
/* These are a bit premature. The driver still tries to sleep with locks. */
#define XL_LOCK(_sc) mtx_lock(&(_sc)->xl_mtx)
#define XL_UNLOCK(_sc) mtx_unlock(&(_sc)->xl_mtx)
+#define XL_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->xl_mtx, MA_OWNED)
#else
#define XL_LOCK(x) do { } while (0)
#define XL_UNLOCK(x) do { } while (0)
+#define XL_LOCK_ASSERT(x) do { } while (0)
#endif
#define xl_rx_goodframes(x) \