Date: Wed, 25 Jul 2012 11:28:15 +0000 (UTC) From: Luigi Rizzo <luigi@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r238765 - head/sys/dev/e1000 Message-ID: <201207251128.q6PBSFlt052575@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: luigi Date: Wed Jul 25 11:28:15 2012 New Revision: 238765 URL: http://svn.freebsd.org/changeset/base/238765 Log: Use legacy interrupts as a default. This gives up to 10% speedup when used in qemu (and this driver is for non-PCIe cards, so probably its largest use is in virtualized environments). Approved by: Jack Vogel MFC after: 3 days Modified: head/sys/dev/e1000/if_lem.c Modified: head/sys/dev/e1000/if_lem.c ============================================================================== --- head/sys/dev/e1000/if_lem.c Wed Jul 25 10:55:14 2012 (r238764) +++ head/sys/dev/e1000/if_lem.c Wed Jul 25 11:28:15 2012 (r238765) @@ -239,6 +239,7 @@ static void lem_enable_wakeup(device static int lem_enable_phy_wakeup(struct adapter *); static void lem_led_func(void *, int); +#define EM_LEGACY_IRQ /* slightly faster, at least in qemu */ #ifdef EM_LEGACY_IRQ static void lem_intr(void *); #else /* FAST IRQ */ @@ -1549,6 +1550,13 @@ lem_xmit(struct adapter *adapter, struct u32 txd_upper, txd_lower, txd_used, txd_saved; int error, nsegs, i, j, first, last = 0; +extern int netmap_drop; + if (netmap_drop == 95) { +dropme: + m_freem(*m_headp); + *m_headp = NULL; + return (ENOBUFS); + } m_head = *m_headp; txd_upper = txd_lower = txd_used = txd_saved = 0; @@ -1688,6 +1696,9 @@ lem_xmit(struct adapter *adapter, struct } } + if (netmap_drop == 96) + goto dropme; + adapter->next_avail_tx_desc = i; if (adapter->pcix_82544) @@ -1715,6 +1726,16 @@ lem_xmit(struct adapter *adapter, struct */ ctxd->lower.data |= htole32(E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS); + +if (netmap_drop == 97) { + static int count=0; + if (count++ & 63 != 0) + ctxd->lower.data &= + ~htole32(E1000_TXD_CMD_RS); + else + D("preserve RS"); + +} /* * Keep track in the first buffer which * descriptor will be written back @@ -1733,6 +1754,12 @@ lem_xmit(struct adapter *adapter, struct adapter->link_duplex == HALF_DUPLEX) lem_82547_move_tail(adapter); else { +extern int netmap_repeat; + if (netmap_repeat) { + int x; + for (x = 0; x < netmap_repeat; x++) + E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), i); + } E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), i); if (adapter->hw.mac.type == e1000_82547) lem_82547_update_fifo_head(adapter, @@ -2986,6 +3013,13 @@ lem_txeof(struct adapter *adapter) return; } #endif /* DEV_NETMAP */ +{ + static int drops = 0; + if (netmap_copy && drops++ < netmap_copy) + return; + drops = 0; +} + if (adapter->num_tx_desc_avail == adapter->num_tx_desc) return;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207251128.q6PBSFlt052575>