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 <lu...@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-...@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"



--
Andrey Zonov
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to