From: "Michael S. Tsirkin" <mst@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: Anthony Liguori <aliguori@us.ibm.com>,
qemu-devel <qemu-devel@nongnu.org>,
kvm@vger.kernel.org, virtualization@lists.linux-foundation.org
Subject: Re: Using PCI config space to indicate config location
Date: Thu, 11 Oct 2012 12:23:34 +0200 [thread overview]
Message-ID: <20121011102333.GA5552@redhat.com> (raw)
In-Reply-To: <87bog9957l.fsf@rustcorp.com.au>
On Thu, Oct 11, 2012 at 11:48:22AM +1030, Rusty Russell wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> > On Mon, Oct 08, 2012 at 12:51:25PM +1030, Rusty Russell wrote:
> >> Note before anyone gets confused; we were talking about using the PCI
> >> config space to indicate what BAR(s) the virtio stuff is in. An
> >> alternative would be to simply specify a new layout format in BAR1.
> >
> > One problem we are still left with is this: device specific
> > config accesses are still non atomic.
> > This is a problem for multibyte fields such as MAC address
> > where MAC could change while we are accessing it.
>
> It's also a problem for related fields, eg. console width and height, or
> disk geometry.
>
> > I was thinking about some backwards compatible way to solve this, but if
> > we are willing to break compatiblity or use some mode switch, how about
> > we give up on virtio config space completely, and do everything besides
> > IO and ISR through guest memory?
>
> I think there's still a benefit in the simple publishing of information:
> I don't really want to add a control queue for the console.
One reason I thought using a vq is handy is because this would
let us get by with a single MSI vector. Currently we need at least 2
for config changes + a shared one for vqs.
But I don't insist.
> But
> inevitably, once-static information can change in later versions, and
> it's horrible to have config information plus a bit that says "don't use
> this, use the control queue".
>
> Here's a table from a quick audit:
>
> Driver Config Device changes Driver writes... after init?
> net Y Y N N
> block Y Y Y Y
> console Y Y N N
> rng N N N N
> balloon Y Y Y Y
> scsi Y N Y N
> 9p Y N N N
>
> For config space reads, I suggest the driver publish a generation count.
You mean device?
> For writes, the standard seems to be a commit latch. We could abuse the
> generation count for this: the driver writes to it to commit config
> changes.
I think this will work. There are a couple of things that bother me:
This assumes read accesses have no side effects, and these are sometimes handy.
Also the semantics for write aren't very clear to me.
I guess device must buffer data until generation count write?
This assumes the device has a buffer to store writes,
and it must track each byte written. I kind of dislike this
tracking of accessed bytes. Also, device would need to resolve conflicts
if any in some device specific way.
Maybe it's a good idea to make the buffer accesses explicit instead?
IOW require driver to declare intent to read/request write of a specific
config range. We could for example do it like this:
__le32 config_offset;
__le32 config_len;
__u8 config_cmd; /* write-only: 0 - read, 1 - write
config_len bytes at config_offset
from/to config space to/from device memory */
But maybe this is over-engineering?
> ie:
> /* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */
> struct virtio_pci_common_cfg {
> /* About the whole device. */
> __le32 device_feature_select; /* read-write */
> __le32 device_feature; /* read-only */
> __le32 guest_feature_select; /* read-write */
> __le32 guest_feature; /* read-only */
> __le32 config_gen_and_latch; /* read-write */
> __le16 msix_config; /* read-write */
> __u8 device_status; /* read-write */
> __u8 unused;
>
> /* About a specific virtqueue. */
> __le16 queue_select; /* read-write */
> __le16 queue_align; /* read-write, power of 2. */
> __le16 queue_size; /* read-write, power of 2. */
> __le16 queue_msix_vector;/* read-write */
> __le64 queue_address; /* read-write: 0xFFFFFFFFFFFFFFFF == DNE. */
> };
>
> Thoughts?
> Rusty.
> PS. Let's make all the virtio-device config LE, too...
We'll need some new API for devices then: currently we pass bytes.
--
MST
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: Anthony Liguori <aliguori@us.ibm.com>,
qemu-devel <qemu-devel@nongnu.org>,
kvm@vger.kernel.org, virtualization@lists.linux-foundation.org
Subject: Re: [Qemu-devel] Using PCI config space to indicate config location
Date: Thu, 11 Oct 2012 12:23:34 +0200 [thread overview]
Message-ID: <20121011102333.GA5552@redhat.com> (raw)
In-Reply-To: <87bog9957l.fsf@rustcorp.com.au>
On Thu, Oct 11, 2012 at 11:48:22AM +1030, Rusty Russell wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> > On Mon, Oct 08, 2012 at 12:51:25PM +1030, Rusty Russell wrote:
> >> Note before anyone gets confused; we were talking about using the PCI
> >> config space to indicate what BAR(s) the virtio stuff is in. An
> >> alternative would be to simply specify a new layout format in BAR1.
> >
> > One problem we are still left with is this: device specific
> > config accesses are still non atomic.
> > This is a problem for multibyte fields such as MAC address
> > where MAC could change while we are accessing it.
>
> It's also a problem for related fields, eg. console width and height, or
> disk geometry.
>
> > I was thinking about some backwards compatible way to solve this, but if
> > we are willing to break compatiblity or use some mode switch, how about
> > we give up on virtio config space completely, and do everything besides
> > IO and ISR through guest memory?
>
> I think there's still a benefit in the simple publishing of information:
> I don't really want to add a control queue for the console.
One reason I thought using a vq is handy is because this would
let us get by with a single MSI vector. Currently we need at least 2
for config changes + a shared one for vqs.
But I don't insist.
> But
> inevitably, once-static information can change in later versions, and
> it's horrible to have config information plus a bit that says "don't use
> this, use the control queue".
>
> Here's a table from a quick audit:
>
> Driver Config Device changes Driver writes... after init?
> net Y Y N N
> block Y Y Y Y
> console Y Y N N
> rng N N N N
> balloon Y Y Y Y
> scsi Y N Y N
> 9p Y N N N
>
> For config space reads, I suggest the driver publish a generation count.
You mean device?
> For writes, the standard seems to be a commit latch. We could abuse the
> generation count for this: the driver writes to it to commit config
> changes.
I think this will work. There are a couple of things that bother me:
This assumes read accesses have no side effects, and these are sometimes handy.
Also the semantics for write aren't very clear to me.
I guess device must buffer data until generation count write?
This assumes the device has a buffer to store writes,
and it must track each byte written. I kind of dislike this
tracking of accessed bytes. Also, device would need to resolve conflicts
if any in some device specific way.
Maybe it's a good idea to make the buffer accesses explicit instead?
IOW require driver to declare intent to read/request write of a specific
config range. We could for example do it like this:
__le32 config_offset;
__le32 config_len;
__u8 config_cmd; /* write-only: 0 - read, 1 - write
config_len bytes at config_offset
from/to config space to/from device memory */
But maybe this is over-engineering?
> ie:
> /* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */
> struct virtio_pci_common_cfg {
> /* About the whole device. */
> __le32 device_feature_select; /* read-write */
> __le32 device_feature; /* read-only */
> __le32 guest_feature_select; /* read-write */
> __le32 guest_feature; /* read-only */
> __le32 config_gen_and_latch; /* read-write */
> __le16 msix_config; /* read-write */
> __u8 device_status; /* read-write */
> __u8 unused;
>
> /* About a specific virtqueue. */
> __le16 queue_select; /* read-write */
> __le16 queue_align; /* read-write, power of 2. */
> __le16 queue_size; /* read-write, power of 2. */
> __le16 queue_msix_vector;/* read-write */
> __le64 queue_address; /* read-write: 0xFFFFFFFFFFFFFFFF == DNE. */
> };
>
> Thoughts?
> Rusty.
> PS. Let's make all the virtio-device config LE, too...
We'll need some new API for devices then: currently we pass bytes.
--
MST
next prev parent reply other threads:[~2012-10-11 10:23 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-27 0:29 Proposal for virtio standardization Rusty Russell
2012-09-27 0:29 ` [Qemu-devel] " Rusty Russell
2012-09-27 0:29 ` Rusty Russell
2012-10-04 18:49 ` [Qemu-devel] " Anthony Liguori
2012-10-04 18:49 ` Anthony Liguori
2012-10-08 2:21 ` Using PCI config space to indicate config location Rusty Russell
2012-10-08 2:21 ` Rusty Russell
2012-10-08 2:21 ` [Qemu-devel] " Rusty Russell
2012-10-08 13:58 ` Anthony Liguori
2012-10-08 13:58 ` Anthony Liguori
2012-10-08 13:58 ` Anthony Liguori
2012-10-08 14:58 ` Gerd Hoffmann
2012-10-08 14:58 ` Gerd Hoffmann
2012-10-08 15:09 ` Anthony Liguori
2012-10-08 15:09 ` Anthony Liguori
2012-10-08 20:13 ` Gerd Hoffmann
2012-10-08 20:13 ` Gerd Hoffmann
2012-10-08 20:55 ` Anthony Liguori
2012-10-08 20:55 ` Anthony Liguori
2012-10-08 23:56 ` Rusty Russell
2012-10-09 1:51 ` Anthony Liguori
2012-10-09 3:16 ` Rusty Russell
2012-10-09 3:16 ` Rusty Russell
2012-10-09 3:16 ` Rusty Russell
2012-10-09 10:17 ` Avi Kivity
2012-10-09 10:17 ` Avi Kivity
2012-10-09 14:03 ` Anthony Liguori
2012-10-09 14:03 ` Anthony Liguori
2012-10-09 13:56 ` Anthony Liguori
2012-10-09 13:56 ` Anthony Liguori
2012-10-10 3:44 ` Rusty Russell
2012-10-10 3:44 ` Rusty Russell
2012-10-10 11:37 ` Michael S. Tsirkin
2012-10-10 11:37 ` Michael S. Tsirkin
2012-10-09 13:56 ` Anthony Liguori
2012-10-09 21:09 ` Jamie Lokier
2012-10-09 21:09 ` Jamie Lokier
2012-10-09 21:09 ` [Qemu-devel] " Jamie Lokier
2012-10-10 3:44 ` Rusty Russell
2012-10-10 3:44 ` Rusty Russell
2012-10-11 0:08 ` Rusty Russell
2012-10-11 0:08 ` Rusty Russell
2012-10-11 0:08 ` Rusty Russell
2012-10-09 6:33 ` Gerd Hoffmann
2012-10-09 6:33 ` Gerd Hoffmann
2012-10-09 15:26 ` Anthony Liguori
2012-10-09 15:26 ` Anthony Liguori
2012-10-09 15:26 ` Anthony Liguori
2012-10-09 20:24 ` Gerd Hoffmann
2012-10-09 20:24 ` Gerd Hoffmann
2012-10-10 2:54 ` Rusty Russell
2012-10-10 2:54 ` Rusty Russell
2012-10-10 2:54 ` Rusty Russell
2012-10-10 13:36 ` Anthony Liguori
2012-10-10 13:41 ` Michael S. Tsirkin
2012-10-10 13:41 ` Michael S. Tsirkin
2012-10-11 0:43 ` Rusty Russell
2012-10-11 0:43 ` Rusty Russell
2012-10-11 0:43 ` [Qemu-devel] " Rusty Russell
2012-10-10 8:34 ` Michael S. Tsirkin
2012-10-10 8:34 ` Michael S. Tsirkin
2012-10-10 8:30 ` Michael S. Tsirkin
2012-10-10 8:30 ` [Qemu-devel] " Michael S. Tsirkin
2012-10-11 1:18 ` Rusty Russell
2012-10-11 1:18 ` [Qemu-devel] " Rusty Russell
2012-10-11 10:23 ` Michael S. Tsirkin [this message]
2012-10-11 10:23 ` Michael S. Tsirkin
2012-10-11 22:29 ` Rusty Russell
2012-10-11 22:29 ` Rusty Russell
2012-10-11 22:29 ` [Qemu-devel] " Rusty Russell
2012-10-12 9:33 ` Michael S. Tsirkin
2012-10-12 9:33 ` [Qemu-devel] " Michael S. Tsirkin
2012-10-12 9:51 ` Rusty Russell
2012-10-12 9:51 ` [Qemu-devel] " Rusty Russell
2012-10-12 10:02 ` Michael S. Tsirkin
2012-10-12 10:02 ` [Qemu-devel] " Michael S. Tsirkin
2012-10-16 13:15 ` Rusty Russell
2012-10-16 13:15 ` Rusty Russell
2012-10-16 13:15 ` [Qemu-devel] " Rusty Russell
2012-10-16 13:30 ` Michael S. Tsirkin
2012-10-16 13:30 ` [Qemu-devel] " Michael S. Tsirkin
2012-10-16 13:52 ` Rusty Russell
2012-10-16 13:52 ` [Qemu-devel] " Rusty Russell
2012-10-16 13:52 ` Rusty Russell
2012-10-04 18:49 ` [Qemu-devel] Proposal for virtio standardization Anthony Liguori
2012-10-09 14:02 ` Cornelia Huck
2012-10-09 14:02 ` [Qemu-devel] " Cornelia Huck
2012-10-10 3:46 ` Rusty Russell
2012-10-10 3:46 ` [Qemu-devel] " Rusty Russell
2012-10-10 3:46 ` Rusty Russell
2012-10-09 14:02 ` Cornelia Huck
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=20121011102333.GA5552@redhat.com \
--to=mst@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=qemu-devel@nongnu.org \
--cc=rusty@rustcorp.com.au \
--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.