[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH V2 RFT] vhost_net: don't set backend for the uni
From: |
Yuri Benditovich |
Subject: |
Re: [Qemu-devel] [PATCH V2 RFT] vhost_net: don't set backend for the uninitialized virtqueue |
Date: |
Mon, 25 Mar 2019 12:37:00 +0200 |
You're right, with just one latest patch things work.
On Mon, Mar 25, 2019 at 11:59 AM Jason Wang <address@hidden> wrote:
>
>
> On 2019/3/25 下午5:56, Yuri Benditovich wrote:
> > Hi Jason,
> >
> > This seems ok now (4 previous patches + this one)
>
>
> Thanks for the testing. Could you test with just this patch? Since even
> without 4 previous patch, we've already had the check through
> virtio_queue_get_desc_addr() in vhost_virtqueue_start().
>
>
> >
> > On Mon, Mar 25, 2019 at 5:56 AM Jason Wang <address@hidden> wrote:
> >> We used to set backend unconditionally, this won't work for some
> >> guests (e.g windows driver) who may not initialize all virtqueues. For
> >> kernel backend, this will fail since it may try to validate the rings
> >> during setting backend.
> >>
> >> Fixing this by simply skipping the backend set when we find desc is
> >> not ready.
> >>
> >> Signed-off-by: Jason Wang <address@hidden>
> >> ---
> >> hw/net/vhost_net.c | 15 +++++++++++++++
> >> 1 file changed, 15 insertions(+)
> >>
> >> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> >> index be3cc88370..04fd924d15 100644
> >> --- a/hw/net/vhost_net.c
> >> +++ b/hw/net/vhost_net.c
> >> @@ -221,6 +221,7 @@ static int vhost_net_start_one(struct vhost_net *net,
> >> VirtIODevice *dev)
> >> {
> >> struct vhost_vring_file file = { };
> >> + hwaddr a;
> >> int r;
> >>
> >> net->dev.nvqs = 2;
> >> @@ -244,6 +245,13 @@ static int vhost_net_start_one(struct vhost_net *net,
> >> qemu_set_fd_handler(net->backend, NULL, NULL, NULL);
> >> file.fd = net->backend;
> >> for (file.index = 0; file.index < net->dev.nvqs; ++file.index) {
> >> + a = virtio_queue_get_desc_addr(dev,
> >> + net->dev.vq_index +
> >> + file.index);
> >> + if (a == 0) {
> >> + /* Queue might not be ready for start */
> >> + continue;
> >> + }
> >> r = vhost_net_set_backend(&net->dev, &file);
> >> if (r < 0) {
> >> r = -errno;
> >> @@ -256,6 +264,13 @@ fail:
> >> file.fd = -1;
> >> if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) {
> >> while (file.index-- > 0) {
> >> + a = virtio_queue_get_desc_addr(dev,
> >> + net->dev.vq_index +
> >> + file.index);
> >> + if (a == 0) {
> >> + /* Queue might not be ready for start */
> >> + continue;
> >> + }
> >> int r = vhost_net_set_backend(&net->dev, &file);
> >> assert(r >= 0);
> >> }
> >> --
> >> 2.19.1
> >>