PERFORCE change 123802 for review

Rui Paulo rpaulo at FreeBSD.org
Fri Jul 20 16:11:33 UTC 2007


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

Change 123802 by rpaulo at rpaulo_epsilon on 2007/07/20 16:11:03

	IFC

Affected files ...

.. //depot/projects/soc2007/rpaulo-macbook/conf/NOTES#14 integrate
.. //depot/projects/soc2007/rpaulo-macbook/conf/files#19 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/firewire/firewire.c#8 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/firewire/firewirereg.h#7 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/msk/if_msk.c#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/mxge/eth_z8e.dat.gz.uu#5 delete
.. //depot/projects/soc2007/rpaulo-macbook/dev/mxge/eth_z8e.h#1 branch
.. //depot/projects/soc2007/rpaulo-macbook/dev/mxge/ethp_z8e.dat.gz.uu#5 delete
.. //depot/projects/soc2007/rpaulo-macbook/dev/mxge/ethp_z8e.h#1 branch
.. //depot/projects/soc2007/rpaulo-macbook/dev/mxge/if_mxge.c#10 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/mxge/mxge_eth_z8e.c#1 branch
.. //depot/projects/soc2007/rpaulo-macbook/dev/mxge/mxge_ethp_z8e.c#1 branch
.. //depot/projects/soc2007/rpaulo-macbook/fs/coda/coda_vfsops.c#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/fs/coda/coda_vnops.c#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/fs/tmpfs/tmpfs_vnops.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/i386/linux/linux_machdep.c#5 integrate
.. //depot/projects/soc2007/rpaulo-macbook/kern/kern_mutex.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/kern/kern_rwlock.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/kern/kern_sig.c#5 integrate
.. //depot/projects/soc2007/rpaulo-macbook/kern/kern_switch.c#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/kern/sched_4bsd.c#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/kern/sched_ule.c#7 integrate
.. //depot/projects/soc2007/rpaulo-macbook/kern/tty.c#5 integrate
.. //depot/projects/soc2007/rpaulo-macbook/modules/Makefile#12 integrate
.. //depot/projects/soc2007/rpaulo-macbook/modules/mxge/mxge_eth_z8e/Makefile#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/modules/mxge/mxge_ethp_z8e/Makefile#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/net80211/ieee80211_scan_sta.c#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/icmp_var.h#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/ip_icmp.c#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet6/in6.h#5 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet6/udp6_usrreq.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netipsec/ipsec_input.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netipsec/ipsec_output.c#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netipsec/xform_ipip.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/sparc64/sparc64/pmap.c#5 integrate
.. //depot/projects/soc2007/rpaulo-macbook/sys/mutex.h#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/sys/rwlock.h#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/vm/vm_fault.c#7 integrate

Differences ...

==== //depot/projects/soc2007/rpaulo-macbook/conf/NOTES#14 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1444 2007/07/14 21:49:23 rwatson Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1446 2007/07/19 16:15:58 gallatin Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -176,10 +176,11 @@
 # queue and no CPU affinity which makes it suboptimal for SMP.  It has very
 # good interactivity and priority selection.
 #
-# SCHED_ULE is a new scheduler that has been designed for SMP and has some
-# advantages for UP as well.  It is intended to replace the 4BSD scheduler
-# over time.  NOTE: SCHED_ULE is currently considered experimental and is
-# not recommended for production use at this time.
+# SCHED_ULE provides significant performance advantages over 4BSD on many
+# workloads on SMP machines.  It supports cpu-affinity, per-cpu runqueues
+# and scheduler locks.  It also has a stronger notion of interactivity 
+# which leads to better responsiveness even on uniprocessor machines.  This
+# will eventually become the default scheduler.
 #
 options 	SCHED_4BSD
 #options 	SCHED_ULE
@@ -1898,6 +1899,7 @@
 # PCI Ethernet NICs.
 device		de		# DEC/Intel DC21x4x (``Tulip'')
 device		le		# AMD Am7900 LANCE and Am79C9xx PCnet
+device		mxge		# Myricom Myri-10G 10GbE NIC
 device		nxge		# Neterion Xframe 10GbE Server/Storage Adapter
 device		txp		# 3Com 3cR990 (``Typhoon'')
 device		vx		# 3Com 3c590, 3c595 (``Vortex'')

==== //depot/projects/soc2007/rpaulo-macbook/conf/files#19 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.1238 2007/07/14 21:49:23 rwatson Exp $
+# $FreeBSD: src/sys/conf/files,v 1.1239 2007/07/19 16:15:58 gallatin Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -812,6 +812,10 @@
 dev/mpt/mpt_pci.c		optional mpt pci
 dev/mpt/mpt_raid.c		optional mpt
 dev/msk/if_msk.c		optional msk
+dev/mxge/if_mxge.c		optional mxge pci
+dev/mxge/mxge_lro.c		optional mxge pci
+dev/mxge/mxge_eth_z8e.c		optional mxge pci
+dev/mxge/mxge_ethp_z8e.c	optional mxge pci
 dev/my/if_my.c			optional my
 dev/ncv/ncr53c500.c		optional ncv
 dev/ncv/ncr53c500_pccard.c	optional ncv pccard
@@ -1631,7 +1635,7 @@
 net/slcompress.c		optional netgraph_vjc | ppp | sl | sppp | \
 					 netgraph_sppp
 net/zlib.c			optional crypto | geom_uzip | ipsec | \
-					 ppp_deflate | netgraph_deflate
+					 mxge | ppp_deflate | netgraph_deflate
 net80211/ieee80211.c		optional wlan
 net80211/ieee80211_acl.c	optional wlan_acl
 net80211/ieee80211_amrr.c	optional wlan_amrr

==== //depot/projects/soc2007/rpaulo-macbook/dev/firewire/firewire.c#8 (text+ko) ====

@@ -31,7 +31,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.99 2007/07/15 13:00:29 simokawa Exp $
+ * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.100 2007/07/20 03:42:57 simokawa Exp $
  *
  */
 
@@ -360,7 +360,7 @@
 	STAILQ_INIT(&xfer_timeout);
 
 	s = splfw();
-	FW_GLOCK(fc);
+	mtx_lock(&fc->tlabel_lock);
 	for (i = 0; i < 0x40; i ++) {
 		while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
 			if ((xfer->flag & FWXF_SENT) == 0)
@@ -378,7 +378,7 @@
 			STAILQ_INSERT_TAIL(&xfer_timeout, xfer, tlabel);
 		}
 	}
-	FW_GUNLOCK(fc);
+	mtx_unlock(&fc->tlabel_lock);
 	splx(s);
 	fc->timeout(fc);
 
@@ -430,6 +430,7 @@
 	fwdev_makedev(sc);
 
 	mtx_init(&fc->wait_lock, "fwwait", NULL, MTX_DEF);
+	mtx_init(&fc->tlabel_lock, "fwtlabel", NULL, MTX_DEF);
 	CALLOUT_INIT(&fc->timeout_callout);
 	CALLOUT_INIT(&fc->bmr_callout);
 	CALLOUT_INIT(&fc->busprobe_callout);
@@ -527,6 +528,7 @@
 	free(fc->speed_map, M_FW);
 	free(fc->crom_src_buf, M_FW);
 
+	mtx_destroy(&fc->tlabel_lock);
 	mtx_destroy(&fc->wait_lock);
 	return(0);
 }
@@ -569,7 +571,9 @@
 	fw_xferq_drain(fc->ats);
 	for(i = 0; i < fc->nisodma; i++)
 		fw_xferq_drain(fc->it[i]);
+	FW_GUNLOCK(fc);
 
+	mtx_lock(&fc->tlabel_lock);
 	for (i = 0; i < 0x40; i ++)
 		while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
 			if (firewire_debug)
@@ -578,7 +582,7 @@
 			STAILQ_REMOVE_HEAD(&fc->tlabels[i], tlabel);
 			STAILQ_INSERT_TAIL(&xfer_drain, xfer, tlabel);
 		}
-	FW_GUNLOCK(fc);
+	mtx_unlock(&fc->tlabel_lock);
 
 	STAILQ_FOREACH_SAFE(xfer, &xfer_drain, tlabel, txfer)
 		xfer->hand(xfer);	
@@ -1011,7 +1015,7 @@
 		return;
 
 	s = splfw();
-	FW_GLOCK(fc);
+	mtx_lock(&fc->tlabel_lock);
 #if 1	/* make sure the label is allocated */
 	STAILQ_FOREACH(txfer, &fc->tlabels[xfer->tl], tlabel)
 		if(txfer == xfer)
@@ -1023,14 +1027,14 @@
 		fw_dump_hdr(&xfer->send.hdr, "send");
 		fw_dump_hdr(&xfer->recv.hdr, "recv");
 		kdb_backtrace();
-		FW_GUNLOCK(fc);
+		mtx_unlock(&fc->tlabel_lock);
 		splx(s);
 		return;
 	}
 #endif
 
 	STAILQ_REMOVE(&fc->tlabels[xfer->tl], xfer, fw_xfer, tlabel);
-	FW_GUNLOCK(fc);
+	mtx_unlock(&fc->tlabel_lock);
 	splx(s);
 	return;
 }
@@ -1045,10 +1049,10 @@
 	int s = splfw();
 	int req;
 
-	FW_GLOCK(fc);
+	mtx_lock(&fc->tlabel_lock);
 	STAILQ_FOREACH(xfer, &fc->tlabels[tlabel], tlabel)
 		if(xfer->send.hdr.mode.hdr.dst == node) {
-			FW_GUNLOCK(fc);
+			mtx_unlock(&fc->tlabel_lock);
 			splx(s);
 			KASSERT(xfer->tl == tlabel,
 				("xfer->tl 0x%x != 0x%x", xfer->tl, tlabel));
@@ -1065,7 +1069,7 @@
 				printf("fw_tl2xfer: found tl=%d\n", tlabel);
 			return(xfer);
 		}
-	FW_GUNLOCK(fc);
+	mtx_unlock(&fc->tlabel_lock);
 	if (firewire_debug > 1)
 		printf("fw_tl2xfer: not found tl=%d\n", tlabel);
 	splx(s);
@@ -1717,7 +1721,7 @@
 
 	dst = xfer->send.hdr.mode.hdr.dst & 0x3f;
 	s = splfw();
-	FW_GLOCK(fc);
+	mtx_lock(&fc->tlabel_lock);
 	new_tlabel = (fc->last_tlabel[dst] + 1) & 0x3f;
 	STAILQ_FOREACH(txfer, &fc->tlabels[new_tlabel], tlabel)
 		if ((txfer->send.hdr.mode.hdr.dst & 0x3f) == dst)
@@ -1725,7 +1729,7 @@
 	if(txfer == NULL) {
 		fc->last_tlabel[dst] = new_tlabel;
 		STAILQ_INSERT_TAIL(&fc->tlabels[new_tlabel], xfer, tlabel);
-		FW_GUNLOCK(fc);
+		mtx_unlock(&fc->tlabel_lock);
 		splx(s);
 		xfer->tl = new_tlabel;
 		xfer->send.hdr.mode.hdr.tlrt = new_tlabel << 2;
@@ -1733,7 +1737,7 @@
 			printf("fw_get_tlabel: dst=%d tl=%d\n", dst, new_tlabel);
 		return (new_tlabel);
 	}
-	FW_GUNLOCK(fc);
+	mtx_unlock(&fc->tlabel_lock);
 	splx(s);
 
 	if (firewire_debug > 1)

==== //depot/projects/soc2007/rpaulo-macbook/dev/firewire/firewirereg.h#7 (text+ko) ====

@@ -31,7 +31,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  * 
- * $FreeBSD: src/sys/dev/firewire/firewirereg.h,v 1.49 2007/07/15 13:00:29 simokawa Exp $
+ * $FreeBSD: src/sys/dev/firewire/firewirereg.h,v 1.50 2007/07/20 03:42:57 simokawa Exp $
  *
  */
 
@@ -134,6 +134,7 @@
 		*arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH];
 	struct fw_xferlist tlabels[0x40];
 	u_char last_tlabel[0x40];
+	struct mtx tlabel_lock;
 	STAILQ_HEAD(, fw_bind) binds;
 	STAILQ_HEAD(, fw_device) devices;
 	u_int  sid_cnt;

==== //depot/projects/soc2007/rpaulo-macbook/dev/msk/if_msk.c#4 (text+ko) ====

@@ -99,7 +99,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/msk/if_msk.c,v 1.17 2007/06/11 02:00:50 yongari Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/msk/if_msk.c,v 1.18 2007/07/20 00:25:20 yongari Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -154,6 +154,8 @@
 /* Tunables. */
 static int msi_disable = 0;
 TUNABLE_INT("hw.msk.msi_disable", &msi_disable);
+static int legacy_intr = 0;
+TUNABLE_INT("hw.msk.legacy_intr", &legacy_intr);
 
 #define MSK_CSUM_FEATURES	(CSUM_TCP | CSUM_UDP)
 
@@ -229,6 +231,7 @@
 static int msk_detach(device_t);
 
 static void msk_tick(void *);
+static void msk_legacy_intr(void *);
 static int msk_intr(void *);
 static void msk_int_task(void *, int);
 static void msk_intr_phy(struct msk_if_softc *);
@@ -1709,6 +1712,8 @@
 	 * port cards with separate MSI messages, so for now I disable MSI
 	 * on dual port cards.
 	 */
+	if (legacy_intr != 0)
+		msi_disable = 1;
 	if (msic == 2 && msi_disable == 0 && sc->msk_num_port == 1 &&
 	    pci_alloc_msi(dev, &msic) == 0) {
 		if (msic == 2) {
@@ -1778,18 +1783,25 @@
 		goto fail;
 	}
 
-	TASK_INIT(&sc->msk_int_task, 0, msk_int_task, sc);
-	sc->msk_tq = taskqueue_create_fast("msk_taskq", M_WAITOK,
-	    taskqueue_thread_enqueue, &sc->msk_tq);
-	taskqueue_start_threads(&sc->msk_tq, 1, PI_NET, "%s taskq",
-	    device_get_nameunit(sc->msk_dev));
 	/* Hook interrupt last to avoid having to lock softc. */
-	error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET |
-	    INTR_MPSAFE, msk_intr, NULL, sc, &sc->msk_intrhand[0]);
+	if (legacy_intr)
+		error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET |
+		    INTR_MPSAFE, NULL, msk_legacy_intr, sc,
+		    &sc->msk_intrhand[0]);
+	else {
+		TASK_INIT(&sc->msk_int_task, 0, msk_int_task, sc);
+		sc->msk_tq = taskqueue_create_fast("msk_taskq", M_WAITOK,
+		    taskqueue_thread_enqueue, &sc->msk_tq);
+		taskqueue_start_threads(&sc->msk_tq, 1, PI_NET, "%s taskq",
+		    device_get_nameunit(sc->msk_dev));
+		error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET |
+		    INTR_MPSAFE, msk_intr, NULL, sc, &sc->msk_intrhand[0]);
+	}
 
 	if (error != 0) {
 		device_printf(dev, "couldn't set up interrupt handler\n");
-		taskqueue_free(sc->msk_tq);
+		if (legacy_intr == 0)
+			taskqueue_free(sc->msk_tq);
 		sc->msk_tq = NULL;
 		goto fail;
 	}
@@ -1892,7 +1904,7 @@
 
 	msk_status_dma_free(sc);
 
-	if (sc->msk_tq != NULL) {
+	if (legacy_intr == 0 && sc->msk_tq != NULL) {
 		taskqueue_drain(sc->msk_tq, &sc->msk_int_task);
 		taskqueue_free(sc->msk_tq);
 		sc->msk_tq = NULL;
@@ -3503,6 +3515,75 @@
 	return (sc->msk_stat_cons != CSR_READ_2(sc, STAT_PUT_IDX));
 }
 
+/* Legacy interrupt handler for shared interrupt. */
+static void
+msk_legacy_intr(void *xsc)
+{
+	struct msk_softc *sc;
+	struct msk_if_softc *sc_if0, *sc_if1;
+	struct ifnet *ifp0, *ifp1;
+	uint32_t status;
+
+	sc = xsc;
+	MSK_LOCK(sc);
+
+	/* Reading B0_Y2_SP_ISRC2 masks further interrupts. */
+	status = CSR_READ_4(sc, B0_Y2_SP_ISRC2);
+	if (status == 0 || status == 0xffffffff || sc->msk_suspended != 0 ||
+	    (status & sc->msk_intrmask) == 0) {
+		CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2);
+		return;
+	}
+
+	sc_if0 = sc->msk_if[MSK_PORT_A];
+	sc_if1 = sc->msk_if[MSK_PORT_B];
+	ifp0 = ifp1 = NULL;
+	if (sc_if0 != NULL)
+		ifp0 = sc_if0->msk_ifp;
+	if (sc_if1 != NULL)
+		ifp1 = sc_if1->msk_ifp;
+
+	if ((status & Y2_IS_IRQ_PHY1) != 0 && sc_if0 != NULL)
+		msk_intr_phy(sc_if0);
+	if ((status & Y2_IS_IRQ_PHY2) != 0 && sc_if1 != NULL)
+		msk_intr_phy(sc_if1);
+	if ((status & Y2_IS_IRQ_MAC1) != 0 && sc_if0 != NULL)
+		msk_intr_gmac(sc_if0);
+	if ((status & Y2_IS_IRQ_MAC2) != 0 && sc_if1 != NULL)
+		msk_intr_gmac(sc_if1);
+	if ((status & (Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2)) != 0) {
+		device_printf(sc->msk_dev, "Rx descriptor error\n");
+		sc->msk_intrmask &= ~(Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2);
+		CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask);
+		CSR_READ_4(sc, B0_IMSK);
+	}
+        if ((status & (Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2)) != 0) {
+		device_printf(sc->msk_dev, "Tx descriptor error\n");
+		sc->msk_intrmask &= ~(Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2);
+		CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask);
+		CSR_READ_4(sc, B0_IMSK);
+	}
+	if ((status & Y2_IS_HW_ERR) != 0)
+		msk_intr_hwerr(sc);
+
+	while (msk_handle_events(sc) != 0)
+		;
+	if ((status & Y2_IS_STAT_BMU) != 0)
+		CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_CLR_IRQ);
+
+	/* Reenable interrupts. */
+	CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2);
+
+	if (ifp0 != NULL && (ifp0->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
+	    !IFQ_DRV_IS_EMPTY(&ifp0->if_snd))
+		taskqueue_enqueue(taskqueue_fast, &sc_if0->msk_tx_task);
+	if (ifp1 != NULL && (ifp1->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
+	    !IFQ_DRV_IS_EMPTY(&ifp1->if_snd))
+		taskqueue_enqueue(taskqueue_fast, &sc_if1->msk_tx_task);
+
+	MSK_UNLOCK(sc);
+}
+
 static int
 msk_intr(void *xsc)
 {

==== //depot/projects/soc2007/rpaulo-macbook/dev/mxge/if_mxge.c#10 (text+ko) ====

@@ -28,7 +28,7 @@
 ***************************************************************************/
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mxge/if_mxge.c,v 1.39 2007/07/12 16:04:54 gallatin Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mxge/if_mxge.c,v 1.40 2007/07/19 16:15:59 gallatin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -124,6 +124,7 @@
 /* Declare ourselves to be a child of the PCI bus.*/
 DRIVER_MODULE(mxge, pci, mxge_driver, mxge_devclass, 0, 0);
 MODULE_DEPEND(mxge, firmware, 1, 1, 1);
+MODULE_DEPEND(mxge, zlib, 1, 1, 1);
 
 static int mxge_load_firmware(mxge_softc_t *sc);
 static int mxge_send_cmd(mxge_softc_t *sc, uint32_t cmd, mxge_cmd_t *data);
@@ -145,6 +146,7 @@
 static void
 mxge_enable_wc(mxge_softc_t *sc)
 {
+#if defined(__i386) || defined(__amd64)
 	struct mem_range_desc mrdesc;
 	vm_paddr_t pa;
 	vm_offset_t len;
@@ -152,7 +154,6 @@
 
 	sc->wc = 1;
 	len = rman_get_size(sc->mem_res);
-#if defined(__i386) || defined(__amd64)
 	err = pmap_change_attr((vm_offset_t) sc->sram,
 			       len, PAT_WRITE_COMBINING);
 	if (err == 0)
@@ -160,7 +161,6 @@
 	else
 		device_printf(sc->dev, "pmap_change_attr failed, %d\n",
 			      err);
-#endif		
 	pa = rman_get_start(sc->mem_res);
 	mrdesc.mr_base = pa;
 	mrdesc.mr_len = len;
@@ -174,6 +174,7 @@
 			      "w/c failed for pa 0x%lx, len 0x%lx, err = %d\n",
 			      (unsigned long)pa, (unsigned long)len, err);
 	}
+#endif		
 }
 
 
@@ -423,7 +424,7 @@
 }
 #else
 static void
-mxge_enable_nvidia_ecrc(mxge_softc_t *sc, device_t pdev)
+mxge_enable_nvidia_ecrc(mxge_softc_t *sc)
 {
 	device_printf(sc->dev,
 		      "Nforce 4 chipset on non-x86/amd64!?!?!\n");
@@ -644,62 +645,101 @@
 
 }
 
+static void *
+z_alloc(void *nil, u_int items, u_int size)
+{
+        void *ptr;
+
+        ptr = malloc(items * size, M_TEMP, M_NOWAIT);
+        return ptr;
+}
+
+static void
+z_free(void *nil, void *ptr)
+{
+        free(ptr, M_TEMP);
+}
+
+
 static int
 mxge_load_firmware_helper(mxge_softc_t *sc, uint32_t *limit)
 {
+	z_stream zs;
+	char *inflate_buffer;
 	const struct firmware *fw;
 	const mcp_gen_header_t *hdr;
 	unsigned hdr_offset;
-	const char *fw_data;
-	union qualhack hack;
 	int status;
 	unsigned int i;
 	char dummy;
-	
+	size_t fw_len;
 
 	fw = firmware_get(sc->fw_name);
-
 	if (fw == NULL) {
 		device_printf(sc->dev, "Could not find firmware image %s\n",
 			      sc->fw_name);
 		return ENOENT;
 	}
-	if (fw->datasize > *limit || 
-	    fw->datasize < MCP_HEADER_PTR_OFFSET + 4) {
-		device_printf(sc->dev, "Firmware image %s too large (%d/%d)\n",
-			      sc->fw_name, (int)fw->datasize, (int) *limit);
-		status = ENOSPC;
+
+
+
+	/* setup zlib and decompress f/w */
+	bzero(&zs, sizeof (zs));
+	zs.zalloc = z_alloc;
+	zs.zfree = z_free;
+	status = inflateInit(&zs);
+	if (status != Z_OK) {
+		status = EIO;
 		goto abort_with_fw;
 	}
-	*limit = fw->datasize;
+
+	/* the uncompressed size is stored as the firmware version,
+	   which would otherwise go unused */
+	fw_len = (size_t) fw->version; 
+	inflate_buffer = malloc(fw_len, M_TEMP, M_NOWAIT);
+	if (inflate_buffer == NULL)
+		goto abort_with_zs;
+	zs.avail_in = fw->datasize;
+	zs.next_in = __DECONST(char *, fw->data);
+	zs.avail_out = fw_len;
+	zs.next_out = inflate_buffer;
+	status = inflate(&zs, Z_FINISH);
+	if (status != Z_STREAM_END) {
+		device_printf(sc->dev, "zlib %d\n", status);
+		status = EIO;
+		goto abort_with_buffer;
+	}
 
 	/* check id */
-	fw_data = (const char *)fw->data;
 	hdr_offset = htobe32(*(const uint32_t *)
-			     (fw_data + MCP_HEADER_PTR_OFFSET));
-	if ((hdr_offset & 3) || hdr_offset + sizeof(*hdr) > fw->datasize) {
+			     (inflate_buffer + MCP_HEADER_PTR_OFFSET));
+	if ((hdr_offset & 3) || hdr_offset + sizeof(*hdr) > fw_len) {
 		device_printf(sc->dev, "Bad firmware file");
 		status = EIO;
-		goto abort_with_fw;
+		goto abort_with_buffer;
 	}
-	hdr = (const void*)(fw_data + hdr_offset); 
+	hdr = (const void*)(inflate_buffer + hdr_offset); 
 
 	status = mxge_validate_firmware(sc, hdr);
 	if (status != 0)
-		goto abort_with_fw;
+		goto abort_with_buffer;
 
-	hack.ro_char = fw_data;
 	/* Copy the inflated firmware to NIC SRAM. */
-	for (i = 0; i < *limit; i += 256) {
+	for (i = 0; i < fw_len; i += 256) {
 		mxge_pio_copy(sc->sram + MXGE_FW_OFFSET + i,
-			      hack.rw_char + i,
-			      min(256U, (unsigned)(*limit - i)));
+			      inflate_buffer + i,
+			      min(256U, (unsigned)(fw_len - i)));
 		mb();
 		dummy = *sc->sram;
 		mb();
 	}
 
+	*limit = fw_len;
 	status = 0;
+abort_with_buffer:
+	free(inflate_buffer, M_TEMP);
+abort_with_zs:
+	inflateEnd(&zs);
 abort_with_fw:
 	firmware_put(fw, FIRMWARE_UNLOAD);
 	return status;
@@ -3205,7 +3245,6 @@
 			  &mxge_verbose);	
 	TUNABLE_INT_FETCH("hw.mxge.ticks", &mxge_ticks);
 	TUNABLE_INT_FETCH("hw.mxge.lro_cnt", &sc->lro_cnt);
-	printf("%d %d\n", sc->lro_cnt, mxge_lro_cnt);
 	if (sc->lro_cnt != 0)
 		mxge_lro_cnt = sc->lro_cnt;
 

==== //depot/projects/soc2007/rpaulo-macbook/fs/coda/coda_vfsops.c#2 (text+ko) ====

@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vfsops.c,v 1.66 2007/07/12 21:04:57 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vfsops.c,v 1.67 2007/07/20 11:14:51 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -227,6 +227,7 @@
 	printf("coda_unmount: ROOT: vp %p, cp %p\n", mi->mi_rootvp, VTOC(mi->mi_rootvp));
 #endif
 	vrele(mi->mi_rootvp);
+	vrele(coda_ctlvp);
 	active = coda_kill(vfsp, NOT_DOWNCALL);
 	ASSERT_VOP_LOCKED(mi->mi_rootvp, "coda_unmount");
 	mi->mi_rootvp->v_vflag &= ~VV_ROOT;

==== //depot/projects/soc2007/rpaulo-macbook/fs/coda/coda_vnops.c#2 (text+ko) ====

@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vnops.c,v 1.75 2007/07/12 21:04:57 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/coda/coda_vnops.c,v 1.76 2007/07/20 11:14:51 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -745,11 +745,6 @@
     /* We don't need to send inactive to venus - DCS */
     MARK_ENTRY(CODA_INACTIVE_STATS);
 
-    if (IS_CTL_VP(vp)) {
-	MARK_INT_SAT(CODA_INACTIVE_STATS);
-	return 0;
-    }
-
     CODADEBUG(CODA_INACTIVE, myprintf(("in inactive, %s, vfsp %p\n",
 				  coda_f2s(&cp->c_fid), vp->v_mount));)
  

==== //depot/projects/soc2007/rpaulo-macbook/fs/tmpfs/tmpfs_vnops.c#6 (text+ko) ====

@@ -41,7 +41,7 @@
  * tmpfs vnode interface.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/fs/tmpfs/tmpfs_vnops.c,v 1.7 2007/07/08 15:56:12 delphij Exp $");
+__FBSDID("$FreeBSD: src/sys/fs/tmpfs/tmpfs_vnops.c,v 1.8 2007/07/19 03:34:50 delphij Exp $");
 
 #include <sys/param.h>
 #include <sys/fcntl.h>
@@ -440,72 +440,80 @@
 }
 
 /* --------------------------------------------------------------------- */
+
 static int
-tmpfs_uio_xfer(struct tmpfs_mount *tmp, struct tmpfs_node *node,
-    struct uio *uio, vm_object_t uobj)
+tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio)
 {
-	struct sf_buf *sf;
-	vm_pindex_t idx;
-	vm_offset_t d;
-	vm_page_t m;
-	size_t len;
-	int error = 0;
-	int behind = 0, ahead = 0;
+	vm_pindex_t	idx;
+	vm_page_t	m;
+	struct sf_buf	*sf;
+	off_t		offset, addr;
+	size_t		tlen;
+	caddr_t		va;
+	int		error;
 
-	/* uobj - locked by caller */
+	addr = uio->uio_offset;
+	idx = OFF_TO_IDX(addr);
+	offset = addr & PAGE_MASK;
+	tlen = MIN(PAGE_SIZE - offset, len);
 
-	VM_OBJECT_LOCK(uobj);
-	vm_object_pip_add(uobj, 1);
-	while (error == 0 && uio->uio_resid > 0) {
-		if (node->tn_size <= uio->uio_offset)
-			break;
+	if ((vobj == NULL) || (vobj->resident_page_count == 0))
+		goto nocache;
 
-		len = MIN(node->tn_size - uio->uio_offset, uio->uio_resid);
-		if (len == 0)
-			break;
-
-		idx = OFF_TO_IDX(uio->uio_offset);
-		d = uio->uio_offset - IDX_TO_OFF(idx);
-		len = MIN(len, (PAGE_SIZE - d));
-		m = vm_page_grab(uobj, idx, VM_ALLOC_WIRED | VM_ALLOC_ZERO |
-				VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
-		if (m->valid != VM_PAGE_BITS_ALL){
-			if (vm_pager_has_page(uobj, idx, &behind, &ahead)){
-				error = vm_pager_get_pages(uobj, &m, 1, 0);
-				if (error == VM_PAGER_ERROR){
-					printf("vm_pager_get_pages error\n");
-					goto	out;
-				}
-#ifdef DIAGNOSTIC
-				/* XXX */
-				printf("tmpfs gets page from pager\n");
-#endif
-			} else {
-				vm_page_zero_invalid(m, TRUE);
-			}
-		}
-		VM_OBJECT_UNLOCK(uobj);
+	VM_OBJECT_LOCK(vobj);
+lookupvpg:
+	if (((m = vm_page_lookup(vobj, idx)) != NULL) &&
+	    vm_page_is_valid(m, offset, tlen)) {
+		if (vm_page_sleep_if_busy(m, FALSE, "tmfsmr"))
+			goto lookupvpg;
+		vm_page_busy(m);
+		VM_OBJECT_UNLOCK(vobj);
 		sched_pin();
 		sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
-		error = uiomove((void *)(sf_buf_kva(sf) + d), len, uio);
+		va = (caddr_t)sf_buf_kva(sf);
+		error = uiomove(va + offset, tlen, uio);
 		sf_buf_free(sf);
 		sched_unpin();
-		VM_OBJECT_LOCK(uobj);
-		vm_page_lock_queues();
-		if (error == 0 && uio->uio_rw == UIO_WRITE) {
-			vm_page_set_validclean(m, d, len);
+		VM_OBJECT_LOCK(vobj);
+		vm_page_wakeup(m);
+		VM_OBJECT_UNLOCK(vobj);
+		return	(error);
+	} 
+	VM_OBJECT_UNLOCK(vobj);
+nocache:
+	VM_OBJECT_LOCK(tobj);
+	vm_object_pip_add(tobj, 1);
+	m = vm_page_grab(tobj, idx, VM_ALLOC_WIRED |
+	    VM_ALLOC_ZERO | VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+	if (m->valid != VM_PAGE_BITS_ALL) {
+		int behind, ahead;
+		if (vm_pager_has_page(tobj, idx, &behind, &ahead)) {
+			error = vm_pager_get_pages(tobj, &m, 1, 0);
+			if (error != 0) {
+				printf("tmpfs get pages from pager error [read]\n");
+				goto out;
+			}
+		} else
 			vm_page_zero_invalid(m, TRUE);
-			vm_page_dirty(m);
-		}
-		vm_page_unwire(m, 0);
-		vm_page_activate(m);
-		vm_page_wakeup(m);
-		vm_page_unlock_queues();
 	}
+	VM_OBJECT_UNLOCK(tobj);
+	sched_pin();
+	sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
+	va = (caddr_t)sf_buf_kva(sf);
+	error = uiomove(va + offset, tlen, uio);
+	sf_buf_free(sf);
+	sched_unpin();
+	VM_OBJECT_LOCK(tobj);
 out:
-	vm_object_pip_subtract(uobj, 1);
-	VM_OBJECT_UNLOCK(uobj);
-	return error;
+	vm_page_lock_queues();
+	vm_page_unwire(m, 0);
+	vm_page_activate(m);
+	vm_page_unlock_queues();
+	vm_page_wakeup(m);
+	vm_object_pip_subtract(tobj, 1);
+	VM_OBJECT_UNLOCK(tobj);
+
+	return	(error);
 }
 
 static int
@@ -516,6 +524,8 @@
 
 	struct tmpfs_node *node;
 	vm_object_t uobj;
+	size_t len;
+	int resid;
 
 	int error;
 
@@ -534,7 +544,17 @@
 	node->tn_status |= TMPFS_NODE_ACCESSED;
 
 	uobj = node->tn_reg.tn_aobj;
-	error = tmpfs_uio_xfer(VFS_TO_TMPFS(vp->v_mount), node, uio, uobj);
+	while ((resid = uio->uio_resid) > 0) {
+		error = 0;
+		if (node->tn_size <= uio->uio_offset)
+			break;
+		len = MIN(node->tn_size - uio->uio_offset, resid);
+		if (len == 0)
+			break;
+		error = tmpfs_mappedread(vp->v_object, uobj, len, uio);
+		if ((error != 0) || (resid == uio->uio_resid))
+			break;
+	}
 
 out:
 
@@ -544,6 +564,100 @@
 /* --------------------------------------------------------------------- */
 
 static int
+tmpfs_mappedwrite(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio)
+{
+	vm_pindex_t	idx;
+	vm_page_t	vpg, tpg;
+	struct sf_buf	*sf;
+	off_t		offset, addr;
+	size_t		tlen;
+	caddr_t		va;
+	int		error;
+
+	addr = uio->uio_offset;
+	idx = OFF_TO_IDX(addr);
+	offset = addr & PAGE_MASK;
+	tlen = MIN(PAGE_SIZE - offset, len);
+
+	if ((vobj == NULL) || (vobj->resident_page_count == 0)) {
+		vpg = NULL;
+		goto nocache;
+	}
+
+	VM_OBJECT_LOCK(vobj);
+lookupvpg:
+	if (((vpg = vm_page_lookup(vobj, idx)) != NULL) &&
+	    vm_page_is_valid(vpg, offset, tlen)) {
+		if (vm_page_sleep_if_busy(vpg, FALSE, "tmfsmw"))
+			goto lookupvpg;
+		vm_page_busy(vpg);
+		vm_page_lock_queues();
+		vm_page_undirty(vpg);
+		vm_page_unlock_queues();
+		VM_OBJECT_UNLOCK(vobj);
+		sched_pin();
+		sf = sf_buf_alloc(vpg, SFB_CPUPRIVATE);
+		va = (caddr_t)sf_buf_kva(sf);
+		error = uiomove(va + offset, tlen, uio);
+		sf_buf_free(sf);
+		sched_unpin();
+	} else {
+		VM_OBJECT_UNLOCK(vobj);
+		vpg = NULL;
+	}
+nocache:
+	VM_OBJECT_LOCK(tobj);
+	vm_object_pip_add(tobj, 1);
+	tpg = vm_page_grab(tobj, idx, VM_ALLOC_WIRED |
+	    VM_ALLOC_ZERO | VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+	if (tpg->valid != VM_PAGE_BITS_ALL) {
+		int behind, ahead;
+		if (vm_pager_has_page(tobj, idx, &behind, &ahead)) {
+			error = vm_pager_get_pages(tobj, &tpg, 1, 0);
+			if (error != 0) {
+				printf("tmpfs get pages from pager error [write]\n");
+				goto out;
+			}
+		} else
+			vm_page_zero_invalid(tpg, TRUE);
+	}
+	VM_OBJECT_UNLOCK(tobj);
+	if (vpg == NULL) {
+		sched_pin();
+		sf = sf_buf_alloc(tpg, SFB_CPUPRIVATE);
+		va = (caddr_t)sf_buf_kva(sf);
+		error = uiomove(va + offset, tlen, uio);
+		sf_buf_free(sf);
+		sched_unpin();
+	} else {
+		KASSERT(vpg->valid == VM_PAGE_BITS_ALL, ("parts of vpg invalid"));
+		pmap_copy_page(vpg, tpg);
+	}
+	VM_OBJECT_LOCK(tobj);
+out:
+	if (vobj != NULL)
+		VM_OBJECT_LOCK(vobj);
+	vm_page_lock_queues();
+	if (error == 0) {
+		vm_page_set_validclean(tpg, offset, tlen);
+		vm_page_zero_invalid(tpg, TRUE);
+		vm_page_dirty(tpg);
+	}
+	vm_page_unwire(tpg, 0);
+	vm_page_activate(tpg);
+	vm_page_unlock_queues();
+	vm_page_wakeup(tpg);
+	if (vpg != NULL)
+		vm_page_wakeup(vpg);
+	if (vobj != NULL)
+		VM_OBJECT_UNLOCK(vobj);
+	vm_object_pip_subtract(tobj, 1);
+	VM_OBJECT_UNLOCK(tobj);
+
+	return	(error);
+}
+
+static int
 tmpfs_write(struct vop_write_args *v)
 {
 	struct vnode *vp = v->a_vp;
@@ -552,10 +666,12 @@
 	struct thread *td = uio->uio_td;
 
 	boolean_t extended;
-	int error;
+	int error = 0;
 	off_t oldsize;
 	struct tmpfs_node *node;
 	vm_object_t uobj;
+	size_t len;
+	int resid;
 
 	node = VP_TO_TMPFS_NODE(vp);
 	oldsize = node->tn_size;
@@ -596,7 +712,16 @@
 	}
 
 	uobj = node->tn_reg.tn_aobj;
-	error = tmpfs_uio_xfer(VFS_TO_TMPFS(vp->v_mount), node, uio, uobj);
+	while ((resid = uio->uio_resid) > 0) {
+		if (node->tn_size <= uio->uio_offset)
+			break;
+		len = MIN(node->tn_size - uio->uio_offset, resid);
+		if (len == 0)
+			break;
+		error = tmpfs_mappedwrite(vp->v_object, uobj, len, uio);
+		if ((error != 0) || (resid == uio->uio_resid))
+			break;
+	}
 
 	node->tn_status |= TMPFS_NODE_ACCESSED | TMPFS_NODE_MODIFIED |
 	    (extended ? TMPFS_NODE_CHANGED : 0);

==== //depot/projects/soc2007/rpaulo-macbook/i386/linux/linux_machdep.c#5 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/linux/linux_machdep.c,v 1.77 2007/07/04 23:06:43 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/linux/linux_machdep.c,v 1.78 2007/07/20 08:35:18 attilio Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -846,9 +846,7 @@
 	iia.start = args->start;
 	iia.length = args->length;
 	iia.enable = args->enable;
-	mtx_lock(&Giant);
 	error = i386_set_ioperm(td, &iia);
-	mtx_unlock(&Giant);
 	return (error);
 }
 
@@ -884,10 +882,8 @@
 		ldt.start = 0;
 		ldt.descs = uap->ptr;
 		ldt.num = uap->bytecount / sizeof(union descriptor);
-		mtx_lock(&Giant);
 		error = i386_get_ldt(td, &ldt);
 		td->td_retval[0] *= sizeof(union descriptor);
-		mtx_unlock(&Giant);
 		break;
 	case 0x01: /* write_ldt */

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list