From: Avi Kivity <avi@redhat.com>
To: Cam Macdonell <cam@cs.ualberta.ca>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: Re: [PATCH] Inter-VM shared memory PCI device
Date: Tue, 09 Mar 2010 12:29:21 +0200 [thread overview]
Message-ID: <4B962301.3030008@redhat.com> (raw)
In-Reply-To: <8286e4ee1003080957v9bb4837x187cebb8477348c2@mail.gmail.com>
On 03/08/2010 07:57 PM, Cam Macdonell wrote:
>
>> Can you provide a spec that describes the device? This would be useful for
>> maintaining the code, writing guest drivers, and as a framework for review.
>>
> I'm not sure if you want the Qemu command-line part as part of the
> spec here, but I've included for completeness.
>
I meant something from the guest's point of view, so command line syntax
is less important. It should be equally applicable to a real PCI card
that works with the same driver.
See http://ozlabs.org/~rusty/virtio-spec/ for an example.
> The Inter-VM Shared Memory PCI device
> -----------------------------------------------------------
>
> BARs
>
> The device supports two BARs. BAR0 is a 256-byte MMIO region to
> support registers
>
(but might be extended in the future)
> and BAR1 is used to map the shared memory object from the host. The size of
> BAR1 is specified on the command-line and must be a power of 2 in size.
>
> Registers
>
> BAR0 currently supports 5 registers of 16-bits each.
Suggest making registers 32-bits, friendlier towards non-x86.
> Registers are used
> for synchronization between guests sharing the same memory object when
> interrupts are supported (this requires using the shared memory server).
>
How does the driver detect whether interrupts are supported or not?
> When using interrupts, VMs communicate with a shared memory server that passes
> the shared memory object file descriptor using SCM_RIGHTS. The server assigns
> each VM an ID number and sends this ID number to the Qemu process along with a
> series of eventfd file descriptors, one per guest using the shared memory
> server. These eventfds will be used to send interrupts between guests. Each
> guest listens on the eventfd corresponding to their ID and may use the others
> for sending interrupts to other guests.
>
> enum ivshmem_registers {
> IntrMask = 0,
> IntrStatus = 2,
> Doorbell = 4,
> IVPosition = 6,
> IVLiveList = 8
> };
>
> The first two registers are the interrupt mask and status registers.
> Interrupts are triggered when a message is received on the guest's eventfd from
> another VM. Writing to the 'Doorbell' register is how synchronization messages
> are sent to other VMs.
>
> The IVPosition register is read-only and reports the guest's ID number. The
> IVLiveList register is also read-only and reports a bit vector of currently
> live VM IDs.
>
That limits the number of guests to 16.
> The Doorbell register is 16-bits, but is treated as two 8-bit values. The
> upper 8-bits are used for the destination VM ID. The lower 8-bits are the
> value which will be written to the destination VM and what the guest status
> register will be set to when the interrupt is trigger is the destination guest.
>
What happens when two interrupts are sent back-to-back to the same
guest? Will the first status value be lost?
Also, reading the status register requires a vmexit. I suggest dropping
it and requiring the application to manage this information in the
shared memory area (where it could do proper queueing of multiple messages).
> A value of 255 in the upper 8-bits will trigger a broadcast where the message
> will be sent to all other guests.
>
Please consider adding:
- MSI support
- interrupt on a guest attaching/detaching to the shared memory device
With MSI you could also have the doorbell specify both guest ID and
vector number, which may be useful.
Thanks for this - it definitely makes reviewing easier.
--
error compiling committee.c: too many arguments to function
WARNING: multiple messages have this Message-ID (diff)
From: Avi Kivity <avi@redhat.com>
To: Cam Macdonell <cam@cs.ualberta.ca>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: [Qemu-devel] Re: [PATCH] Inter-VM shared memory PCI device
Date: Tue, 09 Mar 2010 12:29:21 +0200 [thread overview]
Message-ID: <4B962301.3030008@redhat.com> (raw)
In-Reply-To: <8286e4ee1003080957v9bb4837x187cebb8477348c2@mail.gmail.com>
On 03/08/2010 07:57 PM, Cam Macdonell wrote:
>
>> Can you provide a spec that describes the device? This would be useful for
>> maintaining the code, writing guest drivers, and as a framework for review.
>>
> I'm not sure if you want the Qemu command-line part as part of the
> spec here, but I've included for completeness.
>
I meant something from the guest's point of view, so command line syntax
is less important. It should be equally applicable to a real PCI card
that works with the same driver.
See http://ozlabs.org/~rusty/virtio-spec/ for an example.
> The Inter-VM Shared Memory PCI device
> -----------------------------------------------------------
>
> BARs
>
> The device supports two BARs. BAR0 is a 256-byte MMIO region to
> support registers
>
(but might be extended in the future)
> and BAR1 is used to map the shared memory object from the host. The size of
> BAR1 is specified on the command-line and must be a power of 2 in size.
>
> Registers
>
> BAR0 currently supports 5 registers of 16-bits each.
Suggest making registers 32-bits, friendlier towards non-x86.
> Registers are used
> for synchronization between guests sharing the same memory object when
> interrupts are supported (this requires using the shared memory server).
>
How does the driver detect whether interrupts are supported or not?
> When using interrupts, VMs communicate with a shared memory server that passes
> the shared memory object file descriptor using SCM_RIGHTS. The server assigns
> each VM an ID number and sends this ID number to the Qemu process along with a
> series of eventfd file descriptors, one per guest using the shared memory
> server. These eventfds will be used to send interrupts between guests. Each
> guest listens on the eventfd corresponding to their ID and may use the others
> for sending interrupts to other guests.
>
> enum ivshmem_registers {
> IntrMask = 0,
> IntrStatus = 2,
> Doorbell = 4,
> IVPosition = 6,
> IVLiveList = 8
> };
>
> The first two registers are the interrupt mask and status registers.
> Interrupts are triggered when a message is received on the guest's eventfd from
> another VM. Writing to the 'Doorbell' register is how synchronization messages
> are sent to other VMs.
>
> The IVPosition register is read-only and reports the guest's ID number. The
> IVLiveList register is also read-only and reports a bit vector of currently
> live VM IDs.
>
That limits the number of guests to 16.
> The Doorbell register is 16-bits, but is treated as two 8-bit values. The
> upper 8-bits are used for the destination VM ID. The lower 8-bits are the
> value which will be written to the destination VM and what the guest status
> register will be set to when the interrupt is trigger is the destination guest.
>
What happens when two interrupts are sent back-to-back to the same
guest? Will the first status value be lost?
Also, reading the status register requires a vmexit. I suggest dropping
it and requiring the application to manage this information in the
shared memory area (where it could do proper queueing of multiple messages).
> A value of 255 in the upper 8-bits will trigger a broadcast where the message
> will be sent to all other guests.
>
Please consider adding:
- MSI support
- interrupt on a guest attaching/detaching to the shared memory device
With MSI you could also have the doorbell specify both guest ID and
vector number, which may be useful.
Thanks for this - it definitely makes reviewing easier.
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2010-03-09 10:29 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-05 23:52 [PATCH] Support adding a file to qemu's ram allocation Cam Macdonell
2010-03-05 23:52 ` [Qemu-devel] " Cam Macdonell
2010-03-05 23:52 ` [PATCH] Inter-VM shared memory PCI device Cam Macdonell
2010-03-05 23:52 ` [Qemu-devel] " Cam Macdonell
2010-03-07 22:53 ` Paul Brook
2010-03-08 1:45 ` Jamie Lokier
2010-03-08 1:45 ` Jamie Lokier
2010-03-08 9:48 ` Alexander Graf
2010-03-08 9:48 ` Alexander Graf
2010-03-08 9:54 ` Jamie Lokier
2010-03-08 9:54 ` Jamie Lokier
2010-03-08 10:57 ` Alexander Graf
2010-03-08 10:57 ` Alexander Graf
2010-03-09 21:41 ` Anthony Liguori
2010-03-09 21:41 ` Anthony Liguori
2010-03-08 13:04 ` Paul Brook
2010-03-08 13:04 ` Paul Brook
2010-03-09 19:00 ` Jamie Lokier
2010-03-09 19:00 ` Jamie Lokier
2010-03-08 9:52 ` Avi Kivity
2010-03-08 9:52 ` Avi Kivity
2010-03-08 13:03 ` Paul Brook
2010-03-08 13:03 ` Paul Brook
2010-03-08 13:16 ` Avi Kivity
2010-03-08 13:16 ` Avi Kivity
2010-03-09 20:11 ` Jamie Lokier
2010-03-09 20:11 ` Jamie Lokier
2010-03-09 21:44 ` Anthony Liguori
2010-03-09 21:44 ` [Qemu-devel] " Anthony Liguori
2010-03-10 9:25 ` Avi Kivity
2010-03-10 9:25 ` [Qemu-devel] " Avi Kivity
2010-03-10 17:13 ` Anthony Liguori
2010-03-10 17:13 ` Anthony Liguori
2010-03-10 17:30 ` Avi Kivity
2010-03-10 17:30 ` Avi Kivity
2010-03-10 17:41 ` Paul Brook
2010-03-10 17:41 ` Paul Brook
2010-03-11 6:33 ` Avi Kivity
2010-03-11 6:33 ` Avi Kivity
2010-03-11 12:21 ` Paul Brook
2010-03-11 12:21 ` Paul Brook
2010-03-09 20:12 ` Jamie Lokier
2010-03-09 20:12 ` Jamie Lokier
2010-03-10 0:03 ` Paul Brook
2010-03-10 0:03 ` Paul Brook
2010-03-10 4:38 ` Cam Macdonell
2010-03-10 4:38 ` [Qemu-devel] " Cam Macdonell
2010-03-10 9:29 ` Avi Kivity
2010-03-10 9:29 ` [Qemu-devel] " Avi Kivity
2010-03-10 11:13 ` Paul Brook
2010-03-10 11:13 ` Paul Brook
2010-03-11 3:10 ` Jamie Lokier
2010-03-11 3:10 ` Jamie Lokier
2010-03-11 4:37 ` Nick Piggin
2010-03-11 4:37 ` Nick Piggin
2010-03-11 14:38 ` malc
2010-03-11 14:38 ` [Qemu-devel] " malc
2010-03-08 9:56 ` Avi Kivity
2010-03-08 9:56 ` [Qemu-devel] " Avi Kivity
2010-03-08 17:57 ` Cam Macdonell
2010-03-08 17:57 ` [Qemu-devel] " Cam Macdonell
2010-03-09 10:29 ` Avi Kivity [this message]
2010-03-09 10:29 ` Avi Kivity
[not found] ` <8286e4ee1003090724m1ef0b571g8b705a24e36e1753@mail.gmail.com>
2010-03-09 15:27 ` Cam Macdonell
2010-03-09 15:27 ` [Qemu-devel] " Cam Macdonell
2010-03-09 17:28 ` Avi Kivity
2010-03-09 17:28 ` [Qemu-devel] " Avi Kivity
2010-03-09 17:34 ` Anthony Liguori
2010-03-09 17:34 ` [Qemu-devel] " Anthony Liguori
2010-03-09 18:34 ` Cam Macdonell
2010-03-09 18:34 ` [Qemu-devel] " Cam Macdonell
2010-03-10 9:21 ` Avi Kivity
2010-03-10 9:21 ` [Qemu-devel] " Avi Kivity
2010-03-10 16:36 ` Cam Macdonell
2010-03-10 16:36 ` [Qemu-devel] " Cam Macdonell
2010-03-11 6:49 ` Avi Kivity
2010-03-11 6:49 ` [Qemu-devel] " Avi Kivity
2010-03-09 12:49 ` Arnd Bergmann
2010-03-09 12:49 ` [Qemu-devel] " Arnd Bergmann
2010-03-09 13:03 ` Avi Kivity
2010-03-09 13:03 ` [Qemu-devel] " Avi Kivity
2010-03-09 16:44 ` Cam Macdonell
2010-03-09 16:44 ` [Qemu-devel] " Cam Macdonell
2010-03-10 14:04 ` Arnd Bergmann
2010-03-10 14:04 ` [Qemu-devel] " Arnd Bergmann
2010-03-11 6:50 ` Avi Kivity
2010-03-11 6:50 ` [Qemu-devel] " Avi Kivity
2010-03-11 12:57 ` Arnd Bergmann
2010-03-11 12:57 ` [Qemu-devel] " Arnd Bergmann
2010-03-11 13:07 ` Avi Kivity
2010-03-11 13:07 ` [Qemu-devel] " Avi Kivity
2010-03-11 14:32 ` Arnd Bergmann
2010-03-11 14:32 ` [Qemu-devel] " Arnd Bergmann
2010-03-08 9:53 ` [PATCH] Support adding a file to qemu's ram allocation Avi Kivity
2010-03-08 9:53 ` [Qemu-devel] " 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=4B962301.3030008@redhat.com \
--to=avi@redhat.com \
--cc=cam@cs.ualberta.ca \
--cc=kvm@vger.kernel.org \
--cc=qemu-devel@nongnu.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.