All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: Marcel Apfelbaum <marcel.a@redhat.com>
Cc: peter.maydell@linaro.org, Zhu Guihua <zhugh.fnst@cn.fujitsu.com>,
	qemu-devel@nongnu.org, Luiz Capitulino <lcapitulino@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] hmp: fix regression of HMP device_del auto-completion
Date: Thu, 27 Nov 2014 13:38:01 +0100	[thread overview]
Message-ID: <20141127133801.7ef83a1e@nial.usersys.redhat.com> (raw)
In-Reply-To: <1417088467.2807.29.camel@localhost.localdomain>

On Thu, 27 Nov 2014 13:41:07 +0200
Marcel Apfelbaum <marcel.a@redhat.com> wrote:

> On Thu, 2014-11-27 at 19:35 +0800, Zhu Guihua wrote:
> > On Thu, 2014-11-27 at 13:11 +0200, Marcel Apfelbaum wrote:
> > > On Wed, 2014-11-26 at 13:05 -0500, Luiz Capitulino wrote:
> > > > On Wed, 26 Nov 2014 13:50:01 +0200
> > > > Marcel Apfelbaum <marcel.a@redhat.com> wrote:
> > > > 
> > > > > The commits:
> > > > >  - 6a1fa9f5 (monitor: add del completion for peripheral device)
> > > > >  - 66e56b13 (qdev: add qdev_build_hotpluggable_device_list helper)
> > > > > 
> > > > > cause a QEMU crash when trying to use HMP device_del auto-completion.
> > > > > It can be easily reproduced by:
> > > > >     <qemu-bin> -enable-kvm  ~/images/fedora.qcow2 -monitor stdio -device virtio-net-pci,id=vnet
> > > > > 
> > > > >     (qemu) device_del
> > > > >     /home/mapfelba/git/upstream/qemu/hw/core/qdev.c:941:qdev_build_hotpluggable_device_list: Object 0x7f6ce04e4fe0 is not an instance of type device
> > > > >     Aborted (core dumped)
> > > > > 
> > > > > The root cause is qdev_build_hotpluggable_device_list going recursively over
> > > > > all peripherals and their children assuming all are devices. It doesn't work
> > > > > since PCI devices have at least on child which is a memory region (bus master).
> > > > > 
> > > > > Solved by observing that all devices appear as direct children of
> > > > > /machine/peripheral container. No need of going recursively
> > > > > over all the children.
> > > > > 
> > > > > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > > > 
> > > > Peter, can you apply this patch directly to master to avoid me a pull
> > > > request? Maybe it's a good idea to wait until tomorrow for more
> > > > reviewers though.
> > > Speaking of reviewers, I double checked the patch and indeed it solves
> > > the crash, but the original patch has another semantic error.
> > > It looks for hot-pluggable device and not *hot-plugged* ones.
> > > 
> > > I'll try to come with a solution fast. It should be a "hot-plugged" property somewhere...
> > > 
> > Hi Marcel,
> > 
> > May you give an example for a hot-plugged but non-hot-pluggable device?
> I was talking about something different:
> A hot-pluggable device that was not hot-plugged is assumed to be hot-unpluggable.
That's applicable to most of devices.

> This is not true for pci-2-pci device.
Do you have a reproducer?

> 
> But this is another issue and can wait for 2.3.
> So you patch was *almost* correct for looking hotpluggable devices,
> the only problem we have is with pci-2-pci bridge (, and maybe with others that I don't know).
> 
> But for now, we should get the crash fix in and handle that separately
> for 2.3. If anybody has a better idea, pleas advice.
> 
> Thanks,
> Marcel
> 
> 
>  
> 
> > 
> > Regards,
> > Zhu
> > 
> > > Thanks,
> > > Marcel
> > > 
> > > 
> > > > 
> > > > Marcel, thanks a lot for taking care of this!
> > > > 
> > > > > ---
> > > > >  hw/core/qdev.c         | 12 ++++++++++--
> > > > >  include/hw/qdev-core.h |  2 +-
> > > > >  monitor.c              | 11 ++++-------
> > > > >  3 files changed, 15 insertions(+), 10 deletions(-)
> > > > > 
> > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > index 413b413..35fd00d 100644
> > > > > --- a/hw/core/qdev.c
> > > > > +++ b/hw/core/qdev.c
> > > > > @@ -935,7 +935,7 @@ void qdev_alias_all_properties(DeviceState *target, Object *source)
> > > > >      } while (class != object_class_by_name(TYPE_DEVICE));
> > > > >  }
> > > > >  
> > > > > -int qdev_build_hotpluggable_device_list(Object *obj, void *opaque)
> > > > > +static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
> > > > >  {
> > > > >      GSList **list = opaque;
> > > > >      DeviceState *dev = DEVICE(obj);
> > > > > @@ -944,10 +944,18 @@ int qdev_build_hotpluggable_device_list(Object *obj, void *opaque)
> > > > >          *list = g_slist_append(*list, dev);
> > > > >      }
> > > > >  
> > > > > -    object_child_foreach(obj, qdev_build_hotpluggable_device_list, opaque);
> > > > >      return 0;
> > > > >  }
> > > > >  
> > > > > +GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
> > > > > +{
> > > > > +    GSList *list = NULL;
> > > > > +
> > > > > +    object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list);
> > > > > +
> > > > > +    return list;
> > > > > +}
> > > > > +
> > > > >  static bool device_get_realized(Object *obj, Error **errp)
> > > > >  {
> > > > >      DeviceState *dev = DEVICE(obj);
> > > > > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> > > > > index d3a2940..589bbe7 100644
> > > > > --- a/include/hw/qdev-core.h
> > > > > +++ b/include/hw/qdev-core.h
> > > > > @@ -365,7 +365,7 @@ extern int qdev_hotplug;
> > > > >  
> > > > >  char *qdev_get_dev_path(DeviceState *dev);
> > > > >  
> > > > > -int qdev_build_hotpluggable_device_list(Object *obj, void *opaque);
> > > > > +GSList *qdev_build_hotpluggable_device_list(Object *peripheral);
> > > > >  
> > > > >  void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler,
> > > > >                                Error **errp);
> > > > > diff --git a/monitor.c b/monitor.c
> > > > > index fa00594..f1031a1 100644
> > > > > --- a/monitor.c
> > > > > +++ b/monitor.c
> > > > > @@ -4321,17 +4321,14 @@ void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
> > > > >  static void peripheral_device_del_completion(ReadLineState *rs,
> > > > >                                               const char *str, size_t len)
> > > > >  {
> > > > > -    Object *peripheral;
> > > > > -    GSList *list = NULL, *item;
> > > > > +    Object *peripheral = container_get(qdev_get_machine(), "/peripheral");
> > > > > +    GSList *list, *item;
> > > > >  
> > > > > -    peripheral = object_resolve_path("/machine/peripheral/", NULL);
> > > > > -    if (peripheral == NULL) {
> > > > > +    list = qdev_build_hotpluggable_device_list(peripheral);
> > > > > +    if (!list) {
> > > > >          return;
> > > > >      }
> > > > >  
> > > > > -    object_child_foreach(peripheral, qdev_build_hotpluggable_device_list,
> > > > > -                         &list);
> > > > > -
> > > > >      for (item = list; item; item = g_slist_next(item)) {
> > > > >          DeviceState *dev = item->data;
> > > > >  
> > > > 
> > > > 
> > > 
> > > 
> > > 
> > 
> > 
> 
> 
> 

  parent reply	other threads:[~2014-11-27 12:38 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-26 11:50 [Qemu-devel] [PATCH] hmp: fix regression of HMP device_del auto-completion Marcel Apfelbaum
2014-11-26 12:21 ` Igor Mammedov
2014-11-26 18:05 ` Luiz Capitulino
2014-11-26 19:09   ` Peter Maydell
2014-11-26 19:32   ` Marcel Apfelbaum
2014-11-27 11:11   ` Marcel Apfelbaum
2014-11-27 11:26     ` Marcel Apfelbaum
2014-11-27 11:35     ` Zhu Guihua
2014-11-27 11:41       ` Marcel Apfelbaum
2014-11-27 12:08         ` Zhu Guihua
2014-11-27 12:15           ` Marcel Apfelbaum
2014-11-28  1:23             ` Zhu Guihua
2014-11-27 12:38         ` Igor Mammedov [this message]
2014-11-27 13:48           ` Marcel Apfelbaum
2014-11-28  1:50             ` Zhu Guihua
2014-11-28  5:53               ` Marcel Apfelbaum
2014-11-28 14:33                 ` Igor Mammedov
2014-11-27 14:04         ` Luiz Capitulino
2014-11-27 14:13         ` Peter Maydell
2014-11-27 14:49           ` Marcel Apfelbaum
2014-11-27 15:53 ` Peter Maydell

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=20141127133801.7ef83a1e@nial.usersys.redhat.com \
    --to=imammedo@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=marcel.a@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=zhugh.fnst@cn.fujitsu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.