On Thu, Aug 01, 2024 at 12:59:57PM +0200, Markus Armbruster wrote: > Akihiko Odaki <akihiko.od...@daynix.com> writes: > > > On 2024/07/31 17:32, Markus Armbruster wrote: > >> Akihiko Odaki <akihiko.od...@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.od...@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-802daef2a...@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-3f5539093...@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