patches and low-level development discussion
 help / color / mirror / code / Atom feed
From: demiobenour@gmail.com
To: "Alex Bennée" <alex.bennee@linaro.org>
Cc: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>,
	Parav Pandit <parav@nvidia.com>, Alyssa Ross <hi@alyssa.is>,
	Spectrum OS Development <devel@spectrum-os.org>,
	"virtio-comment@lists.linux.dev" <virtio-comment@lists.linux.dev>,
	Viresh Kumar <viresh.kumar@linaro.org>,
	Sumit Semwal <sumit.semwal@linaro.org>,
	Bill Mills <bill.mills@linaro.org>,
	"Edgar E. Iglesias" <edgar.iglesias@amd.com>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: Vhost-guest (was virtio vhost-user) vs virtio-msg
Date: Wed, 10 Jun 2026 23:31:04 -0400	[thread overview]
Message-ID: <d0d53bd1-f9ae-4f43-8f64-c0aa04075f0e@gmail.com> (raw)
In-Reply-To: <877bonqzqo.fsf@draig.linaro.org>


[-- Attachment #1.1.1: Type: text/plain, Size: 8990 bytes --]

On 5/28/26 12:13, Alex Bennée wrote:
> Demi Marie Obenour <demiobenour@gmail.com> writes:
> 
> (add virtio-msg authors to CC)
> 
>> On 5/28/26 01:47, Manos Pitsidianakis wrote:
>>> On Thu, May 28, 2026 at 8:22 AM Parav Pandit <parav@nvidia.com> wrote:
>>>>
>>>>
>>>>> From: Demi Marie Obenour <demiobenour@gmail.com>
>>>>> Sent: 28 May 2026 05:23 AM
>>>>> To: virtio-comment@lists.linux.dev
>>>>> Subject: MSI-X vector limits and reserving a virtio device ID
>>>>>
>>>>> I'd like to reserve a virtio device ID for virtio vhost-guest,
>>>>> formally virtio vhost-user.  Would this be possible?
>>>>>
>>>> Vhost user is an implementation of the device.
>>>> I believe it stays as implementation and not a new device type.
>>>
>>> This exactly.
>>>
>>> Furthermore, we already have a mechanism for "providing" an arbitrary
>>> virtio device; it's called a transport.
>>>
>>> Demi, I suggest you look into virtio-msg transport, which would allow
>>> you to do what you want.
>>
>> I'm aware of virtio-msg, and in fact considered using it.  However, I
>> found that virtio-msg doesn't meet my requirements.
>>
>> 1. Virtio-msg needs to run over a transport of its own.  None of the
>>    proposed transports support KVM guests on x86.  FF-A is the only
>>    one that would make sense with KVM, but FF-A is specific to Arm.
> 
> Well yes. virtio-msg is a common transport that implements various buses
> on the backend. FF-A is one but we have working implementations that
> just use plain memory sharing for the message bus which work on anything
> including x86/KVM. Although it does beg the question of what an
> additional transport would being to KVM as it is already well served by
> PCI and MMIO transports.

My goal is to enable device implementations that run inside a VM,
rather than running on the host, for sandboxing reasons.  The PCI
and MMIO transports don't natively support this.  The purpose of
virtio-vhost-user is to add such support to the PCI transport.

Virtio-msg in KVM is definitely an alternative, but none of the
currently-proposed transports can be used as-is:

1. virtio-msg-ffa is specific to Arm.  Furthermore, the Xen
   implementation is not security supported, and I don't know if the
   pKVM implementation has been hardened against denial of service
   attacks.  The ones in Hafnium and TF-A were not last I checked.

2. virtio-msg-amp requires a (real or emulated) PCI connection.

3. virtio-msg-loopback is only within a single VM.

4. virtio-msg-xen is specific to Xen.

5. virtio-msg over admin virtqueues has not been implemented
   yet, whereas virtio-vhost-user has a nearly-complete device
   implementation.

Additionally, I would much prefer to reuse the existing vhost-user
protocol between frontend VMM and backend VMM.  This avoids having
to implement a third protocol on top of virtio-user and vfio-user.
Virtio-vhost-user maps to that protocol trivially (by design).

It should be possible to define and implement a virtio-msg binding
for virtio-vhost-user, though I have no particular plan to do so at
this time.

Additionally, virtio-vhost-user has more features than virtio-msg.
Some of these features are very useful, such as including the backend's
migration data in the frontend's migration stream.  Implementing them
in virtio-msg would be a nasty layering violation, whereas implementing
them in virtio-vhost-user is natural.

>> 2. Virtio-msg isn't compatible with existing frontend VMMs.
>>    Vhost-guest can be used with any frontend VMM that implements
>>    vhost-user.
> 
> What exactly do you mean by frontend VMMs?

The frontend VM is the VM that uses the virtio device.  The backend
VM is the VM that implements the device.  The frontend VMM is the
user-space code that runs the frontend VM, and the backend VMM is
the user-space code that runs the backend VM.

> The VMM needs some mechanism to expose a VirtIO transport to the guest
> be it through probing (PCI) or some machine description like ACPI or DT.
> The guest is completely unaware if the backend implementation is using
> vhost-user. If you were going to expose that to the guest you will need
> some mechanism for that.

With virtio-vhost-user, the frontend VMM runs a vhost-user client.
It exposes an MMIO or PCI device to its guest as it normally would.
The frontend VMM and its guest aren't aware of virtio-vhost-user.

> For what its worth there are QEMU and rust-vmm implementations of
> various virtio-msg backends although we would expect the host UAPI to be
> stabilised after the VirtIO spec is ratified (because its not guest
> visible).

Would you mind elaborating on "host UAPI"?  Do you mean "UAPI for
implementing a device"?

>> 3. Virtio-msg isn't compatible with existing frontend drivers.  While I
>>    expect that drivers for Linux will eventually be upstreamed,
> 
> This is just plain wrong. No changes are needed to be made to the
> drivers as they are transport agnostic.

I meant the exiting *transport* drivers.  

>>    I doubt that drivers for Windows or *BSD will ever be written.
>>    I don't even know if the Windows Driver Framework provides enough
>>    to write one.  I don't need this myself, but I suspect that this
>>    is enough to make virtio-msg unsuitable in many environments.
> 
> Why would Windows or *BSD want to implement virtio-msg when they can
> already use MMIO and PCI? But nothing stops them implementing it if they
> wish.

If VM A is going to expose a device to VM B using virtio-msg, VM B
needs virtio-msg support.  With virtio-vhost-user, VM B gets a MMIO
or PCI device.

>> 4. Virtio-msg requires invasive changes to existing userspace device
>>    implementations.
> 
> No it doesn't. We test virtio-msg with existing unmodified rust-vmm
> vhost-device implementations because on the host we bridge between
> virtio-msg and vhost-user. In QEMU the transport is abstracted away from
> the details of the device implementation - you don't need MMIO and PCI
> specific device implementations either.

Makes sense!  I was not aware of QEMU having that abstraction, but
it makes sense that it does.  rust-vmm really ought to also have
an abstraction, so that the same device implementation can support
virtio-vhost-user, vhost-msg, vhost-user, and in-process virtio.

>>    The project I work on doesn't use QEMU, and the
>>    existing frontends are targeted at server use-cases.  Using the
>>    vhost-user protocol lets me reuse these with little effort.
>>
>> 5. To the best of my knowledge, virtio-msg doesn't support live
>>    migration of frontend VMs.  Vhost-guest uses the vhost-user
>>    protocol, which has supported this for a very long time.  I don't
>>    need live migration myself, but for many server use-cases, not
>>    having live migration is a dealbreaker.
> 
> Live migration isn't in scope for a transport (aside from maybe support
> device reset/disable flows). The information needed to deal with
> migration is between the VMM and whatever implements the device backend.

Virtio-vhost-user has a different scope than virtio-msg.
Virtio-vhost-user lets you run a vhost-user server in a guest instead
of the host, so its scope includes everything that is in scope for
the vhost-user protocol.  That includes live migration.

> Indeed I find it a little confusing how live migration would work if the
> vhost-guest communication is directly between the backend and the guest.
> The VMM is the one that is responsible for serialistion and if it is cut
> out of the loop how will it know?

Live migration is a control plane operation.  On the sending side, the
backend VM sends migration data to its VMM over a dedicated virtqueue.
The backend VMM then forwards the migration data to the frontend VMM
over a pipe.  On the receiving side, the frontend VMM sends the data
to the backend VMM over a pipe, and the backend VMM sends it to the
backend VMM over a virtqueue.

This feature isn't in any of the currently published virtio-vhost-user
specifications, but the version I plan to submit to this list will
include it.

>> 6. I don't know if virtio-msg can achieve comparable performance.
>>    It appears to be optimized for reliability and isolation,
>>    not processing tens of gigabits of network traffic per second.
>>    Vhost-guest is designed with performance in mind.
> 
> This is pure supposition. The data plane in virtio-msg is the same as in
> PCI and MMIO, shared memory and virtqs. While virtio-msg does support
> notifications in the message queue it does not preclude direct IRQ
> signalling or indeed switch to pure polling which is what most of the
> high speed networking solutions end up doing to avoid the latency of
> IRQs.

Are shared memory and direct IRQ signalling an option for virtio over
admin virtqueues?
-- 
Sincerely,
Demi Marie Obenour (she/her/hers)

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 7253 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

      reply	other threads:[~2026-06-11  3:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <11771164-7919-43e1-a980-03f036bdae2e@gmail.com>
     [not found] ` <SJ0PR12MB6806C5A16CB0899E095E835EDC092@SJ0PR12MB6806.namprd12.prod.outlook.com>
     [not found]   ` <CAAjaMXYGMTok_a2CJK8aKSqbTbgLx1CbkCVZw2VnZdJVuPJ38w@mail.gmail.com>
2026-05-28  6:59     ` Vhost-guest (was virtio vhost-user) vs virtio-msg Demi Marie Obenour
2026-05-28  8:56       ` Alyssa Ross
2026-05-28 13:52         ` Stefan Hajnoczi
2026-05-28 16:13       ` Alex Bennée
2026-06-11  3:31         ` demiobenour [this message]

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=d0d53bd1-f9ae-4f43-8f64-c0aa04075f0e@gmail.com \
    --to=demiobenour@gmail.com \
    --cc=alex.bennee@linaro.org \
    --cc=bill.mills@linaro.org \
    --cc=devel@spectrum-os.org \
    --cc=edgar.iglesias@amd.com \
    --cc=hi@alyssa.is \
    --cc=manos.pitsidianakis@linaro.org \
    --cc=parav@nvidia.com \
    --cc=stefanha@redhat.com \
    --cc=sumit.semwal@linaro.org \
    --cc=viresh.kumar@linaro.org \
    --cc=virtio-comment@lists.linux.dev \
    /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.
Code repositories for project(s) associated with this public inbox

	https://spectrum-os.org/git/crosvm
	https://spectrum-os.org/git/doc
	https://spectrum-os.org/git/mktuntap
	https://spectrum-os.org/git/nixpkgs
	https://spectrum-os.org/git/spectrum
	https://spectrum-os.org/git/ucspi-vsock
	https://spectrum-os.org/git/www

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).