From: Laurent Vivier <lvivier@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: Damien Hedde <damien.hedde@greensocs.com>,
pkrempa@redhat.com, berrange@redhat.com, ehabkost@redhat.com,
qemu-block@nongnu.org, quintela@redhat.com,
libvir-list@redhat.com, mst@redhat.com, qemu-devel@nongnu.org,
armbru@redhat.com, its@irrelevant.dk, pbonzini@redhat.com,
jfreimann@redhat.com
Subject: Re: [PATCH 09/11] qdev: Avoid QemuOpts in QMP device_add
Date: Wed, 6 Oct 2021 13:09:46 +0200 [thread overview]
Message-ID: <30ccf623-44a7-bcb4-77c9-f1d2e5e16c6c@redhat.com> (raw)
In-Reply-To: <YV2AOX6NSGwy1pDO@redhat.com>
On 06/10/2021 12:53, Kevin Wolf wrote:
> Am 06.10.2021 um 11:20 hat Laurent Vivier geschrieben:
>> On 06/10/2021 10:21, Juan Quintela wrote:
>>> Kevin Wolf <kwolf@redhat.com> wrote:
>>>> Am 05.10.2021 um 17:52 hat Damien Hedde geschrieben:
>>>
>>> Hi
>>>
>>>>>> Usage
>>>>>> -----
>>>>>>
>>>>>> The primary device can be hotplugged or be part of the startup
>>>>>> configuration
>>>>>>
>>>>>> -device virtio-net-pci,netdev=hostnet1,id=net1,
>>>>>> mac=52:54:00:6f:55:cc,bus=root2,failover=on
>>>>>>
>>>>>> With the parameter failover=on the VIRTIO_NET_F_STANDBY feature
>>>>>> will be enabled.
>>>>>>
>>>>>> -device vfio-pci,host=5e:00.2,id=hostdev0,bus=root1,
>>>>>> failover_pair_id=net1
>>>>>>
>>>>>> failover_pair_id references the id of the virtio-net standby device.
>>>>>> This is only for pairing the devices within QEMU. The guest kernel
>>>>>> module net_failover will match devices with identical MAC addresses.
>>>>>>
>>>>>> Hotplug
>>>>>> -------
>>>>>>
>>>>>> Both primary and standby device can be hotplugged via the QEMU
>>>>>> monitor. Note that if the virtio-net device is plugged first a
>>>>>> warning will be issued that it couldn't find the primary device.
>>>>>
>>>>> So maybe this whole primary device lookup can happen during the -device CLI
>>>>> option creation loop. And we can indeed have un-created devices still in the
>>>>> list ?
>>>>
>>>> Yes, that's the only case for which I could imagine for an inconsistency
>>>> between the qdev tree and QemuOpts, but failover_add_primary() is only
>>>> called after feature negotiation with the guest driver, so we can be
>>>> sure that the -device loop has completed long ago.
>>>>
>>>> And even if it hadn't completed yet, the paragraph also says that even
>>>> hotplugging the device later is supported, so creating devices in the
>>>> wrong order should still succeed.
>>>>
>>>> I hope that some of the people I added to CC have some more hints.
>>>
>>> Failover is ... interesting.
>>>
>>> You have two devices: primary and seconday.
>>> seconday is virtio-net, primary can be vfio and some other emulated
>>> devices.
>>>
>>> In the command line, devices can appear on any order, primary then
>>> secondary, secondary then primary, or only one of them.
>>> You can add (any of them) later in the toplevel.
>>>
>>> And now, what all this mess is about. We only enable the primary if the
>>> guest knows about failover. Otherwise we use only the virtio device
>>> (*). The important bit here is that we need to wait until the guest is
>>> booted, and the virtio-net driver is loaded, and then it tells us if it
>>> understands failover (or not). At that point we decide if we want to
>>> "really" create the primary.
>>>
>>> I know that it abuses device_add() as much as it can be, but I can't see
>>> any better way to handle it. We need to be able to "create" a device
>>> without showing it to the guest. And later, when we create a different
>>> device, and depending of driver support on the guest, we "finish" the
>>> creation of the primary device.
>>>
>>> Any good idea?
>
> Hm, the naive idea would be creating the device without attaching it to
> any bus. But I suppose qdev doesn't let you do that.
>
> Anyway, the part that I missed yesterday is that qdev_device_add()
> already skips creating the device if qdev_should_hide_device(), which
> explains how the inconsistency is created.
>
> (As an aside, it then returns NULL without setting an error to
> indicate success, which is an awkward interface, and sure enough,
> qmp_device_add() gets it wrong and deletes the QemuOpts again. So
> hotplugging the virtio-net standby device doesn't even seem to work?)
>
> Could we just save the configuration in the .hide_device callback (i.e.
> failover_hide_primary_device() in virtio-net) to a new field in
> VirtIONet and then use that when actually creating the device instead of
> accessing the command line state in the QemuOptsList?
>
> It seems that we can currently add two primary devices that are then
> both hidden. failover_add_primary() adds only one of them, leaving the
> other one hidden. Is this a bug and we should reject such a
> configuration or do we need to support keeping configurations for
> multiple primary devices in a single standby device?
>
> This would still be ugly because the configuration is only really
> validated when the primary device is actually added instead of
> immediately on -device/device_add, but at least it would keep the
> ugliness more local and wouldn't block the move away from QemuOpts (the
> config would just be stored as a QDict after my patches).
>
>> I don't know if it can help the discussion, but I'm reformatting the
>> failover code to move all the PCI stuff to pci files.
>>
>> And there is a lot of inconsistencies regarding the device_add and --device
>> option so I've been in the end to add a list of of hidden devices rather
>> than relying on the command line.
>>
>> See PATCH 8 of series "[RFC PATCH v2 0/8] virtio-net failover cleanup and new features"
>>
>> https://patchew.org/QEMU/20210820142002.152994-1-lvivier@redhat.com/
>
> While it's certainly an improvement over the current state, we really
> should move away from QemuOpts and I think using global state for this
I totally agree with that.
> is wrong anyway. So it feels like it's not the change we need here, but
> more a step sideways.
Yes, I wanted to fix the problem without modifying to much the existing code.
> But thanks for mentioning this series here, we might get some merge
> conflicts there. I'll try to remember to CC you for v2 of this series.
Thank you. I'll try to find a better solution based on your series.
Laurent
next prev parent reply other threads:[~2021-10-06 11:26 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-24 9:04 [PATCH 00/11] qdev: Add JSON -device and fix QMP device_add Kevin Wolf
2021-09-24 9:04 ` [PATCH 01/11] qom: Reduce use of error_propagate() Kevin Wolf
2021-09-24 13:23 ` Vladimir Sementsov-Ogievskiy
2021-09-24 14:04 ` Markus Armbruster
2021-09-24 18:14 ` Eric Blake
2021-09-24 9:04 ` [PATCH 02/11] iotests/245: Fix type for iothread property Kevin Wolf
2021-09-24 13:33 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 03/11] iotests/051: Fix typo Kevin Wolf
2021-09-24 13:35 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 04/11] qdev: Avoid using string visitor for properties Kevin Wolf
2021-09-24 18:40 ` Eric Blake
2021-09-24 9:04 ` [PATCH 05/11] qdev: Make DeviceState.id independent of QemuOpts Kevin Wolf
2021-09-24 14:02 ` Vladimir Sementsov-Ogievskiy
2021-09-24 15:10 ` Kevin Wolf
2021-09-24 15:14 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 06/11] qdev: Add Error parameter to qdev_set_id() Kevin Wolf
2021-09-24 14:09 ` Vladimir Sementsov-Ogievskiy
2021-09-27 10:33 ` Damien Hedde
2021-10-05 11:09 ` Kevin Wolf
2021-09-24 9:04 ` [PATCH 07/11] qemu-option: Allow deleting opts during qemu_opts_foreach() Kevin Wolf
2021-09-24 14:14 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 08/11] qdev: Base object creation on QDict rather than QemuOpts Kevin Wolf
2021-09-24 18:53 ` Eric Blake
2021-09-24 9:04 ` [PATCH 09/11] qdev: Avoid QemuOpts in QMP device_add Kevin Wolf
2021-09-24 18:56 ` Eric Blake
2021-09-27 11:06 ` Damien Hedde
2021-09-27 11:39 ` Kevin Wolf
2021-10-05 14:37 ` Kevin Wolf
2021-10-05 15:52 ` Damien Hedde
2021-10-05 17:33 ` Kevin Wolf
2021-10-06 8:21 ` Juan Quintela
2021-10-06 9:20 ` Laurent Vivier
2021-10-06 10:53 ` Kevin Wolf
2021-10-06 11:09 ` Laurent Vivier [this message]
2021-10-01 14:42 ` Peter Krempa
2021-10-04 12:18 ` Damien Hedde
2021-10-04 14:22 ` Kevin Wolf
2021-09-24 9:04 ` [PATCH 10/11] vl: Enable JSON syntax for -device Kevin Wolf
2021-09-24 19:00 ` Eric Blake
2021-09-24 9:04 ` [PATCH 11/11] Deprecate stable non-JSON -device and -object Kevin Wolf
2021-09-24 19:02 ` Eric Blake
2021-09-27 8:15 ` Paolo Bonzini
2021-09-27 8:21 ` Daniel P. Berrangé
2021-09-27 10:17 ` Kevin Wolf
2021-09-27 10:37 ` Daniel P. Berrangé
2021-09-27 9:00 ` Peter Maydell
2021-09-27 11:27 ` Kevin Wolf
2021-09-27 12:52 ` Peter Maydell
2021-09-27 16:10 ` Kevin Wolf
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=30ccf623-44a7-bcb4-77c9-f1d2e5e16c6c@redhat.com \
--to=lvivier@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=damien.hedde@greensocs.com \
--cc=ehabkost@redhat.com \
--cc=its@irrelevant.dk \
--cc=jfreimann@redhat.com \
--cc=kwolf@redhat.com \
--cc=libvir-list@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=pkrempa@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/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;
as well as URLs for NNTP newsgroup(s).