qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/2] e1000e: make TX reentrant


From: Jason Wang
Subject: Re: [PATCH 2/2] e1000e: make TX reentrant
Date: Thu, 23 Jul 2020 10:22:52 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0


On 2020/7/22 下午7:24, Li Qiang wrote:
Jason Wang <jasowang@redhat.com> 于2020年7月22日周三 下午4:58写道:
In loopback mode, e1000e RX can DMA into TX doorbell which requires
TX to be reentrant. This patch make e1000e's TX routine reentrant by
introducing a per device boolean for recording whether or not a TX
rountine is being called and return early.

Could we introduce a per-queue 'sending' variable just like the RX.
So we can do this in net core layer.


It's kind of not easy since TX routine is called before the packet can reach network queue.

Thanks



Thanks,
Li Qiang

Signed-off-by: Jason Wang <jasowang@redhat.com>
---
  hw/net/e1000e_core.c | 8 ++++++++
  hw/net/e1000e_core.h | 1 +
  2 files changed, 9 insertions(+)

diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
index bcd186cac5..8126a644a5 100644
--- a/hw/net/e1000e_core.c
+++ b/hw/net/e1000e_core.c
@@ -923,6 +923,12 @@ e1000e_start_xmit(E1000ECore *core, const E1000E_TxRing 
*txr)
          return;
      }

+    if (core->sending) {
+        return;
+    }
+
+    core->sending = true;
+
      while (!e1000e_ring_empty(core, txi)) {
          base = e1000e_ring_head_descr(core, txi);

@@ -940,6 +946,8 @@ e1000e_start_xmit(E1000ECore *core, const E1000E_TxRing 
*txr)
      if (!ide || !e1000e_intrmgr_delay_tx_causes(core, &cause)) {
          e1000e_set_interrupt_cause(core, cause);
      }
+
+    core->sending = false;
  }

  static bool
diff --git a/hw/net/e1000e_core.h b/hw/net/e1000e_core.h
index aee32f7e48..4679c1761f 100644
--- a/hw/net/e1000e_core.h
+++ b/hw/net/e1000e_core.h
@@ -114,6 +114,7 @@ struct E1000Core {
      void (*owner_start_recv)(PCIDevice *d);

      uint32_t msi_causes_pending;
+    bool sending;
  };

  void
--
2.20.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]