PERFORCE change 42150 for review

Sam Leffler sam at FreeBSD.org
Wed Nov 12 10:55:40 PST 2003


http://perforce.freebsd.org/chv.cgi?CH=42150

Change 42150 by sam at sam_ebb on 2003/11/12 10:55:11

	drop driver lock around calls to if_input to avoid
	a LOR if the packet comes back directly from the
	bridge or a packet forwarding path

Affected files ...

.. //depot/projects/netperf/sys/dev/an/if_an.c#5 edit
.. //depot/projects/netperf/sys/dev/an/if_anreg.h#4 edit
.. //depot/projects/netperf/sys/dev/bfe/if_bfe.c#3 edit
.. //depot/projects/netperf/sys/dev/my/if_my.c#5 edit
.. //depot/projects/netperf/sys/dev/owi/if_owi.c#3 edit
.. //depot/projects/netperf/sys/dev/owi/if_wivar.h#2 edit
.. //depot/projects/netperf/sys/dev/re/if_re.c#5 edit
.. //depot/projects/netperf/sys/dev/wl/if_wl.c#4 edit
.. //depot/projects/netperf/sys/pci/if_dc.c#12 edit
.. //depot/projects/netperf/sys/pci/if_dcreg.h#3 edit
.. //depot/projects/netperf/sys/pci/if_pcn.c#4 edit
.. //depot/projects/netperf/sys/pci/if_rl.c#11 edit
.. //depot/projects/netperf/sys/pci/if_rlreg.h#7 edit
.. //depot/projects/netperf/sys/pci/if_sf.c#4 edit
.. //depot/projects/netperf/sys/pci/if_sfreg.h#2 edit
.. //depot/projects/netperf/sys/pci/if_sis.c#15 edit
.. //depot/projects/netperf/sys/pci/if_sisreg.h#5 edit
.. //depot/projects/netperf/sys/pci/if_sk.c#6 edit
.. //depot/projects/netperf/sys/pci/if_skreg.h#4 edit
.. //depot/projects/netperf/sys/pci/if_ste.c#4 edit
.. //depot/projects/netperf/sys/pci/if_stereg.h#2 edit
.. //depot/projects/netperf/sys/pci/if_ti.c#6 edit
.. //depot/projects/netperf/sys/pci/if_tireg.h#2 edit
.. //depot/projects/netperf/sys/pci/if_tl.c#4 edit
.. //depot/projects/netperf/sys/pci/if_tlreg.h#2 edit
.. //depot/projects/netperf/sys/pci/if_vr.c#4 edit
.. //depot/projects/netperf/sys/pci/if_vrreg.h#2 edit
.. //depot/projects/netperf/sys/pci/if_wb.c#4 edit
.. //depot/projects/netperf/sys/pci/if_wbreg.h#2 edit
.. //depot/projects/netperf/sys/pci/if_xl.c#10 edit
.. //depot/projects/netperf/sys/pci/if_xlreg.h#3 edit

Differences ...

==== //depot/projects/netperf/sys/dev/an/if_an.c#5 (text+ko) ====

@@ -833,6 +833,8 @@
 	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 @@
 				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 */

==== //depot/projects/netperf/sys/dev/an/if_anreg.h#4 (text+ko) ====

@@ -502,6 +502,7 @@
 
 #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);

==== //depot/projects/netperf/sys/dev/bfe/if_bfe.c#3 (text+ko) ====

@@ -1153,7 +1153,9 @@
 
 		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);
 	}

==== //depot/projects/netperf/sys/dev/my/if_my.c#5 (text+ko) ====

@@ -1279,7 +1279,9 @@
 			}
 		}
 #endif
+		MY_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		MY_LOCK(sc);
 	}
 	MY_UNLOCK(sc);
 	return;

==== //depot/projects/netperf/sys/dev/owi/if_owi.c#3 (text+ko) ====

@@ -449,6 +449,8 @@
 	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 @@
 #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);
 	}
 }
 

==== //depot/projects/netperf/sys/dev/owi/if_wivar.h#2 (text+ko) ====

@@ -171,9 +171,11 @@
 #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);

==== //depot/projects/netperf/sys/dev/re/if_re.c#5 (text+ko) ====

@@ -1519,6 +1519,8 @@
 	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;
 
@@ -1661,7 +1663,9 @@
 		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 */

==== //depot/projects/netperf/sys/dev/wl/if_wl.c#4 (text+ko) ====

@@ -266,6 +266,7 @@
 };
 
 #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);
@@ -1070,6 +1071,7 @@
     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)
@@ -1213,7 +1215,9 @@
      * 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;
 }
 

==== //depot/projects/netperf/sys/pci/if_dc.c#12 (text+ko) ====

@@ -2721,6 +2721,8 @@
 	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;
 
@@ -2814,7 +2816,9 @@
 		}
 
 		ifp->if_ipackets++;
+		DC_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		DC_LOCK(sc);
 	}
 
 	sc->dc_cdata.dc_rx_prod = i;
@@ -3067,6 +3071,7 @@
 		CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
 		return;
 	}
+	DC_LOCK(sc);
 	sc->rxcycles = count;
 	dc_rxeof(sc);
 	dc_txeof(sc);
@@ -3080,8 +3085,10 @@
 		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);
 
@@ -3105,6 +3112,7 @@
 			dc_init(sc);
 		}
 	}
+	DC_UNLOCK(sc);
 }
 #endif /* DEVICE_POLLING */
 

==== //depot/projects/netperf/sys/pci/if_dcreg.h#3 (text+ko) ====

@@ -766,6 +766,7 @@
 
 #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

==== //depot/projects/netperf/sys/pci/if_pcn.c#4 (text+ko) ====

@@ -794,6 +794,8 @@
 	struct pcn_rx_desc	*cur_rx;
 	int			i;
 
+	PCN_LOCK_ASSERT(sc);
+
 	ifp = &sc->arpcom.ac_if;
 	i = sc->pcn_cdata.pcn_rx_prod;
 
@@ -831,7 +833,9 @@
 		    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;

==== //depot/projects/netperf/sys/pci/if_rl.c#11 (text+ko) ====

@@ -1239,6 +1239,8 @@
 	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,
@@ -1339,7 +1341,9 @@
 			continue;
 
 		ifp->if_ipackets++;
+		RL_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		RL_LOCK(sc);
 	}
 
 	return;

==== //depot/projects/netperf/sys/pci/if_rlreg.h#7 (text+ko) ====

@@ -692,6 +692,7 @@
 
 #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

==== //depot/projects/netperf/sys/pci/if_sf.c#4 (text+ko) ====

@@ -958,6 +958,8 @@
 	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);
@@ -991,7 +993,9 @@
 		m = m0;
 
 		ifp->if_ipackets++;
+		SF_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		SF_LOCK(sc);
 	}
 
 	csr_write_4(sc, SF_CQ_CONSIDX,

==== //depot/projects/netperf/sys/pci/if_sfreg.h#2 (text+ko) ====

@@ -1051,6 +1051,7 @@
 
 #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
 

==== //depot/projects/netperf/sys/pci/if_sis.c#15 (text+ko) ====

@@ -1596,6 +1596,8 @@
 	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;
 
@@ -1663,7 +1665,9 @@
 		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;

==== //depot/projects/netperf/sys/pci/if_sisreg.h#5 (text+ko) ====

@@ -479,6 +479,7 @@
 
 #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

==== //depot/projects/netperf/sys/pci/if_sk.c#6 (text+ko) ====

@@ -1834,6 +1834,7 @@
 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;
@@ -1841,10 +1842,13 @@
 	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];
@@ -1886,7 +1890,9 @@
 		}
 
 		ifp->if_ipackets++;
+		SK_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		SK_LOCK(sc);
 	}
 
 	sc_if->sk_cdata.sk_rx_prod = i;

==== //depot/projects/netperf/sys/pci/if_skreg.h#4 (text+ko) ====

@@ -1418,6 +1418,7 @@
 
 #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)
 

==== //depot/projects/netperf/sys/pci/if_ste.c#4 (text+ko) ====

@@ -695,6 +695,8 @@
 	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)
@@ -752,7 +754,9 @@
 		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++;

==== //depot/projects/netperf/sys/pci/if_stereg.h#2 (text+ko) ====

@@ -530,6 +530,7 @@
 
 #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;

==== //depot/projects/netperf/sys/pci/if_ti.c#6 (text+ko) ====

@@ -2384,6 +2384,8 @@
 	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 @@
 		 */
 		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. */

==== //depot/projects/netperf/sys/pci/if_tireg.h#2 (text+ko) ====

@@ -1030,6 +1030,7 @@
 
 #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

==== //depot/projects/netperf/sys/pci/if_tl.c#4 (text+ko) ====

@@ -1506,6 +1506,8 @@
 	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))
@@ -1545,7 +1547,9 @@
 		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);

==== //depot/projects/netperf/sys/pci/if_tlreg.h#2 (text+ko) ====

@@ -130,6 +130,7 @@
 
 #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.

==== //depot/projects/netperf/sys/pci/if_vr.c#4 (text+ko) ====

@@ -1063,6 +1063,8 @@
 	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) &
@@ -1124,7 +1126,9 @@
 		m = m0;
 
 		ifp->if_ipackets++;
+		VR_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		VR_LOCK(sc);
 	}
 
 	return;

==== //depot/projects/netperf/sys/pci/if_vrreg.h#2 (text+ko) ====

@@ -475,6 +475,7 @@
 
 #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

==== //depot/projects/netperf/sys/pci/if_wb.c#4 (text+ko) ====

@@ -1134,6 +1134,8 @@
 	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) &
@@ -1188,7 +1190,9 @@
 		m = m0;
 
 		ifp->if_ipackets++;
+		WB_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		WB_LOCK(sc);
 	}
 }
 

==== //depot/projects/netperf/sys/pci/if_wbreg.h#2 (text+ko) ====

@@ -383,6 +383,7 @@
 
 #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

==== //depot/projects/netperf/sys/pci/if_xl.c#10 (text+ko) ====

@@ -2048,6 +2048,8 @@
 	int			total_len = 0;
 	u_int32_t		rxstat;
 
+	XL_LOCK_ASSERT(sc);
+
 	ifp = &sc->arpcom.ac_if;
 
 again:
@@ -2139,7 +2141,9 @@
 			}
 		}
 
+		XL_UNLOCK(sc);
 		(*ifp->if_input)(ifp, m);
+		XL_LOCK(sc);
 	}
 
 	/*

==== //depot/projects/netperf/sys/pci/if_xlreg.h#3 (text+ko) ====

@@ -610,9 +610,11 @@
 /* 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) \


More information about the p4-projects mailing list