From: "Michael S. Tsirkin" <mst@redhat.com>
To: Tiwei Bie <tiwei.bie@intel.com>
Cc: virtio@lists.oasis-open.org, virtio-dev@lists.oasis-open.org
Subject: [virtio] Re: [virtio-dev] [PATCH v6 4/5] packed virtqueues: more efficient virtqueue layout
Date: Wed, 10 Jan 2018 16:39:08 +0200 [thread overview]
Message-ID: <20180110163639-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20180110140801.zbiwgs6jgo5ptjff@debian-xvivbkq.sh.intel.com>
On Wed, Jan 10, 2018 at 10:08:01PM +0800, Tiwei Bie wrote:
> On Wed, Jan 10, 2018 at 11:47:58AM +0200, Michael S. Tsirkin wrote:
> > Performance analysis of this is in my kvm forum 2016 presentation. The
> > idea is to have a r/w descriptor in a ring structure, replacing the used
> > and available ring, index and descriptor buffer.
> >
> > This is also easier for devices to implement than the 1.0 layout.
> > Several more enhancements will be necessary to actually make this
> > efficient for devices to use.
> >
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> > content.tex | 36 ++-
> > packed-ring.tex | 668 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 701 insertions(+), 3 deletions(-)
> > create mode 100644 packed-ring.tex
> >
> > diff --git a/content.tex b/content.tex
> > index 3b4579e..3059bd3 100644
> > --- a/content.tex
> > +++ b/content.tex
> > @@ -242,10 +242,26 @@ a used buffer to the queue - i.e. lets the driver
> > know by marking the buffer as used. Device can then trigger
> > a device event - i.e. send an interrupt to the driver.
> >
> > -For queue operation detail, see \ref{sec:Basic Facilities of a Virtio Device / Split Virtqueues}~\nameref{sec:Basic Facilities of a Virtio Device / Split Virtqueues}.
> > +Device is not generally required to use buffers in
> > +the same order in which they have been made available
> > +by the driver.
> > +
> > +Some devices always use descriptors in the same order in which
> > +they have been made available. These devices can offer the
> > +VIRTIO_F_IN_ORDER feature. If negotiated, this knowledge
> > +might allow optimizations or simplify driver code.
>
> Does this mean that for "Split Virtqueues" if VIRTIO_F_IN_ORDER
> feature is negotiated, drivers won't be required to access the
> id field of used_elem to figure out the desc idx when processing
> the used ring?
The scope of this work is very big as is. For now the proposal limits
VIRTIO_F_IN_ORDER to packed ring format. A patch on top can relax this
restriction if people have the time to work on it.
> > +
> > +Two formats are supported: Split Virtqueues (see \ref{sec:Basic
> > +Facilities of a Virtio Device / Split
> > +Virtqueues}~\nameref{sec:Basic Facilities of a Virtio Device /
> > +Split Virtqueues}) and Packed Virtqueues (see \ref{sec:Basic
> > +Facilities of a Virtio Device / Packed
> > +Virtqueues}~\nameref{sec:Basic Facilities of a Virtio Device /
> > +Packed Virtqueues}).
> >
> > \input{split-ring.tex}
> >
> > +\input{packed-ring.tex}
> [...]
> > +Below is an example driver code. It does not attempt to reduce
> > +the number of device interrupts, neither does it support
> > +the VIRTIO_F_RING_EVENT_IDX feature.
> > +
> > +\begin{lstlisting}
> > +
> > +first = vq->next_avail;
> > +id = alloc_id(vq);
> > +
> > +for (each buffer element b) {
> > + vq->desc[vq->next_avail].address = get_addr(b);
> > + vq->desc[vq->next_avail].len = get_len(b);
> > + init_desc(vq->next_avail, b);
> > + avail = vq->avail_wrap_count;
> > + used = !vq->avail_wrap_count;
> > + f = get_flags(b) | (avail << VIRTQ_DESC_F_AVAIL) | (used << VIRTQ_DESC_F_USED);
> > + if (vq->next_avail == first) {
> > + flags = f;
>
> This is to implement the batching? I.e. don't make the first
> desc available to the device before other descs are ready?
Exactly. Will add a comment.
> > + } else {
> > + vq->desc[vq->next_avail].flags = f;
> > + }
>
> The vq->next_avail updating is missing in the loop?
Right.
> > +
> > +}
> > +vq->desc[vq->next_avail].id = id;
> > +write_memory_barrier();
> > +vq->desc[first].flags = flags;
> > +
> > +memory_barrier();
> > +
> > +if (vq->driver_event.flags != 0x3) {
> > + notify_device(vq, vq->next_avail, vq->avail_wrap_count);
> > +}
> > +
> > +vq->next_avail++;
> > +
> > +if (vq->next_avail > vq->size) {
>
> Should be (vq->next_avail >= vq->size)?
Right.
> > + vq->next_avail = 0;
> > + vq->avail_wrap_count \^= 1;
> > +}
> > +
> > +\end{lstlisting}
> > +
> [...]
> > +\begin{lstlisting}
> > +vq->device_event.flags = 0x3;
> > +
> > +for (;;) {
> > + flags = vq->desc[vq->next_used].flags;
> > + bool avail = flags & (1 << VIRTQ_DESC_F_AVAIL);
> > + bool used = flags & (1 << VIRTQ_DESC_F_USED);
> > +
> > + if (avail != used) {
> > + vq->device_event.flags = 0x1;
> > + mb();
> > +
> > + flags = vq->desc[vq->next_used].flags;
> > + bool avail = flags & (1 << VIRTQ_DESC_F_AVAIL);
> > + bool used = flags & (1 << VIRTQ_DESC_F_USED);
> > + if (avail != used) {
> > + break;
> > + }
> > +
> > + vq->device_event.flags = 0x3;
> > + }
> > +
> > + struct virtq_desc *d = vq->desc[vq->next_used];
> > + process_buffer(d);
> > + vq->next_used++;
> > + if (vq->next_used > vq->size) {
>
> Should be (vq->next_used >= vq->size)?
Right.
> > + vq->next_used = 0;
> > + }
> > +}
> > +\end{lstlisting}
> > --
> > MST
---------------------------------------------------------------------
To unsubscribe from this mail list, you must leave the OASIS TC that
generates this mail. Follow this link to all your TCs in OASIS at:
https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php
next prev parent reply other threads:[~2018-01-10 14:39 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-10 9:47 [virtio] [PATCH v6 0/5] packed ring layout spec Michael S. Tsirkin
2018-01-10 9:47 ` [virtio] [PATCH v6 1/5] content: move 1.0 queue format out to a separate section Michael S. Tsirkin
2018-01-10 12:45 ` Cornelia Huck
2018-01-10 9:47 ` [virtio] [PATCH v6 2/5] content: move ring text out to a separate file Michael S. Tsirkin
2018-01-10 12:46 ` Cornelia Huck
2018-01-10 9:47 ` [virtio] [PATCH v6 3/5] content: move virtqueue operation description Michael S. Tsirkin
2018-01-10 12:48 ` Cornelia Huck
2018-01-10 9:47 ` [virtio] [PATCH v6 4/5] packed virtqueues: more efficient virtqueue layout Michael S. Tsirkin
2018-01-10 10:47 ` Cornelia Huck
2018-01-10 13:49 ` [virtio-dev] " Jens Freimann
2018-01-10 14:39 ` [virtio] " Michael S. Tsirkin
2018-01-10 14:08 ` Tiwei Bie
2018-01-10 14:39 ` Michael S. Tsirkin [this message]
2018-01-10 14:15 ` [virtio] " Cornelia Huck
2018-01-10 15:37 ` Michael S. Tsirkin
2018-01-10 9:47 ` [virtio] [PATCH v6 5/5] packed-ring: add in order request support Michael S. Tsirkin
2018-01-10 10:33 ` [virtio] [PATCH v6 0/5] packed ring layout spec Cornelia Huck
2018-01-10 11:10 ` Michael S. Tsirkin
2018-01-10 11:14 ` Cornelia Huck
2018-01-10 11:16 ` Michael S. Tsirkin
2018-01-23 0:01 ` [virtio] [PATCH v7 02/11] content: move ring text out to a separate file Michael S. Tsirkin
2018-01-30 10:07 ` Cornelia Huck
2018-01-23 0:01 ` [virtio] [PATCH v7 01/11] content: move 1.0 queue format out to a separate section Michael S. Tsirkin
2018-01-30 10:06 ` Cornelia Huck
2018-02-05 22:54 ` Halil Pasic
2018-02-06 0:05 ` Michael S. Tsirkin
2018-02-06 8:38 ` Cornelia Huck
2018-02-06 11:10 ` [virtio] Re: [virtio-dev] " Halil Pasic
2018-02-06 11:20 ` Cornelia Huck
2018-02-06 12:03 ` Halil Pasic
2018-02-06 22:58 ` Michael S. Tsirkin
2018-01-23 0:01 ` [virtio] [PATCH v7 03/11] content: move virtqueue operation description Michael S. Tsirkin
2018-01-30 10:12 ` Cornelia Huck
2018-01-23 0:01 ` [virtio] [PATCH v7 04/11] content: replace mentions of len with used length Michael S. Tsirkin
2018-01-30 10:16 ` Cornelia Huck
2018-01-30 16:38 ` Michael S. Tsirkin
2018-01-23 0:01 ` [virtio] [PATCH v7 05/11] content: generalize transport ring part naming Michael S. Tsirkin
2018-01-30 10:27 ` Cornelia Huck
2018-01-23 0:01 ` [virtio] [PATCH v7 06/11] content: generalize rest of text Michael S. Tsirkin
2018-01-30 10:31 ` Cornelia Huck
2018-01-30 16:40 ` Michael S. Tsirkin
2018-01-23 0:01 ` [virtio] [PATCH v7 07/11] split-ring: generalize text Michael S. Tsirkin
2018-01-30 10:45 ` Cornelia Huck
2018-01-30 16:42 ` Michael S. Tsirkin
2018-01-23 0:01 ` [virtio] [PATCH v7 08/11] packed virtqueues: more efficient virtqueue layout Michael S. Tsirkin
2018-01-30 7:16 ` [virtio-dev] " Tiwei Bie
2018-01-30 16:45 ` [virtio] " Michael S. Tsirkin
2018-01-30 13:07 ` Jens Freimann
2018-01-30 13:50 ` [virtio] " Cornelia Huck
2018-01-30 19:40 ` Michael S. Tsirkin
2018-02-01 3:05 ` [virtio-dev] " Tiwei Bie
2018-02-01 10:11 ` [virtio] " Cornelia Huck
2018-02-01 14:43 ` Michael S. Tsirkin
2018-02-05 11:54 ` Halil Pasic
2018-02-05 14:33 ` Michael S. Tsirkin
2018-02-05 16:57 ` Halil Pasic
2018-02-05 17:00 ` Paolo Bonzini
2018-02-05 18:16 ` Cornelia Huck
2018-02-05 18:21 ` Michael S. Tsirkin
2018-02-05 18:26 ` Cornelia Huck
2018-02-05 17:55 ` Michael S. Tsirkin
2018-02-05 22:57 ` [virtio] Re: [virtio-dev] " Halil Pasic
2018-01-23 0:01 ` [virtio] [PATCH v7 09/11] content: in-order buffer use Michael S. Tsirkin
2018-02-01 11:01 ` Cornelia Huck
2018-02-12 13:18 ` Stefan Hajnoczi
2018-01-23 0:01 ` [virtio] [PATCH v7 11/11] split-ring: in order feature Michael S. Tsirkin
2018-02-02 11:06 ` Cornelia Huck
2018-02-12 13:23 ` Stefan Hajnoczi
2018-01-23 0:01 ` [virtio] [PATCH v7 10/11] packed-ring: add in order support Michael S. Tsirkin
2018-02-02 11:03 ` Cornelia Huck
2018-02-12 13:22 ` Stefan Hajnoczi
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=20180110163639-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=tiwei.bie@intel.com \
--cc=virtio-dev@lists.oasis-open.org \
--cc=virtio@lists.oasis-open.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox