[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 2/2] e1000e: make TX reentrant
From: |
Li Qiang |
Subject: |
Re: [PATCH 2/2] e1000e: make TX reentrant |
Date: |
Wed, 22 Jul 2020 19:24:23 +0800 |
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.
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
>