virtio-net: add cond_resched() to the command waiting loop
authorJason Wang <jasowang@redhat.com>
Thu, 20 Jul 2023 08:38:39 +0000 (04:38 -0400)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 19 Mar 2024 07:19:22 +0000 (03:19 -0400)
Adding cond_resched() to the command waiting loop for a better
co-operation with the scheduler. This allows to give CPU a breath to
run other task(workqueue) instead of busy looping when preemption is
not allowed on a device whose CVQ might be slow.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20230720083839.481487-3-jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Shannon Nelson <shannon.nelson@amd.com>
drivers/net/virtio_net.c

index 46fc86fe62df3c590b3199cf9a39842e44b8c859..e709d4411810d1059d9a96a802bb18786912bb95 100644 (file)
@@ -2570,8 +2570,10 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
         * into the hypervisor, so the request should be handled immediately.
         */
        while (!virtqueue_get_buf(vi->cvq, &tmp) &&
-              !virtqueue_is_broken(vi->cvq))
+              !virtqueue_is_broken(vi->cvq)) {
+               cond_resched();
                cpu_relax();
+       }
 
        return vi->ctrl->status == VIRTIO_NET_OK;
 }