From: "Michael S. Tsirkin" <mst@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: "Akihiko Odaki" <akihiko.odaki@daynix.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Alex Williamson" <alex.williamson@redhat.com>,
"Cédric Le Goater" <clg@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Sriram Yagnaraman" <sriram.yagnaraman@ericsson.com>,
"Jason Wang" <jasowang@redhat.com>,
"Keith Busch" <kbusch@kernel.org>,
"Klaus Jensen" <its@irrelevant.dk>,
qemu-devel@nongnu.org, qemu-block@nongnu.org
Subject: Re: [PATCH v2 0/4] hw/pci: Convert rom_bar into OnOffAuto
Date: Thu, 1 Aug 2024 08:22:08 -0400 [thread overview]
Message-ID: <20240801080453-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <87h6c4fqz6.fsf@pond.sub.org>
On Thu, Aug 01, 2024 at 12:59:57PM +0200, Markus Armbruster wrote:
> Akihiko Odaki <akihiko.odaki@daynix.com> writes:
>
> > On 2024/07/31 17:32, Markus Armbruster wrote:
> >> Akihiko Odaki <akihiko.odaki@daynix.com> writes:
> >>
> >>> rom_bar is tristate but was defined as uint32_t so convert it into
> >>> OnOffAuto to clarify that. For compatibility, a uint32 value set via
> >>> QOM will be converted into OnOffAuto.
> >>>
> >>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> >>
> >> I agree making property "rombar" an integer was a design mistake. I
> >> further agree that vfio_pci_size_rom() peeking into dev->opts to
> >> distinguish "user didn't set a value" from "user set the default value")
> >> is an unadvisable hack.
> >>
> >> However, ...
> >>
> >>> ---
> >>> Changes in v2:
> >>> - Documented in docs/about/deprecated.rst (Daniel P. Berrangé)
> >>> - Link to v1: https://lore.kernel.org/r/20240706-rombar-v1-0-802daef2aec1@daynix.com
> >>>
> >>> ---
> >>> Akihiko Odaki (4):
> >>> qapi: Add visit_type_str_preserving()
> >>> qapi: Do not consume a value when visit_type_enum() fails
> >>> hw/pci: Convert rom_bar into OnOffAuto
> >>> hw/qdev: Remove opts member
> >>>
> >>> docs/about/deprecated.rst | 7 +++++
> >>> docs/igd-assign.txt | 2 +-
> >>> include/hw/pci/pci_device.h | 2 +-
> >>> include/hw/qdev-core.h | 4 ---
> >>> include/qapi/visitor-impl.h | 3 ++-
> >>> include/qapi/visitor.h | 25 +++++++++++++----
> >>> hw/core/qdev.c | 1 -
> >>> hw/pci/pci.c | 57 +++++++++++++++++++++++++++++++++++++--
> >>> hw/vfio/pci-quirks.c | 2 +-
> >>> hw/vfio/pci.c | 11 ++++----
> >>> hw/xen/xen_pt_load_rom.c | 4 +--
> >>> qapi/opts-visitor.c | 12 ++++-----
> >>> qapi/qapi-clone-visitor.c | 2 +-
> >>> qapi/qapi-dealloc-visitor.c | 4 +--
> >>> qapi/qapi-forward-visitor.c | 4 ++-
> >>> qapi/qapi-visit-core.c | 21 ++++++++++++---
> >>> qapi/qobject-input-visitor.c | 23 ++++++++--------
> >>> qapi/qobject-output-visitor.c | 2 +-
> >>> qapi/string-input-visitor.c | 2 +-
> >>> qapi/string-output-visitor.c | 2 +-
> >>> system/qdev-monitor.c | 12 +++++----
> >>> tests/qtest/virtio-net-failover.c | 32 +++++++++++-----------
> >>> 22 files changed, 161 insertions(+), 73 deletions(-)
> >>> ---
> >>> base-commit: f2cb4026fccfe073f84a4b440e41d3ed0c3134f6
> >>> change-id: 20240704-rombar-1a4ba2890d6c
> >>>
> >>> Best regards,
> >>
> >> ... this is an awful lot of QAPI visitor infrastructure. Infrastructure
> >> that will likely only ever be used for this one property.
> >>
> >> Moreover, the property setter rom_bar_set() is a hack: it first tries to
> >> parse the value as enum, and if that fails, as uint32_t. QAPI already
> >> provides a way to express "either this type or that type": alternate.
> >> Like this:
> >>
> >> { 'alternate': 'OnOffAutoUint32',
> >> 'data': { 'sym': 'OnOffAuto',
> >> 'uint': 'uint32' } }
> >>
> >> Unfortunately, such alternates don't work on the command line due to
> >> keyval visitor restrictions. These cannot be lifted entirely, but we
> >> might be able to lift them sufficiently to make this alternate work.
> >
> > The keyval visitor cannot implement alternates because the command line
> > input does not have type information. For example, you cannot
> > distinguish string "0" and integer 0.
>
> Correct.
>
> For alternate types, an input visitor picks the branch based on the
> QType.
>
> With JSON, we have scalar types null, number, string, and bool.
>
> With keyval, we only have string. Alternates with more than one scalar
> branch don't work.
>
> They could be made to work to some degree, though. Observe:
>
> * Any value can be a string.
>
> * "frob" can be nothing else.
>
> * "on" and "off" can also be bool.
>
> * "123" and "1e3" can also be number or enum.
>
> Instead of picking the branch based on the QType, we could pick based on
> QType and value, where the value part is delegated to a visitor method.
>
> This is also new infrastructure. But it's more generally useful
> infrastructure.
>
> >> Whether it would be worth your trouble and mine just to clean up
> >> "rombar" seems highly dubious, though.
> >
> > rom_bar_set() and and underlying visit_type_str_preserving() are ugly,
> > but we can remove them once the deprecation period ends. On the other
> > hand, if we don't make this change, dev->opts will keep floating around,
> > and we will even have another use of it for "[PATCH v5 1/8] hw/pci: Do
> > not add ROM BAR for SR-IOV VF"[1]. Eventually, having this refactoring
> > early will result in less mess in the future.
> >
> > [1]: lore.kernel.org/r/20240715-sriov-v5-1-3f5539093ffc@daynix.com
>
> Here's another idea.
>
> Property "rombar" is backed by PCIDevice member uint32_t rom_bar, and
> defaults to 1.
>
> The code uses member rom_bar as if it was a boolean: it tests
> zero/non-zero.
>
> vfio_pci_size_rom() additionally uses qdict_haskey(dev->opts, "rombar")
> to see whether "rombar" was set by the user.
>
> Taken together, "rom_bar" has three abstract states: zero,
> non-zero-default, non-zero-user. The concrete representation uses
> dev->opts in addition to member rom_bar. This is unusual.
>
> You propose to represent as OnOffAuto instead, with On for
> non-zero-user, Off for zero, Auto for non-zero-default. Fine, except
> for the compatibility headaches.
>
> OnOffAuto is not the only option for encoding these three states. We
> could also do positive, 0, negative. Like this:
>
> * Change "rombar" from unsigned to signed.
>
> * Change its default to -1.
>
> * Now 0 means off, positive means on, and negative means auto.
>
> The change to signed breaks rombar=N for 2^31<=N<2^32. Do we care?
> Only if we have reason to fear something passes such values. I doubt
> it. I'd expect only rombar=0 and rombar=1.
>
> If we do care, we could create a special kind of property that maps any
> positive value to 1.
>
> With the change, we no longer reject rombar=N for -2^31<=N<0. That's
> not a compatiblity break.
>
> Thoughts?
ack
prev parent reply other threads:[~2024-08-01 12:23 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-14 7:48 [PATCH v2 0/4] hw/pci: Convert rom_bar into OnOffAuto Akihiko Odaki
2024-07-14 7:48 ` [PATCH v2 1/4] qapi: Add visit_type_str_preserving() Akihiko Odaki
2024-07-14 7:48 ` [PATCH v2 2/4] qapi: Do not consume a value when visit_type_enum() fails Akihiko Odaki
2024-07-14 7:48 ` [PATCH v2 3/4] hw/pci: Convert rom_bar into OnOffAuto Akihiko Odaki
2024-07-14 7:48 ` [PATCH v2 4/4] hw/qdev: Remove opts member Akihiko Odaki
2024-07-31 8:32 ` [PATCH v2 0/4] hw/pci: Convert rom_bar into OnOffAuto Markus Armbruster
2024-07-31 8:40 ` Michael S. Tsirkin
2024-08-01 7:01 ` Akihiko Odaki
2024-08-01 7:52 ` Michael S. Tsirkin
2024-08-01 8:39 ` Akihiko Odaki
2024-08-01 11:05 ` Markus Armbruster
2024-08-01 10:59 ` Markus Armbruster
2024-08-01 12:22 ` Michael S. Tsirkin [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=20240801080453-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=akihiko.odaki@daynix.com \
--cc=alex.williamson@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=clg@redhat.com \
--cc=eduardo@habkost.net \
--cc=its@irrelevant.dk \
--cc=jasowang@redhat.com \
--cc=kbusch@kernel.org \
--cc=marcel.apfelbaum@gmail.com \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=sriram.yagnaraman@ericsson.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).