All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pawel Moll <pawel.moll@arm.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: "virtualization@lists.linux-foundation.org"
	<virtualization@lists.linux-foundation.org>
Subject: Re: [RFC] virtio-mmio: Update the device to OASIS spec version
Date: Thu, 15 Jan 2015 18:42:02 +0000	[thread overview]
Message-ID: <1421347322.4601.13.camel@arm.com> (raw)
In-Reply-To: <20150115182903.GA30947@redhat.com>

On Thu, 2015-01-15 at 18:29 +0000, Michael S. Tsirkin wrote:
> On Thu, Jan 15, 2015 at 06:11:17PM +0000, Pawel Moll wrote:
> > On Thu, 2015-01-15 at 17:51 +0000, Michael S. Tsirkin wrote:
> > > > > I think you shouldn't use VIRTIO_MMIO_VRING_ALIGN in non-legacy code:
> > > > > it's a legacy thing.
> > > > 
> > > > But I still need to pass something to vring_new_virtqueue() below, don't
> > > > I? And it will allocate the queue based on some alignment value. I can't
> > > > see anything that would create the layout for me, neither in mainline
> > > > nor in next. Have I missed something? (wouldn't be surprised if I have)
> > > 
> > > No, but it's no longer a virtio thing - just an optimization
> > > choice by a specific driver. So please just stick e.g. PAGE_SIZE there.
> > 
> > #define VIRTIO_MMIO_VRING_ALIGN         PAGE_SIZE
> > 
> > > And maybe add a TODO item - we can optimize by allocating chunks
> > > separately.
> > 
> > I'll wait and see how do deal with
> > 
> >         vq = vring_new_virtqueue(index, info->num,                                                                     
> >                                  VIRTIO_PCI_VRING_ALIGN, &vp_dev->vdev,                                                
> 
> Check out the code in my tree.
> It really does, fundamentally:
> 
> 	/* TODO: don't allocate contigiously */
>          vq = vring_new_virtqueue(index, info->num,                                                                     
>                                   SMP_CACHE_BYTES, &vp_dev->vdev,                                                

Will have a look.

> > > > > > +static struct device_attribute vm_dev_attr_version =
> > > > > > +             __ATTR(version, S_IRUGO, vm_dev_attr_version_show, NULL);
> > > > > > +
> > > > > >  static int virtio_mmio_probe(struct platform_device *pdev)
> > > > > >  {
> > > > > >       struct virtio_mmio_device *vm_dev;
> > > > > 
> > > > > We already expose feature bits - this one really necessary?
> > > > 
> > > > Necessary? Of course not, just a debugging feature, really, to see what
> > > > version of control registers are available. Useful - I strongly believe
> > > > so.
> > > 
> > > Yes but the point is the same info is already available
> > > in core: just look at feature bit 31.
> > > If you think it's important enough to expose in a decoded
> > > way, let's add this in core?
> > 
> > How do you mean "in core"? It's a mmio-specific value. Content of the
> > VIRTIO_MMIO_VERSION control register.
> 
> Yes but if driver loaded, then revision is always in sync
> with the feature bit.

Well, not quite: as of now I've got legacy block device driver happily
working on top of compliant (so v2 in MMIO speech) MMIO device - the
transport if completely transparent here.

> If driver failed to attach, attribute is not there
> so can't be used for debugging.

Interesting point on its own, haven't thought of that. This is an issue
with platform devices, no standard set of attributes, always available.
Will have a look at this.

> > > Absolutely. So what happens if you drop these code lines?
> > > There's no driver registered for this ID, so it's just ignored.
> > > Seems like what spec is asking for, no?
> > 
> > Not to me, no. There will be a vm_dev registered with an _illegal_ ID.
> 
> Yes - there will be a device, but no driver will drive it.

A device with an *illegal* ID.

> > > > > @@ -496,7 +531,8 @@ static int virtio_mmio_remove(struct platform_device *pdev)
> > > > > >  {
> > > > > >       struct virtio_mmio_device *vm_dev = platform_get_drvdata(pdev);
> > > > > >
> > > > > > -     unregister_virtio_device(&vm_dev->vdev);
> > > > > > +     if (vm_dev)
> > > > > > +             unregister_virtio_device(&vm_dev->vdev);
> > > > > >
> > > > > 
> > > > > Will remove ever be called if probe fails?
> > > > 
> > > > No.
> > > 
> > > Then this if isn't necessary: vm_dev is always set.
> > 
> > Not (in the current code) if ID is 0.
> 
> So just return -ENODEV, then probe will be considered
> failed and remove won't be called.

"4.2.2.2 Driver Requirements: MMIO Device Register Layout 

The driver MUST ignore a device with DeviceID 0x0, but MUST NOT report any error."

Returning -ENODEV *reports* an error.

> Or - better - just register the device, it's harmless
> as no driver will try to attach to it, and there
> won't be any need to special-case it.

Really, you may want to refresh your memory. We've been there. This *is*
a special case. Intentionally.

> > > Not necessarily - the point is for userspace to be able to
> > > avoid getting useless legacy macros by means of a simple #define.
> > > Again, take a look at my tree:
> > > 
> > > git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git vhost-next
> > 
> > I have no idea what are you talking about here. Why would userspace ever
> > access the memory mapped control registers?
> 
> Userspace being qemu which implements these.

Right, qemu is a valid userspace case.

> > That's all what this header
> > describes. Actually, if I was typing the driver today, I'd define the
> > offsets in virtio_mmio.c file, not in a separate header. If fact, I may
> > move them there...
>
> And then you will have to copy and paste them in qemu.
> 
> Which we do ATM for silly reasons like
> we include linux/types.h, but I fully intend to get rid of that,
> just tweak the linux ones slightly for portability.

Ok, more than happy to do whatever will make qemu happy. An example?

Paweł

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

  reply	other threads:[~2015-01-15 18:42 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-19 18:38 [RFC] virtio-mmio: Update the device to OASIS spec version Pawel Moll
2015-01-15 16:51 ` Michael S. Tsirkin
2015-01-15 17:12   ` Michael S. Tsirkin
2015-01-15 17:15     ` Pawel Moll
2015-01-15 17:19       ` Michael S. Tsirkin
2015-01-16  9:58         ` Cornelia Huck
2015-01-15 17:32   ` Pawel Moll
2015-01-15 17:51     ` Michael S. Tsirkin
2015-01-15 18:11       ` Pawel Moll
2015-01-15 18:29         ` Michael S. Tsirkin
2015-01-15 18:42           ` Pawel Moll [this message]
2015-01-15 19:12             ` Michael S. Tsirkin
2015-01-19 17:45               ` Pawel Moll
2015-01-19 18:36                 ` Michael S. Tsirkin
2015-01-20 17:18                   ` Pawel Moll
2015-01-20 17:44                     ` Michael S. Tsirkin
2015-01-20 17:51                       ` Pawel Moll
2015-01-20 17:56                         ` Michael S. Tsirkin
2015-01-15 18:17       ` Michael S. Tsirkin
2015-01-15 18:39 ` Michael S. Tsirkin
2015-01-15 18:51   ` Pawel Moll
2015-01-15 19:12     ` Michael S. Tsirkin

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=1421347322.4601.13.camel@arm.com \
    --to=pawel.moll@arm.com \
    --cc=mst@redhat.com \
    --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.