All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Heng Qi <hengqi@linux.alibaba.com>
Cc: netdev@vger.kernel.org, virtualization@lists.linux.dev,
	"Jason Wang" <jasowang@redhat.com>,
	"Xuan Zhuo" <xuanzhuo@linux.alibaba.com>,
	"Eugenio Pérez" <eperezma@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	"Eric Dumazet" <edumazet@google.com>,
	"Jakub Kicinski" <kuba@kernel.org>,
	"Paolo Abeni" <pabeni@redhat.com>
Subject: Re: [PATCH net-next v4 2/5] virtio_net: enable irq for the control vq
Date: Mon, 24 Jun 2024 07:30:11 -0400	[thread overview]
Message-ID: <20240624072806-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20240619161908.82348-3-hengqi@linux.alibaba.com>

On Thu, Jun 20, 2024 at 12:19:05AM +0800, Heng Qi wrote:
> If the device does not respond to a request for a long time,
> then control vq polling elevates CPU utilization, a problem that
> exacerbates with more command requests.
> 
> Enabling control vq's irq is advantageous for the guest, and
> this still doesn't support concurrent requests.
> 
> Suggested-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Heng Qi <hengqi@linux.alibaba.com>
> ---
>  drivers/net/virtio_net.c | 22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index b45f58a902e3..ed10084997d3 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -372,6 +372,8 @@ struct virtio_net_ctrl_rss {
>  struct control_buf {
>  	struct virtio_net_ctrl_hdr hdr;
>  	virtio_net_ctrl_ack status;
> +	/* Wait for the device to complete the cvq request. */
> +	struct completion completion;
>  };
>  
>  struct virtnet_info {
> @@ -664,6 +666,13 @@ static bool virtqueue_napi_complete(struct napi_struct *napi,
>  	return false;
>  }
>  
> +static void virtnet_cvq_done(struct virtqueue *cvq)
> +{
> +	struct virtnet_info *vi = cvq->vdev->priv;
> +
> +	complete(&vi->ctrl->completion);
> +}
> +
>  static void skb_xmit_done(struct virtqueue *vq)
>  {
>  	struct virtnet_info *vi = vq->vdev->priv;

> @@ -2724,14 +2733,8 @@ static bool virtnet_send_command_reply(struct virtnet_info *vi,
>  	if (unlikely(!virtqueue_kick(vi->cvq)))
>  		goto unlock;
>  
> -	/* Spin for a response, the kick causes an ioport write, trapping
> -	 * into the hypervisor, so the request should be handled immediately.
> -	 */
> -	while (!virtqueue_get_buf(vi->cvq, &tmp) &&
> -	       !virtqueue_is_broken(vi->cvq)) {
> -		cond_resched();
> -		cpu_relax();
> -	}
> +	wait_for_completion(&ctrl->completion);
> +	virtqueue_get_buf(vi->cvq, &tmp);
>  
>  unlock:
>  	ok = ctrl->status == VIRTIO_NET_OK;

Hmm no this is not a good idea, code should be robust in case
of spurious interrupts.

Also suprise removal is now broken ...


> @@ -5312,7 +5315,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi)
>  
>  	/* Parameters for control virtqueue, if any */
>  	if (vi->has_cvq) {
> -		callbacks[total_vqs - 1] = NULL;
> +		callbacks[total_vqs - 1] = virtnet_cvq_done;
>  		names[total_vqs - 1] = "control";
>  	}
>  
> @@ -5832,6 +5835,7 @@ static int virtnet_probe(struct virtio_device *vdev)
>  	if (vi->has_rss || vi->has_rss_hash_report)
>  		virtnet_init_default_rss(vi);
>  
> +	init_completion(&vi->ctrl->completion);
>  	enable_rx_mode_work(vi);
>  
>  	/* serialize netdev register + virtio_device_ready() with ndo_open() */
> -- 
> 2.32.0.3.g01195cf9f


  parent reply	other threads:[~2024-06-24 11:30 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-19 16:19 [PATCH net-next v4 0/5] virtio_net: enable the irq for ctrlq Heng Qi
2024-06-19 16:19 ` [PATCH net-next v4 1/5] virtio_net: passing control_buf explicitly Heng Qi
2024-06-19 16:19 ` [PATCH net-next v4 2/5] virtio_net: enable irq for the control vq Heng Qi
2024-06-19 21:19   ` Michael S. Tsirkin
2024-06-20  7:29     ` Heng Qi
2024-06-20  8:21       ` Jason Wang
2024-06-20  8:26         ` Jason Wang
2024-06-20  9:53           ` Heng Qi
2024-06-20 10:10             ` Michael S. Tsirkin
2024-06-20 10:11               ` Michael S. Tsirkin
2024-06-20 10:31                 ` Heng Qi
2024-06-26  7:52                   ` Jiri Pirko
2024-06-26  8:08                     ` Michael S. Tsirkin
2024-06-26  8:43                       ` Jiri Pirko
2024-06-26  9:58                         ` Michael S. Tsirkin
2024-06-26 11:51                           ` Jiri Pirko
2024-07-08 11:40                             ` Jiri Pirko
2024-07-08 12:19                               ` Heng Qi
2024-06-21  7:41                 ` Xuan Zhuo
2024-06-21 11:46                   ` Michael S. Tsirkin
2024-06-25  1:27                 ` Jason Wang
2024-06-25  7:14                   ` Michael S. Tsirkin
2024-06-20  8:32       ` Michael S. Tsirkin
2024-06-20  8:37         ` Jason Wang
2024-06-20  9:38         ` Heng Qi
2024-06-20 10:07           ` Michael S. Tsirkin
2024-06-24 11:30   ` Michael S. Tsirkin [this message]
2024-06-19 16:19 ` [PATCH net-next v4 3/5] virtio_net: change the command token to completion Heng Qi
2024-06-19 16:19 ` [PATCH net-next v4 4/5] virtio_net: refactor command sending and response handling Heng Qi
2024-06-19 16:19 ` [PATCH net-next v4 5/5] virtio_net: improve dim command request efficiency Heng Qi
2024-06-20  6:40   ` kernel test robot
2024-06-19 21:16 ` [PATCH net-next v4 0/5] virtio_net: enable the irq for ctrlq Michael S. Tsirkin
2024-06-20  7:16   ` Heng Qi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240624072806-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=eperezma@redhat.com \
    --cc=hengqi@linux.alibaba.com \
    --cc=jasowang@redhat.com \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=virtualization@lists.linux.dev \
    --cc=xuanzhuo@linux.alibaba.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.