All of lore.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
	linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org, kvm@vger.kernel.org,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH RFC] virtio: put last seen used index into ring itself
Date: Thu, 20 May 2010 18:46:43 +0300	[thread overview]
Message-ID: <4BF55963.30503@redhat.com> (raw)
In-Reply-To: <201005210004.29670.rusty@rustcorp.com.au>

On 05/20/2010 05:34 PM, Rusty Russell wrote:
>
>> Have just one ring, no indexes.  The producer places descriptors into
>> the ring and updates the head,  The consumer copies out descriptors to
>> be processed and copies back in completed descriptors.  Chaining is
>> always linear.  The descriptors contain a tag that allow the producer to
>> identify the completion.
>>      
> This could definitely work.  The original reason for the page boundaries
> was for untrusted inter-guest communication: with appropriate page protections
> they could see each other's rings and a simply inter-guest copy hypercall
> could verify that the other guest really exposed that data via virtio ring.
>
> But, cute as that is, we never did that.  And it's not clear that it wins
> much over simply having the hypervisor read both rings directly.
>    

AFAICS having separate avail_ring/used_ring/desc_pool is orthogonal to 
this cuteness.

>>> Can we do better?  The obvious idea is to try to get rid of last_used and
>>> used, and use the ring itself.  We would use an invalid entry to mark the
>>> head of the ring.
>>>        
>> Interesting!  So a peer will read until it hits a wall.  But how to
>> update the wall atomically?
>>
>> Maybe we can have a flag in the descriptor indicate headness or
>> tailness.  Update looks ugly though: write descriptor with head flag,
>> write next descriptor with head flag, remove flag from previous descriptor.
>>      
> I was thinking a separate magic "invalid" entry.  To publish an 3 descriptor
> chain, you would write descriptors 2 and 3, write an invalid entry at 4,
> barrier, write entry 1.  It is a bit ugly, yes, but not terrible.
>    

Worth exploring. This amortizes the indexes into the ring, a good thing.

Another thing we can do is place the tail a half ring away from the head 
(and limit ring utilization to 50%), reducing bounces on short kicks.  
Or equivalently have an avail ring and used ring, but both containing 
tagged descriptors instead of pointers to descriptors.

> I think that a simple simulator for this is worth writing, which tracks
> cacheline moves under various fullness scenarios...
>    

Yup.

-- 
Do not meddle in the internals of kernels, for they are subtle and quick to panic.


WARNING: multiple messages have this Message-ID (diff)
From: Avi Kivity <avi@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: qemu-devel@nongnu.org, virtualization@lists.linux-foundation.org,
	linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
	"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH RFC] virtio: put last seen used index into ring itself
Date: Thu, 20 May 2010 18:46:43 +0300	[thread overview]
Message-ID: <4BF55963.30503@redhat.com> (raw)
In-Reply-To: <201005210004.29670.rusty@rustcorp.com.au>

On 05/20/2010 05:34 PM, Rusty Russell wrote:
>
>> Have just one ring, no indexes.  The producer places descriptors into
>> the ring and updates the head,  The consumer copies out descriptors to
>> be processed and copies back in completed descriptors.  Chaining is
>> always linear.  The descriptors contain a tag that allow the producer to
>> identify the completion.
>>      
> This could definitely work.  The original reason for the page boundaries
> was for untrusted inter-guest communication: with appropriate page protections
> they could see each other's rings and a simply inter-guest copy hypercall
> could verify that the other guest really exposed that data via virtio ring.
>
> But, cute as that is, we never did that.  And it's not clear that it wins
> much over simply having the hypervisor read both rings directly.
>    

AFAICS having separate avail_ring/used_ring/desc_pool is orthogonal to 
this cuteness.

>>> Can we do better?  The obvious idea is to try to get rid of last_used and
>>> used, and use the ring itself.  We would use an invalid entry to mark the
>>> head of the ring.
>>>        
>> Interesting!  So a peer will read until it hits a wall.  But how to
>> update the wall atomically?
>>
>> Maybe we can have a flag in the descriptor indicate headness or
>> tailness.  Update looks ugly though: write descriptor with head flag,
>> write next descriptor with head flag, remove flag from previous descriptor.
>>      
> I was thinking a separate magic "invalid" entry.  To publish an 3 descriptor
> chain, you would write descriptors 2 and 3, write an invalid entry at 4,
> barrier, write entry 1.  It is a bit ugly, yes, but not terrible.
>    

Worth exploring. This amortizes the indexes into the ring, a good thing.

Another thing we can do is place the tail a half ring away from the head 
(and limit ring utilization to 50%), reducing bounces on short kicks.  
Or equivalently have an avail ring and used ring, but both containing 
tagged descriptors instead of pointers to descriptors.

> I think that a simple simulator for this is worth writing, which tracks
> cacheline moves under various fullness scenarios...
>    

Yup.

-- 
Do not meddle in the internals of kernels, for they are subtle and quick to panic.

  parent reply	other threads:[~2010-05-20 15:47 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-05 20:58 [PATCH RFC] virtio: put last seen used index into ring itself Michael S. Tsirkin
2010-05-05 20:58 ` [Qemu-devel] " Michael S. Tsirkin
2010-05-05 21:18 ` Dor Laor
2010-05-05 21:18 ` Dor Laor
2010-05-05 21:18   ` [Qemu-devel] " Dor Laor
2010-05-06  2:31 ` Rusty Russell
2010-05-06  2:31 ` Rusty Russell
2010-05-06  2:31   ` [Qemu-devel] " Rusty Russell
2010-05-06  6:19   ` Michael S. Tsirkin
2010-05-06  6:19   ` Michael S. Tsirkin
2010-05-06  6:19     ` [Qemu-devel] " Michael S. Tsirkin
2010-05-07  3:33     ` Rusty Russell
2010-05-07  3:33       ` [Qemu-devel] " Rusty Russell
2010-05-07  3:33       ` Rusty Russell
2010-05-09 21:06       ` Michael S. Tsirkin
2010-05-09 21:06         ` [Qemu-devel] " Michael S. Tsirkin
2010-05-09 21:06       ` Michael S. Tsirkin
2010-05-06 10:00 ` [Qemu-devel] " Avi Kivity
2010-05-06 10:00   ` Avi Kivity
2010-05-07  3:23   ` Rusty Russell
2010-05-07  3:23   ` Rusty Russell
2010-05-07  3:23     ` Rusty Russell
2010-05-07  3:23     ` Rusty Russell
2010-05-11 19:27     ` Avi Kivity
2010-05-11 19:27       ` Avi Kivity
2010-05-11 19:52       ` Michael S. Tsirkin
2010-05-11 19:52         ` Michael S. Tsirkin
2010-05-11 19:52         ` Michael S. Tsirkin
2010-05-19  7:39       ` Rusty Russell
2010-05-19  7:39       ` Rusty Russell
2010-05-19  7:39         ` Rusty Russell
2010-05-19  8:06         ` Avi Kivity
2010-05-19  8:06           ` Avi Kivity
2010-05-19 22:33           ` Michael S. Tsirkin
2010-05-19 22:33           ` Michael S. Tsirkin
2010-05-19 22:33             ` Michael S. Tsirkin
2010-05-20  6:04             ` Avi Kivity
2010-05-20  6:04             ` Avi Kivity
2010-05-20  6:04               ` Avi Kivity
2010-05-20  5:01           ` Rusty Russell
2010-05-20  5:01           ` Rusty Russell
2010-05-20  5:01             ` Rusty Russell
2010-05-20  5:08             ` Rusty Russell
2010-05-20  5:08             ` Rusty Russell
2010-05-20  5:08               ` Rusty Russell
2010-05-23 15:31               ` Michael S. Tsirkin
2010-05-23 15:31                 ` Michael S. Tsirkin
2010-05-23 15:41                 ` Avi Kivity
2010-05-23 15:41                   ` Avi Kivity
2010-05-23 15:51                   ` Michael S. Tsirkin
2010-05-23 15:51                   ` Michael S. Tsirkin
2010-05-23 15:51                     ` Michael S. Tsirkin
2010-05-23 16:03                     ` Avi Kivity
2010-05-23 16:03                     ` Avi Kivity
2010-05-23 16:03                       ` Avi Kivity
2010-05-23 16:30                       ` Michael S. Tsirkin
2010-05-23 16:30                         ` Michael S. Tsirkin
2010-05-24  6:37                         ` Avi Kivity
2010-05-24  6:37                         ` Avi Kivity
2010-05-24  6:37                           ` Avi Kivity
2010-05-24  8:05                           ` Michael S. Tsirkin
2010-05-24  8:05                           ` Michael S. Tsirkin
2010-05-24  8:05                             ` Michael S. Tsirkin
2010-05-24 11:00                             ` Avi Kivity
2010-05-24 11:00                             ` Avi Kivity
2010-05-24 11:00                               ` Avi Kivity
2010-05-23 16:30                       ` Michael S. Tsirkin
2010-05-23 17:28                       ` Michael S. Tsirkin
2010-05-23 17:28                       ` Michael S. Tsirkin
2010-05-23 17:28                         ` Michael S. Tsirkin
2010-05-23 15:41                 ` Avi Kivity
2010-05-23 15:31               ` Michael S. Tsirkin
2010-05-23 15:56               ` Michael S. Tsirkin
2010-05-23 15:56               ` Michael S. Tsirkin
2010-05-23 15:56                 ` Michael S. Tsirkin
2010-05-20  7:00             ` Avi Kivity
2010-05-20  7:00             ` Avi Kivity
2010-05-20  7:00               ` Avi Kivity
2010-05-20 14:34               ` Rusty Russell
2010-05-20 14:34                 ` Rusty Russell
2010-05-20 15:46                 ` Avi Kivity
2010-05-20 15:46                 ` Avi Kivity [this message]
2010-05-20 15:46                   ` Avi Kivity
2010-05-20 14:34               ` Rusty Russell
2010-05-20 10:04             ` Michael S. Tsirkin
2010-05-20 10:04               ` Michael S. Tsirkin
2010-05-20 10:04             ` Michael S. Tsirkin
2010-05-11 19:27     ` Avi Kivity
2010-05-06 10:00 ` Avi Kivity
2010-05-11 18:46 ` Ryan Harper
2010-05-11 18:46   ` [Qemu-devel] " Ryan Harper
2010-05-11 19:48   ` Michael S. Tsirkin
2010-05-11 19:48     ` [Qemu-devel] " Michael S. Tsirkin
2010-05-11 19:48   ` Michael S. Tsirkin
2010-05-11 18:46 ` Ryan Harper

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=4BF55963.30503@redhat.com \
    --to=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --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.