From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Andreas Färber" <afaerber@suse.de>
Cc: pbonzini@redhat.com, jbaron@redhat.com, qemu-devel@nongnu.org,
Anthony Liguori <anthony@codemonkey.ws>,
Alexander Graf <agraf@suse.de>
Subject: Re: [Qemu-devel] [PATCH v3 14/14] pci: Tidy up PCI host bridges
Date: Thu, 5 Jul 2012 18:23:37 +0300 [thread overview]
Message-ID: <20120705152337.GC31257@redhat.com> (raw)
In-Reply-To: <4FF5ABF0.9070004@suse.de>
On Thu, Jul 05, 2012 at 05:00:00PM +0200, Andreas Färber wrote:
> (Dropping some borked CCs)
>
> Am 05.07.2012 16:15, schrieb Michael S. Tsirkin:
> > On Thu, Jul 05, 2012 at 08:54:21AM -0500, Anthony Liguori wrote:
> >> On 07/05/2012 08:34 AM, Michael S. Tsirkin wrote:
> >>> On Thu, Jul 05, 2012 at 12:34:20AM +0200, Andreas Färber wrote:
> >>>> Am 04.07.2012 23:26, schrieb Michael S. Tsirkin:
> >>>>> On Thu, Jul 05, 2012 at 12:17:17AM +0300, Michael S. Tsirkin wrote:
> >>>>>> On Wed, Jul 04, 2012 at 07:19:33PM +0200, Andreas Färber wrote:
> >>>>>>> Uglify the parent field to enforce QOM-style access via casts.
> >>>>>>> Don't just typedef PCIHostState, either use it directly or embed it.
> >>>>>>>
> >>>>>>> Signed-off-by: Andreas Färber<afaerber@suse.de>
> >>>>>>> ---
> >>>>>>> hw/alpha_typhoon.c | 4 ++--
> >>>>>>> hw/dec_pci.c | 2 +-
> >>>>>>> hw/grackle_pci.c | 2 +-
> >>>>>>> hw/gt64xxx.c | 26 ++++++++++++++++----------
> >>>>>>> hw/piix_pci.c | 6 ++++--
> >>>>>>> hw/ppc4xx_pci.c | 8 +++++---
> >>>>>>> hw/ppce500_pci.c | 2 +-
> >>>>>>> hw/prep_pci.c | 8 +++++---
> >>>>>>> hw/spapr_pci.c | 12 +++++++-----
> >>>>>>> hw/spapr_pci.h | 2 +-
> >>>>>>> hw/unin_pci.c | 14 +++++++-------
> >>>>>>> 11 files changed, 50 insertions(+), 36 deletions(-)
> >>>>>>>
> >>>>>>> diff --git a/hw/alpha_typhoon.c b/hw/alpha_typhoon.c
> >>>>>>> index 58025a3..955d628 100644
> >>>>>>> --- a/hw/alpha_typhoon.c
> >>>>>>> +++ b/hw/alpha_typhoon.c
> >>>>>>> @@ -46,7 +46,7 @@ typedef struct TyphoonPchip {
> >>>>>>> OBJECT_CHECK(TyphoonState, (obj), TYPE_TYPHOON_PCI_HOST_BRIDGE)
> >>>>>>>
> >>>>>>> typedef struct TyphoonState {
> >>>>>>> - PCIHostState host;
> >>>>>>> + PCIHostState parent_obj;
> >>>>>>>
> >>>>>>> TyphoonCchip cchip;
> >>>>>>> TyphoonPchip pchip;
> >>>>>>> @@ -770,7 +770,7 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
> >>>>>>> b = pci_register_bus(dev, "pci",
> >>>>>>> typhoon_set_irq, sys_map_irq, s,
> >>>>>>> &s->pchip.reg_mem, addr_space_io, 0, 64);
> >>>>>>> - s->host.bus = b;
> >>>>>>> + PCI_HOST_BRIDGE(s)->bus = b;
> >>>>>>>
> >>>>>>> /* Pchip0 PCI special/interrupt acknowledge, 0x801.F800.0000, 64MB. */
> >>>>>>> memory_region_init_io(&s->pchip.reg_iack,&alpha_pci_iack_ops, b,
> >>>>>>
> >>>>>> Sorry I don't understand.
> >>>>>> why are we making code ugly apparently intentionally?
> >>>>>
> >>>>> Just to clarify: replacing upcasts which are always safe
> >>>>> with downcasts which can fail is what I consider especially ugly.
> >>>>
> >>>> As per Anthony the parent field in the QOM instance structs is not
> >>>> supposed to be touched (cf. object.h). We mark it /*< private>*/ so
> >>>> that it doesn't even show up in gtk-doc documentation.
> >>>
> >>> PCIHostState is not private here. And if it were, it won't be
> >>> of any use because compiler does not read gtk-doc documentation
> >>> and neither do developers.
> >>>
> >>>> If it is unused,
> >>>> its name becomes irrelevant and could even be "reserved" if we so
> >>>> wanted. Renaming it to whatever proves that all old references are gone.
> >>>
> >>> Adding arbitrary rules like that only seems to make code future proof.
> >>> People will not remember and will use the field anyway,
> >>> then when you try to change it there will be work to be done.
> >>> So let's do the work when we really need it.
> >>>
> >>>> Background is that qdev and QOM work differently with regards to
> >>>> inheritance: as mentioned in the preceding patch, for qdev the parent
> >>>> was (had to be) identified by name and could be anywhere in the struct;
> >>>> for QOM the parent is a subset of the struct from the start and it's
> >>>> supposed to be accessed through the struct type that provides the
> >>>> fields, the usual way to get such a pointer is through
> >>>> OBJECT_CHECK()-derived cast macros.
> >>>
> >>> It makes sense if you go from parent to child. Even in C++
> >>> you don't use dynamic_cast to go from child to parent.
> >>
> >> But you use static cast. Casting is not the same thing as
> >> dereferencing a member. IOW:
> >>
> >> Foo *foo = (Foo *)bar;
> >>
> >> Is very different than:
> >>
> >> Foo *foo = &bar.foo;
> >>
> >> Using cast macros makes the code an awful lot more readable because
> >> it tells the reader more.
> >>
> >> Foo *foo = FOO(bar);
> >>
> >> Tells the user that we're casting bar to the a type Foo. OTOH:
> >>
> >> Foo *foo = &bar.foo;
> >>
> >> Doesn't tell the user anything. A FOO() macro is consistent
> >> regardless of how the type is implemented too. It gets even worse
> >> when you are going up multiple levels:
> >>
> >> DeviceState *dev = &bar.host.qdev;
> >>
> >> Is unintelligible whereas:
> >>
> >> DeviceState *dev = DEVICE(bar);
> >>
> >> Tells you exactly what's happening.
> >>
> >> But really, this isn't the place to debate this. QOM has been
> >> around for a while. Consistency is important and this is how things
> >> are done in QOM.
> >
> > It's important but not the most important thing.
> > It does not make sense to do casts *everywhere*.
> > Do it where it makes sense.
> >
> >> If you want to revisit this style, you should start a separate
> >> thread about it and we can talk about it. But this patch is
> >> consistent with the current infrastructure.
> >>
> >> Regards,
> >>
> >> Anthony Liguori
> >
> > So far QOM was a win.
> > You examples look better with a macro. Patch 13 looks better:
> > - PCIHostState *phb = FROM_SYSBUS(PCIHostState, SYS_BUS_DEVICE(s->pcihost));
> > + PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost);
> > this is an improvement: devices do not want to deal with sysbus.
> >
> > The code above that is being changed looks better without.
>
> Do you want me to apologize for my macro misuse now? I apologize. :)
> Replace PCI_HOST_BRIDGE(s)->bus = b; with
> PCI_HOST_BRIDGE *phb = PCI_HOST_BRIDGE(s);
> phb->bus = b;
> in your mind and it matches exactly what you liked better above, no?
No, what I liked above is that we hide sysbus from devices.
> > This is why this thread is about the specific patch and not
> > general QOM.
>
> You're basically saying, QOM was a win but don't use it here. That's a
> contradiction and thus a general QOM issue since that paradigm not only
> applies here: Either we need to design all structs so that their fields
> have nice names to access directly as you suggest, or nobody must access
> the parent field as Anthony suggests. Having a wild mix of both at
> maintainers' gusto is not a good solution.
With time we'll end up with a mix anyway since compiler does not enforce
no direct access.
> Arguably we can just leave out this last patch if it is so
> controversial. However, the split is arbitrary since I backwards-coded
> this series, moving code snippets to earlier individual patches using
> checkout -p, i.e. patches 1-11 have this final code design in mind and
> thus went from SYS_BUS_DEVICE() to PCIHostState above rather than
> through parent_obj. The reason I couldn't do it there directly is that
> we didn't have the PCI_HOST_BRIDGE() macro before patch 13.
> I also based patch 14 on the assumption that i440fx will get more state
> fields when Anthony goes ahead with his QOM Pin series, otherwise we
> could just scratch the I440FXState typedef (same discussion as for the
> qtest herbivore test case).
>
> Andreas
The real problem is that devices have to tweak pcihost->bus and that
is because we don't model has-a relationship between pci host bridge and
bus well: pci host bridge has a pci bus. As long as that remains true
it seems to me the more explicit it is the better, so it's easier to
fix.
> --
> SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
> GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
>
prev parent reply other threads:[~2012-07-05 15:23 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-04 17:19 [Qemu-devel] [PATCH v3 00/14] pci_host: Convert to QOM Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 01/14] pci: Make host bridge TypeInfos const Andreas Färber
2012-07-04 21:20 ` Michael S. Tsirkin
2012-07-04 22:51 ` Andreas Färber
2012-07-05 15:25 ` Michael S. Tsirkin
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 02/14] alpha_typhoon: QOM'ify Typhoon PCI host bridge Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 03/14] bonito: QOM'ify Bonito " Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 04/14] dec_pci: QOM'ify DEC 21154 PCI-PCI bridge Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 05/14] grackle_pci: QOM'ify Grackle PCI host bridge Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 06/14] gt64xxx: QOM'ify GT64120 " Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 07/14] ppc4xx_pci: QOM'ify ppc4xx " Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 08/14] ppce500_pci: QOM'ify e500 " Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 09/14] prep_pci: QOM'ify Raven " Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 10/14] spapr_pci: QOM'ify sPAPR " Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 11/14] unin_pci: QOM'ify UniNorth PCI host bridges Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 12/14] pci_host: Turn into SysBus-derived QOM type Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 13/14] pci: Derive PCI host bridges from TYPE_PCI_HOST_BRIDGE Andreas Färber
2012-07-04 17:19 ` [Qemu-devel] [PATCH v3 14/14] pci: Tidy up PCI host bridges Andreas Färber
2012-07-04 21:17 ` Michael S. Tsirkin
2012-07-04 21:26 ` Michael S. Tsirkin
2012-07-04 21:38 ` Anthony Liguori
2012-07-05 8:59 ` Michael S. Tsirkin
2012-07-05 9:51 ` Paolo Bonzini
[not found] ` <4FF4C4EC.2090404@suse.de>
2012-07-05 9:53 ` Paolo Bonzini
2012-07-05 10:15 ` Andreas Färber
2012-07-05 10:36 ` Paolo Bonzini
2012-07-05 13:21 ` Michael S. Tsirkin
2012-07-05 13:34 ` Michael S. Tsirkin
2012-07-05 13:42 ` Andreas Färber
2012-07-05 13:54 ` Anthony Liguori
2012-07-05 14:15 ` Michael S. Tsirkin
2012-07-05 15:00 ` Andreas Färber
2012-07-05 15:23 ` 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=20120705152337.GC31257@redhat.com \
--to=mst@redhat.com \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=anthony@codemonkey.ws \
--cc=jbaron@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).