Hi,

> From: Eduardo Habkost [mailto:ehabk...@redhat.com]
> > > > Subject: Re: [Qemu-devel] [PATCH v7 24/28] ide: add bootindex to qom
> > > property
> > > >
> > > > On Fri, Sep 05, 2014 at 04:37:32PM +0800, arei.gong...@huawei.com
> wrote:
> > > > > From: Gonglei <arei.gong...@huawei.com>
> > > > >
> > > > > Add a qom property with the same name 'bootindex',
> > > > > when we remove it form qdev property, things will
> > > > > continue to work just fine, and we can use qom features
> > > > > which are not supported by qdev property.
> > > > >
> > > > > Signed-off-by: Gonglei <arei.gong...@huawei.com>
> > > > > ---
> > > > >  hw/ide/qdev.c | 14 ++++++++++++++
> > > > >  1 file changed, 14 insertions(+)
> > > > >
> > > > > diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
> > > > > index efab95b..9e2ed40 100644
> > > > > --- a/hw/ide/qdev.c
> > > > > +++ b/hw/ide/qdev.c
> > > > > @@ -191,6 +191,17 @@ static int ide_dev_initfn(IDEDevice *dev,
> > > > IDEDriveKind kind)
> > > > >      return 0;
> > > > >  }
> > > > >
> > > > > +static void ide_dev_instance_init(Object *obj)
> > > > > +{
> > > > > +    DeviceState *dev = DEVICE(obj);
> > > > > +    IDEDevice *d = DO_UPCAST(IDEDevice, qdev, dev);
> > > > > +
> > > > > +    device_add_bootindex_property(obj, &d->conf.bootindex,
> > > > > +                                  "bootindex",
> > > > > +                                  d->unit ? "/disk@1" :
> > > "/disk@0",
> > > > > +                                  &d->qdev, NULL);
> > > > > +}
> > > > > +
> > Oops, I found a thorny issue that the d->unit parameter had not been
> initialized
> > in ide_dev_instance_init(). d->unit maybe is a random value, which will
> against
> > the original purpose in this situation.
> >
> > What's your opinion, Eduardo? Thanks!
> 
> It looks like you can call add_boot_device_path() only on realize, on
> IDE. If IDE is the only case, we could just change IDE to not use
> device_add_bootindex_property(), having its own getter/setter and a call
> to add_boot_device_path() on realize().
> 
> Or, to keep the code generic, we could just make get_boot_devices_list()
> query the device for the suffix, instead of requiring the suffix to be
> set before device_add_bootindex_property() is called. With something
> like:
> 
> typedef struct BootDeviceInfo {
>     int bootindex;
>     const char *suffix;
> } BootDeviceInfo;
> 
> struct FWBootEntry {
>     QTAILQ_ENTRY(FWBootEntry) link;
>     DeviceState *dev;
>     BootDeviceInfo *bootdev;
> };
> 
> void add_boot_device_path(DeviceState *dev, BootDeviceInfo *info);
> void del_boot_device_path(BootDeviceInfo *info);
> void device_add_bootindex_property(Object *obj, const char *property,
>                                    DeviceState *dev, BootDeviceInfo
> *info,
>                                    Error **errp);
> 
> This way, the suffix can be set between device_add_bootindex_property()
> and get_boot_devices_list() if necessary:
> 
> static void somedevice_instance_init(Object *obj)
> {
>     SomeDevice *somedev = SOME_DEVICE(obj);
>     device_add_bootindex_property(obj, DEVICE(obj), &somedev->bootinfo,
> &error_abort);
> }
> 
> static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
> {
>     [...]
>     dev->bootinfo.suffix = dev->unit ? "/disk@1" : "/disk@0";
> }
> 
Thank you so much!

I agree more with #1, because only IDE device has this special case.
This is not worth add a property to DeviceState struct for a special
device IMO. 

Best regards,
-Gonglei

Reply via email to