Re: [PATCH v7] virtio-vsock: Add support for multi devices

Xuewei Niu <[email protected]>
Newsgroups dev.linux.lists.virtio-comment
Message-ID <[email protected]>
> > From: Xuewei Niu <[email protected]>
> > Sent: 19 June 2025 08:57 AM
> > 
> > Hi Parav,
> > 
> > Could you please take a look at the diagram in [1]?
> > 
> > IIUC, for VM0, there are two groups, and for VM1, there is only one group.
> > Am I right? If yes, I think the group concept is reasonable but we don't need
> > at this time.
> > 
> > I think the first thing is to figure out how to pick the right group.
> > 
> > Standard socket doesn't provide a way to access the group information.
> > 
> > Source and destination are from `bind()` and `connect()`, respectively. If we
> > don't call `bind()`, only the destination is known.
> > 
> > However, only destination is not enough to find the group. For example, the
> > well-known CIDs (e.g. 2) are valid for all groups.
> > 
> > 1:
> > https://lore.kernel.org/virtio-comment/[email protected]/
> 
> Right. Sock addressing scheme is naïve presently to select the group. Not sure when/how you or others plan to do.
> This is transport layer problem to solve (not to confuse with transport = pci/mmio etc).
> 
> However, at device level, we should have the construct of grouping.
> Without this construct, all devices will be part of single group and one will not be able to build the group concept later.
> So even if you don't need it explicitly now, grouping the device is what you need when connect() is called.
> 
> So I was imagining a relatively simple scheme:
> For example, virtio device level, some kind of group id is present.
> So two devices which has same group id, are part of single group.
> An example group id format can be a UUID.
> 
> And this is completely optional for devices to implement.
> Generic enough and usable beyond just vsock device in other use cases we discussed in past.

Fair enough.

@Stefano, could you please take a look at this? I'd love to have some input
from you.

A brief summary of the idea is: The config space will be extended to
include a group id. The devices with the same group id are considered to be
in the same group.

Thanks,
Xuewei
 
> > 
> > > > From: Xuewei Niu <[email protected]>
> > > > Sent: Monday, June 16, 2025 4:26 PM
> > > >
> > > > > > From: Xuewei Niu <[email protected]>
> > > > > > Sent: Monday, June 16, 2025 2:30 PM
> > > > > >
> > > > > > > > From: Xuewei Niu <[email protected]>
> > > > > > > > Sent: Monday, June 16, 2025 1:48 PM
> > > > > > > >
> > > > > > > > Hi, Parav.
> > > > > > > >
> > > > > > > > Thanks for your detailed comments.
> > > > > > > >
> > > > > > > > > Hi Xuewei,
> > > > > > > > >
> > > > > > > > > > From: Xuewei Niu <[email protected]>
> > > > > > > > > > Sent: Monday, May 19, 2025 3:08 PM
> > > > > > > > > >
> > > > > > > > > > > On Sat, Apr 12, 2025 at 10:28:25PM +0800, Xuewei Niu wrote:
> > > > > > > > > > > > This patch brings a new feature, called "multi
> > > > > > > > > > > > devices", to the virtio vsock. It introduces a
> > > > "VIRTIO_VSOCK_F_MULTI_DEVICES"
> > > > > > > > > > > > feature bit, and a "device_order" field to the
> > > > > > > > > > > > config for the virtio
> > > > > > vsock.
> > > > > > > > > > > >
> > > > > > > > > > > > == Motivition ==
> > > > > > > > > > > >
> > > > > > > > > > > > Vsock is a lightweight and widely used data exchange
> > > > > > > > > > > > mechanism between host and guest.
> > > > > > > > >
> > > > > > > > > Even though it is the current use, the specification does
> > > > > > > > > not prevent its usage
> > > > > > > > between two guests via a host.
> > > > > > > > > So we should not assume such guest <-> host communication
> > > > > > > > > as the only
> > > > > > > > case to add new feature.
> > > > > > > > >
> > > > > > > > > For example, in the spec only must requirement is that
> > > > > > > > > src_cid ==
> > > > > > > > config.guest_cid.
> > > > > > > > > Dst_cid can be anything, it need not be well known 0x2 (for the
> > host).
> > > > > > > >
> > > > > > > > Yes.
> > > > > > > >
> > > > > > > > > With this flexibility in the spec, one can connect vsock
> > > > > > > > > devices with multiple
> > > > > > > > different backends.
> > > > > > > > >
> > > > > > > > > For example,
> > > > > > > > > QEMU can insert one vsock device for VM to HV communication.
> > > > > > > >
> > > > > > > > It is also able to communicate with other devices on the same host,
> > i.e.
> > > > > > > > VM-to-VM.
> > > > > > > >
> > > > > > > > > A real PCI device can insert one voscket device for
> > > > > > > > > VM-to-VM
> > > > > > > > communication bypassing a full TCP/IP stack.
> > > > > > > >
> > > > > > > > AFAIK, all devices are implemented in software. Is it a real PCI HW
> > device?
> > > > > > > >
> > > > > > > Yes. virto PCI devices are implemented as hw or as vdpa for
> > > > > > > many years now by
> > > > > > cloud operators and by NIC vendors.
> > > > > >
> > > > > > Thanks for your confirmation.
> > > > > >
> > > > > > > > > This means there are two different backends.
> > > > > > > > > And these two devices should not be grouped in the use
> > > > > > > > > case you
> > > > > > described.
> > > > > > > >
> > > > > > > > I think one group is enough for all use cases. It is
> > > > > > > > required that CIDs are unique in global, i.e. all backends.
> > > > > > > >
> > > > > > > > As your example, let me assume there are two VMs
> > > > > > > >
> > > > > > > > 1. VM0 (two vsock backends)
> > > > > > > >     1.1 device0 (cid=3, default), backend is host kernel (vhost-vsock);
> > > > > > > >     1.2 device1 (cid=4), backend is HV (virtio-vsock).
> > > > > > > > 2. VM1
> > > > > > > >     2.1 device2 (cid=5, default), backend is host kernel (vhost-vsock).
> > > > > > > >
> > > > > > > > The device0 is able to do VM0-HOST (src_cid=3, dst_cid=2)
> > > > > > > > and
> > > > > > > > VM0-VM1 (src_cid=3, dst_cid=5) communicatation, while the
> > > > > > > > device1 is only able to do VM0-HV (src_cid=4, dst_cid=2)
> > > > communicatation.
> > > > > > > >
> > > > > > > In example 1.1 and 1.2 no devices are grouped.
> > > > > > > Your proposal of this patch wants to group the two devices and
> > > > > > > pick one of
> > > > > > them as default device.
> > > > > >
> > > > > > Yes. I just wonder if it is possible to have more than one groups in one
> > guest?
> > > > > >
> > > > > For example
> > > > > Group_1: two devices dev0 and dev1, implemented as PCI HW devices.
> > > > > Group_2: two devices by QEMU SW implemented as sw backend.
> > > > >
> > > > > All the 4 devices has _F bit indicating they can be grouped.
> > > > > But there is no indication that they are part of which group.
> > > > > And hence the guest VM driver is in dark on how to forward
> > > > > requests without
> > > > the bind() call.
> > > >
> > > > I see. Thanks!
> > > >
> > > > My idea is that there is only one default device, no matter how many
> > > > types of backends are. If the users intend to use other devices, `bind()` call
> > is required.
> > > >
> > > > For example, we set `dev0` as the default device:
> > > >
> > > > 1. Do not call `bind()`: use dev0;
> > > > 2. Call `bind(${dev0_cid})`: use dev1; ...
> > > > 5. Call `bind(${dev4_cid})`: use dev4;
> > > >
> > > > Even though we introduce the group concept, if we don't call
> > > > `bind()`, how does driver know which group to use? If the driver
> > > > recoginizes the dst_cid, it can use the group to find the device,
> > > > then the things will be complicated. The driver needs to know the
> > relationship between the dst_cid and the group.
> > > >
> > > Based on the dst_cid picking the right vscock group would be needed. This
> > is vsock level issue at driver level.
> > > Driver would need enough hints or encoding or of dst_cid or something
> > else.
> > >
> > > So even though we miss vsock level construct, it should be the reason to not
> > group the devices.
> > > As both attempt to solve issue at different level.
> > >
> > > > WDYT?
> > > >
> > > > Thanks,
> > > > Xuewei
> > > >
> > > > > > > If device0 and device1 are inserted to the VM0 with the
> > > > > > > feature bit you
> > > > > > suggested, the guest things that they are part of the same group.
> > > > > >
> > > > > > In this patch, we don't allow to insert devices without the
> > > > > > feature bit if there are already devices with the feature bit.
> > > > > >
> > > > > In above example of two groups, all the 4 devices spread across
> > > > > two groups has
> > > > the feature bit set.
> > > > > Yet, they cannot be grouped correctly.
> > > > > Driver driving blind thinks that all 4 devices are part of the same group.
> > > > >
> > > > > > As a result, there can be either multiple devices with the
> > > > > > feature bit or just a single device.
> > > > > >
> > > > >
> > > > > > > When bind() call is not done, host sw does not know which
> > > > > > > device to pick up
> > > > > > between device0 and device1 when binding the devices.
> > > > > >
> > > > > > Are you referring to an vsock application on the host? If yes,
> > > > > > "host sw" is able to pick up one device according to the dst
> > > > > > cid. For example, pick up
> > > > > > device0 if `connect(3)` is called.
> > > > > >
> > > > > > Please be aware that the "host sw" can not pick up device1,
> > > > > > since its device is not in the host kernel.
> > > > > >
> > > > > > > > In a word, a tuple identifies a connection.
> > > > > > > >
> > > > > > > > "Refuse to connect" will be raised if the device1 attempts
> > > > > > > > to connect to the device2. "They are not in the same group"
> > > > > > > > is a reasonable
> > > > > > explaination.
> > > > > > > > Am I right?
> > > > > > > >
> > > > > > > During bind call, one needs to select the device when the
> > > > > > > devices are coming
> > > > > > from multiple different backends.
> > > > > >
> > > > > > Yes.
> > > > > >
> > > > > > Thanks,
> > > > > > Xuewei
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.