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