Date: Tue, 31 Jul 2012 19:13:24 +0400 From: Andrey Zonov <andrey@zonov.org> To: Adrian Chadd <adrian@freebsd.org> Cc: svn-src-head@freebsd.org, Luigi Rizzo <luigi@freebsd.org>, src-committers@freebsd.org, svn-src-all@freebsd.org Subject: Re: svn commit: r238765 - head/sys/dev/e1000 Message-ID: <5017F614.1010304@zonov.org> In-Reply-To: <CAJ-Vmokw-9if%2BzdTiG3ZeKaVVzE%2BTCtLhWM8ry1iaeRr7AC8gA@mail.gmail.com> References: <201207251128.q6PBSFlt052575@svn.freebsd.org> <CAJ-Vmokw-9if%2BzdTiG3ZeKaVVzE%2BTCtLhWM8ry1iaeRr7AC8gA@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 7/28/12 2:09 AM, Adrian Chadd wrote: > Hi, > > Can you please revert this commit for now? > > * it has some netmap stuff in it that isn't related to the commit; > * it's causing panics due to lock recursion; I can confirm panics with the latest HEAD running under ESX. _mtx_lock_sleep: recursed on non-recursive mutex em0 @ /usr/src/sys/dev/e1000/if_lem.c:881 Tracing pid 12 tid 100030 td 0xfffffe0002960480 kdb_enter() at kdb_enter+0x3b panic() at panic+0x1d1 _mtx_lock_sleep() at _mtx_lock_sleep+0x35f _mtx_lock_flags() at _mtx_lock_flags+0x111 lem_start() at lem_start+0x34 if_transmit() at if_transmit+0xd6 ether_output_frame() at ether_output_frame+0x45 ether_output() at ether_output+0x548 arpintr() at arpintr+0x10c1 netisr_dispatch_src() at netisr_dispatch_src+0x152 ether_demux() at ether_demux+0x18d ether_nh_input() at ether_nh_input+0x290 netisr_dispatch_src() at netisr_dispatch_src+0x152 lem_intr() at lem_intr+0x3ba intr_event_execute_handlers() at intr_event_execute_handlers+0x6a ithread_loop() at ithread_loop+0xab fork_exit() at fork_exit+0x135 fork_trampoline() at fork_trampoline+0xe --- trap 0, rip = 0, rsp = 0xffffff8000301cb0, rbp = 0 --- > * it likely has other issues you haven't yet found. :) > > > > Adrian > > On 25 July 2012 04:28, Luigi Rizzo <luigi@freebsd.org> wrote: >> 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; >> > _______________________________________________ > svn-src-all@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/svn-src-all > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" > -- Andrey Zonov
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5017F614.1010304>