All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eric Northup <digitaleric@google.com>
Cc: Amit Shah <amit.shah@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	stable@vger.kernel.org,
	lf-virt <virtualization@lists.linux-foundation.org>
Subject: Re: [PATCH RFC] virtio_pci: fix virtio spec compliance on restore
Date: Tue, 23 Sep 2014 21:02:18 +0300	[thread overview]
Message-ID: <20140923180218.GA17484@redhat.com> (raw)
In-Reply-To: <CAG7+5M3=5cNQWH53i7qXLH0tm4qJEgu+_HCDpmAKF3P3knJHHQ@mail.gmail.com>

On Tue, Sep 23, 2014 at 09:06:03AM -0700, Eric Northup wrote:
> On Tue, Sep 23, 2014 at 3:32 AM, Michael S. Tsirkin <mst@redhat.com> wrote:
> > On restore, virtio pci does the following:
> > + set features
> > + init vqs etc - device can be used at this point!
> > + set ACKNOWLEDGE,DRIVER and DRIVER_OK status bits
> >
> > This is in violation of the virtio spec, which
> > requires the following order:
> > - ACKNOWLEDGE
> > - DRIVER
> > - init vqs
> > - DRIVER_OK
> >
> > Cc: stable@vger.kernel.org
> > Cc: Amit Shah <amit.shah@redhat.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >
> > Lightly tested.
> > Will repost as non-RFC once testing is done, sending
> > out now for early flames/comments.
> >
> > Thanks!
> >
> >  drivers/virtio/virtio_pci.c | 36 ++++++++++++++++++++++++++++++++----
> >  1 file changed, 32 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
> > index 58f7e45..58cbf6e 100644
> > --- a/drivers/virtio/virtio_pci.c
> > +++ b/drivers/virtio/virtio_pci.c
> > @@ -785,6 +785,7 @@ static int virtio_pci_restore(struct device *dev)
> >         struct pci_dev *pci_dev = to_pci_dev(dev);
> >         struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
> >         struct virtio_driver *drv;
> > +       unsigned status = 0;
> >         int ret;
> >
> >         drv = container_of(vp_dev->vdev.dev.driver,
> > @@ -795,14 +796,41 @@ static int virtio_pci_restore(struct device *dev)
> >                 return ret;
> >
> >         pci_set_master(pci_dev);
> > +       /* We always start by resetting the device, in case a previous
> > +        * driver messed it up. */
> > +       vp_reset(&vp_dev->vdev);
> 
> This should happen before enabling PCI bus mastering.

this is the order of events in initialization,
it seems better to be consistent.

> > +
> > +       /* Acknowledge that we've seen the device. */
> > +       status |= VIRTIO_CONFIG_S_ACKNOWLEDGE;
> > +       vp_set_status(&vp_dev->vdev, status);
> > +
> > +       /* Maybe driver failed before freeze.
> > +        * Restore the failed status, for debugging. */
> > +       status |= vp_dev->saved_status & VIRTIO_CONFIG_S_FAILED;
> > +       vp_set_status(&vp_dev->vdev, status);
> > +
> > +       if (!drv)
> > +               return 0;
> > +
> > +       /* We have a driver! */
> > +       status |= VIRTIO_CONFIG_S_DRIVER;
> > +       vp_set_status(&vp_dev->vdev, status);
> > +
> >         vp_finalize_features(&vp_dev->vdev);
> >
> > -       if (drv && drv->restore)
> > -               ret = drv->restore(&vp_dev->vdev);
> > +       if (!drv->restore)
> > +               return 0;
> > +
> > +       ret = drv->restore(&vp_dev->vdev);
> > +       if (ret) {
> > +               status |= VIRTIO_CONFIG_S_FAILED;
> > +               vp_set_status(&vp_dev->vdev, status);
> > +               return ret;
> > +       }
> >
> >         /* Finally, tell the device we're all set */
> > -       if (!ret)
> > -               vp_set_status(&vp_dev->vdev, vp_dev->saved_status);
> > +       status |= VIRTIO_CONFIG_S_DRIVER_OK;
> > +       vp_set_status(&vp_dev->vdev, status);
> >
> >         return ret;
> >  }
> > --
> > MST
> > _______________________________________________
> > Virtualization mailing list
> > Virtualization@lists.linux-foundation.org
> > https://lists.linuxfoundation.org/mailman/listinfo/virtualization

WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eric Northup <digitaleric@google.com>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Amit Shah <amit.shah@redhat.com>,
	stable@vger.kernel.org,
	lf-virt <virtualization@lists.linux-foundation.org>
Subject: Re: [PATCH RFC] virtio_pci: fix virtio spec compliance on restore
Date: Tue, 23 Sep 2014 21:02:18 +0300	[thread overview]
Message-ID: <20140923180218.GA17484@redhat.com> (raw)
In-Reply-To: <CAG7+5M3=5cNQWH53i7qXLH0tm4qJEgu+_HCDpmAKF3P3knJHHQ@mail.gmail.com>

On Tue, Sep 23, 2014 at 09:06:03AM -0700, Eric Northup wrote:
> On Tue, Sep 23, 2014 at 3:32 AM, Michael S. Tsirkin <mst@redhat.com> wrote:
> > On restore, virtio pci does the following:
> > + set features
> > + init vqs etc - device can be used at this point!
> > + set ACKNOWLEDGE,DRIVER and DRIVER_OK status bits
> >
> > This is in violation of the virtio spec, which
> > requires the following order:
> > - ACKNOWLEDGE
> > - DRIVER
> > - init vqs
> > - DRIVER_OK
> >
> > Cc: stable@vger.kernel.org
> > Cc: Amit Shah <amit.shah@redhat.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >
> > Lightly tested.
> > Will repost as non-RFC once testing is done, sending
> > out now for early flames/comments.
> >
> > Thanks!
> >
> >  drivers/virtio/virtio_pci.c | 36 ++++++++++++++++++++++++++++++++----
> >  1 file changed, 32 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
> > index 58f7e45..58cbf6e 100644
> > --- a/drivers/virtio/virtio_pci.c
> > +++ b/drivers/virtio/virtio_pci.c
> > @@ -785,6 +785,7 @@ static int virtio_pci_restore(struct device *dev)
> >         struct pci_dev *pci_dev = to_pci_dev(dev);
> >         struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
> >         struct virtio_driver *drv;
> > +       unsigned status = 0;
> >         int ret;
> >
> >         drv = container_of(vp_dev->vdev.dev.driver,
> > @@ -795,14 +796,41 @@ static int virtio_pci_restore(struct device *dev)
> >                 return ret;
> >
> >         pci_set_master(pci_dev);
> > +       /* We always start by resetting the device, in case a previous
> > +        * driver messed it up. */
> > +       vp_reset(&vp_dev->vdev);
> 
> This should happen before enabling PCI bus mastering.

this is the order of events in initialization,
it seems better to be consistent.

> > +
> > +       /* Acknowledge that we've seen the device. */
> > +       status |= VIRTIO_CONFIG_S_ACKNOWLEDGE;
> > +       vp_set_status(&vp_dev->vdev, status);
> > +
> > +       /* Maybe driver failed before freeze.
> > +        * Restore the failed status, for debugging. */
> > +       status |= vp_dev->saved_status & VIRTIO_CONFIG_S_FAILED;
> > +       vp_set_status(&vp_dev->vdev, status);
> > +
> > +       if (!drv)
> > +               return 0;
> > +
> > +       /* We have a driver! */
> > +       status |= VIRTIO_CONFIG_S_DRIVER;
> > +       vp_set_status(&vp_dev->vdev, status);
> > +
> >         vp_finalize_features(&vp_dev->vdev);
> >
> > -       if (drv && drv->restore)
> > -               ret = drv->restore(&vp_dev->vdev);
> > +       if (!drv->restore)
> > +               return 0;
> > +
> > +       ret = drv->restore(&vp_dev->vdev);
> > +       if (ret) {
> > +               status |= VIRTIO_CONFIG_S_FAILED;
> > +               vp_set_status(&vp_dev->vdev, status);
> > +               return ret;
> > +       }
> >
> >         /* Finally, tell the device we're all set */
> > -       if (!ret)
> > -               vp_set_status(&vp_dev->vdev, vp_dev->saved_status);
> > +       status |= VIRTIO_CONFIG_S_DRIVER_OK;
> > +       vp_set_status(&vp_dev->vdev, status);
> >
> >         return ret;
> >  }
> > --
> > MST
> > _______________________________________________
> > Virtualization mailing list
> > Virtualization@lists.linux-foundation.org
> > https://lists.linuxfoundation.org/mailman/listinfo/virtualization

  reply	other threads:[~2014-09-23 18:02 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-23 10:32 [PATCH RFC] virtio_pci: fix virtio spec compliance on restore Michael S. Tsirkin
2014-09-23 10:32 ` Michael S. Tsirkin
2014-09-23 16:06 ` Eric Northup
2014-09-23 16:06   ` Eric Northup
2014-09-23 18:02   ` Michael S. Tsirkin [this message]
2014-09-23 18:02     ` Michael S. Tsirkin
2014-09-24  1:27 ` Ben Hutchings
2014-09-24 11:59   ` Michael S. Tsirkin
2014-09-24 11:59     ` Michael S. Tsirkin
2014-09-24  1:27 ` Ben Hutchings
2014-09-24 12:27 ` Amit Shah
2014-09-24 12:27   ` Amit Shah

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=20140923180218.GA17484@redhat.com \
    --to=mst@redhat.com \
    --cc=amit.shah@redhat.com \
    --cc=digitaleric@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=virtualization@lists.linux-foundation.org \
    /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.