From: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
To: Gregory Haskins <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
virtualization
<virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Subject: Re: [PATCH 00/10] PV-IO v3
Date: Fri, 17 Aug 2007 11:25:53 +1000 [thread overview]
Message-ID: <1187313953.6449.70.camel@localhost.localdomain> (raw)
In-Reply-To: <20070816231357.8044.55943.stgit-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
On Thu, 2007-08-16 at 19:13 -0400, Gregory Haskins wrote:
> Here is the v3 release of the patch series for a generalized PV-IO
> infrastructure. It has v2 plus the following changes:
Hi Gregory,
This is a lot of code. I'm having trouble taking it all in, TBH. It
might help me if we could to go back to the basic transport
implementation questions.
Transport has several parts. What the hypervisor knows about (usually
shared memory and some interrupt mechanism and possibly "DMA") and what
is convention between users (eg. ringbuffer layouts). Whether it's 1:1
or n-way (if 1:1, is it symmetrical?). Whether it has to be host <->
guest, or can be inter-guest. Whether it requires trust between the
sides.
My personal thoughts are that we should be aiming for 1:1 untrusting. I
like N-way, but it adds complexity. And not having inter-guest is just
poor form (and putting it in later is impossible, as we'll see).
It seems that a shared-memory "ring-buffer of descriptors" is the
simplest implementation. But there are two problems with a simple
descriptor ring:
1) A ring buffer doesn't work well for things which process
out-of-order, such as a block device.
2) We either need huge descriptors or some chaining mechanism to
handle scatter-gather.
So we end up with an array of descriptors with next pointers, and two
ring buffers which refer to those descriptors: one for what descriptors
are pending, and one for what descriptors have been used (by the other
end).
This is sufficient for guest<->host, but care must be taken for guest
<-> guest. Let's dig down:
Consider a transport from A -> B. A populates the descriptor entries
corresponding to its sg, then puts the head descriptor entry in the
"pending" ring buffer and sends B an interrupt. B sees the new pending
entry, reads the descriptors, does the operation and reads or writes
into the memory pointed to by the descriptors. It then updates the
"used" ring buffer and sends A an interrupt.
Now, if B is untrusted, this is more difficult. It needs to read the
descriptor entries and the "pending" ring buffer, and write to the
"used" ring buffer. We can use page protection to share these if we
arrange things carefully, like so:
struct desc_pages
{
/* Page of descriptors. */
struct lguest_desc desc[NUM_DESCS];
/* Next page: how we tell other side what buffers are available. */
unsigned int avail_idx;
unsigned int available[NUM_DESCS];
char pad[PAGE_SIZE - (NUM_DESCS+1) * sizeof(unsigned int)];
/* Third page: how other side tells us what's used. */
unsigned int used_idx;
struct lguest_used used[NUM_DESCS];
};
But we still have the problem of an untrusted B having to read/write A's
memory pointed to A's descriptors. At this point, my preferred solution
so far is as follows (note: have not implemented this!):
(1) have the hypervisor be aware of the descriptor page format, location
and which guest can access it.
(2) have the descriptors themselves contains a type (read/write) and a
valid bit.
(3) have a "DMA" hypercall to copy to/from someone else's descriptors.
Note that this means we do a copy for the untrusted case which doesn't
exist for the trusted case. In theory the hypervisor could do some
tricky copy-on-write page-sharing for very large well-aligned buffers,
but it remains to be seen if that is actually useful.
Sorry for the long mail, but I really want to get the mechanism correct.
Cheers,
Rusty.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
next prev parent reply other threads:[~2007-08-17 1:25 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-16 23:13 [PATCH 00/10] PV-IO v3 Gregory Haskins
[not found] ` <20070816231357.8044.55943.stgit-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
2007-08-16 23:14 ` [PATCH 01/10] IOQ: Adding basic definitions for IO-Queue logic Gregory Haskins
2007-08-16 23:14 ` [PATCH 02/10] PARAVIRTUALIZATION: Add support for a bus abstraction Gregory Haskins
2007-08-16 23:14 ` [PATCH 03/10] IOQ: Add an IOQ network driver Gregory Haskins
2007-08-16 23:14 ` [PATCH 04/10] IOQNET: Add a test harness infrastructure to IOQNET Gregory Haskins
2007-08-16 23:14 ` [PATCH 05/10] IRQ: Export create_irq/destroy_irq Gregory Haskins
2007-08-16 23:14 ` [PATCH 06/10] KVM: Add a guest side driver for IOQ Gregory Haskins
2007-08-16 23:14 ` [PATCH 07/10] KVM: Add a gpa_to_hva helper function Gregory Haskins
2007-08-16 23:14 ` [PATCH 08/10] KVM: Add support for IOQ Gregory Haskins
2007-08-16 23:14 ` [PATCH 09/10] KVM: Add PVBUS support to the KVM host Gregory Haskins
2007-08-16 23:14 ` [PATCH 10/10] KVM: Add an IOQNET backend driver Gregory Haskins
2007-08-17 1:25 ` Rusty Russell [this message]
[not found] ` <1187313953.6449.70.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-08-17 5:26 ` [PATCH 00/10] PV-IO v3 Gregory Haskins
[not found] ` <1187328402.4363.110.camel-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
2007-08-17 7:43 ` Rusty Russell
[not found] ` <1187336618.6449.106.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-08-17 13:50 ` Gregory Haskins
[not found] ` <1187358614.4363.135.camel-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
2007-08-20 23:28 ` Rusty Russell
[not found] ` <1187652496.19435.141.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-08-21 7:33 ` Dor Laor
[not found] ` <64F9B87B6B770947A9F8391472E032160D464FEB-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-08-21 7:58 ` Rusty Russell
[not found] ` <1187683122.19435.171.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-08-21 12:00 ` Gregory Haskins
[not found] ` <1187697638.4363.277.camel-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
2007-08-21 12:25 ` Avi Kivity
[not found] ` <46CAD9CC.6050209-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-21 13:11 ` Gregory Haskins
2007-08-21 13:47 ` Rusty Russell
[not found] ` <1187704038.19435.194.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-08-21 14:06 ` Gregory Haskins
[not found] ` <1187705162.4363.323.camel-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
2007-08-21 16:47 ` Gregory Haskins
[not found] ` <1187714864.4363.358.camel-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
2007-08-21 17:12 ` Avi Kivity
[not found] ` <46CB1D06.1040005-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-21 17:17 ` Gregory Haskins
2007-08-22 3:29 ` Rusty Russell
[not found] ` <1187753365.6174.26.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-08-22 9:18 ` Christian Borntraeger
[not found] ` <200708221118.00990.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-08-22 9:26 ` Dor Laor
[not found] ` <64F9B87B6B770947A9F8391472E032160D503D81-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-08-22 9:30 ` Christian Borntraeger
[not found] ` <200708221130.17364.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-08-22 10:05 ` Dor Laor
2007-08-22 10:40 ` Rusty Russell
[not found] ` <1187779205.6174.87.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-08-22 11:47 ` Avi Kivity
2007-08-21 12:29 ` Avi Kivity
2007-08-19 9:24 ` Avi Kivity
[not found] ` <46C80C5B.7070009-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-20 13:50 ` Gregory Haskins
2007-08-20 14:03 ` [kvm-devel] " Dor Laor
[not found] ` <64F9B87B6B770947A9F8391472E032160D4649E2-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-08-20 14:12 ` Avi Kivity
[not found] ` <46C9A150.60101-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-20 23:24 ` Rusty Russell
2007-08-20 14:17 ` Gregory Haskins
[not found] ` <1187617806.4363.179.camel-5CR4LY5GPkvLDviKLk5550HKjMygAv58XqFh9Ls21Oc@public.gmane.org>
2007-08-20 14:14 ` Avi Kivity
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=1187313953.6449.70.camel@localhost.localdomain \
--to=rusty-8n+1lvoiyb80n/f98k4iww@public.gmane.org \
--cc=ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org \
--cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.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