[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <bf06c9a1-60da-0a6f-23a3-2ea86edc0bde@redhat.com>
Date: Tue, 19 Jan 2021 12:50:25 +0800
From: Jason Wang <jasowang@...hat.com>
To: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>, netdev@...r.kernel.org
Cc: "Michael S. Tsirkin" <mst@...hat.com>,
"David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Björn Töpel <bjorn.topel@...el.com>,
Magnus Karlsson <magnus.karlsson@...el.com>,
Jonathan Lemon <jonathan.lemon@...il.com>,
Alexei Starovoitov <ast@...nel.org>,
Daniel Borkmann <daniel@...earbox.net>,
Jesper Dangaard Brouer <hawk@...nel.org>,
John Fastabend <john.fastabend@...il.com>,
Andrii Nakryiko <andrii@...nel.org>,
Martin KaFai Lau <kafai@...com>,
Song Liu <songliubraving@...com>, Yonghong Song <yhs@...com>,
KP Singh <kpsingh@...nel.org>,
virtualization@...ts.linux-foundation.org, bpf@...r.kernel.org
Subject: Re: [PATCH net-next v2 6/7] virtio-net, xsk: implement xsk wakeup
callback
On 2021/1/16 上午10:59, Xuan Zhuo wrote:
> Since I did not find an interface to directly notify virtio to generate
> a tx interrupt, I sent some data to trigger a new tx interrupt.
>
> Another advantage of this is that the transmission delay will be
> relatively small, and there is no need to wait for the tx interrupt to
> start softirq.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@...ux.alibaba.com>
> ---
> drivers/net/virtio_net.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 51 insertions(+)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 42aa9ad..e552c2d 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -2841,6 +2841,56 @@ static int virtnet_xsk_run(struct send_queue *sq,
> return ret;
> }
>
> +static int virtnet_xsk_wakeup(struct net_device *dev, u32 qid, u32 flag)
> +{
> + struct virtnet_info *vi = netdev_priv(dev);
> + struct send_queue *sq;
> + struct xsk_buff_pool *pool;
> + struct netdev_queue *txq;
> +
> + if (!netif_running(dev))
> + return -ENETDOWN;
> +
> + if (qid >= vi->curr_queue_pairs)
> + return -EINVAL;
> +
> + sq = &vi->sq[qid];
> +
> + rcu_read_lock();
> +
> + pool = rcu_dereference(sq->xsk.pool);
> + if (!pool)
> + goto end;
> +
> + if (test_and_set_bit(VIRTNET_STATE_XSK_WAKEUP, &sq->xsk.state))
> + goto end;
> +
> + txq = netdev_get_tx_queue(dev, qid);
> +
> + local_bh_disable();
> + __netif_tx_lock(txq, raw_smp_processor_id());
You can use __netif_tx_lock_bh().
Thanks
> +
> + /* Send part of the package directly to reduce the delay in sending the
> + * package, and this can actively trigger the tx interrupts.
> + *
> + * If the package is not processed, then continue processing in the
> + * subsequent tx interrupt(virtnet_poll_tx).
> + *
> + * If no packet is sent out, the ring of the device is full. In this
> + * case, we will still get a tx interrupt response. Then we will deal
> + * with the subsequent packet sending work.
> + */
> +
> + virtnet_xsk_run(sq, pool, xsk_budget);
> +
> + __netif_tx_unlock(txq);
> + local_bh_enable();
> +
> +end:
> + rcu_read_unlock();
> + return 0;
> +}
> +
> static int virtnet_get_phys_port_name(struct net_device *dev, char *buf,
> size_t len)
> {
> @@ -2895,6 +2945,7 @@ static int virtnet_set_features(struct net_device *dev,
> .ndo_vlan_rx_kill_vid = virtnet_vlan_rx_kill_vid,
> .ndo_bpf = virtnet_xdp,
> .ndo_xdp_xmit = virtnet_xdp_xmit,
> + .ndo_xsk_wakeup = virtnet_xsk_wakeup,
> .ndo_features_check = passthru_features_check,
> .ndo_get_phys_port_name = virtnet_get_phys_port_name,
> .ndo_set_features = virtnet_set_features,
Powered by blists - more mailing lists