On 04/03/2019 18:35, Tony Krowiak wrote:
On 12/17/18 10:57 AM, Tony Krowiak wrote:

Ping!! I'm wondering who might be responsible for merging this fix?

To alert the maintainers, you must send the patch with putting them or part of them in CC and put the qemu mailing list in CC too.

use get_maintainer.pl like:

$ ./scripts/get_maintainer.pl -f hw/core/qdev.c
get_maintainer.pl: No maintainers found, printing recent contributors.
get_maintainer.pl: Do not blindly cc: them on patches!  Use common sense.

Markus Armbruster <arm...@redhat.com> (commit_signer:4/6=67%)
Paolo Bonzini <pbonz...@redhat.com> (commit_signer:3/6=50%)
Stefan Hajnoczi <stefa...@redhat.com> (commit_signer:2/6=33%)
Peter Xu <pet...@redhat.com> (commit_signer:1/6=17%)
"Philippe Mathieu-Daudé" <f4...@amsat.org> (commit_signer:1/6=17%)
qemu-devel@nongnu.org (open list:All patches CC here)


Regards,
Pierre



The qbus_is_full(BusState *bus) function (qdev_monitor.c) compares the max_index value of the BusState structure with the max_dev value of the BusClass structure to determine whether the maximum number of children has been reached for the bus. The problem is, the max_index field of the BusState structure does not
necessarily reflect the number of devices that have been plugged into
the bus.

Whenever a child device is plugged into the bus, the bus's max_index value is assigned to the child device and then incremented. If the child is subsequently unplugged, the value of the max_index does not change and no longer reflects the
number of children.

When the bus's max_index value reaches the maximum number of devices
allowed for the bus (i.e., the max_dev field in the BusClass structure),
attempts to plug another device will be rejected claiming that the bus is
full -- even if the bus is actually empty.

To resolve the problem, a new 'num_children' field is being added to the
BusState structure to keep track of the number of children plugged into the bus. It will be incremented when a child is plugged, and decremented when a
child is unplugged.

Signed-off-by: Tony Krowiak <akrow...@linux.ibm.com>
Reviewed-by: Pierre Morel<pmo...@linux.ibm.com>
Reviewed-by: Halil Pasic <pa...@linux.ibm.com>
---
  hw/core/qdev.c         | 3 +++
  include/hw/qdev-core.h | 1 +
  qdev-monitor.c         | 2 +-
  3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 6b3cc55b27c2..956923f33520 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -59,6 +59,8 @@ static void bus_remove_child(BusState *bus, DeviceState *child)
              snprintf(name, sizeof(name), "child[%d]", kid->index);
              QTAILQ_REMOVE(&bus->children, kid, sibling);
+            bus->num_children--;
+
              /* This gives back ownership of kid->child back to us.  */
              object_property_del(OBJECT(bus), name, NULL);
              object_unref(OBJECT(kid->child));
@@ -73,6 +75,7 @@ static void bus_add_child(BusState *bus, DeviceState *child)
      char name[32];
      BusChild *kid = g_malloc0(sizeof(*kid));
+    bus->num_children++;
      kid->index = bus->max_index++;
      kid->child = child;
      object_ref(OBJECT(kid->child));
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index a24d0dd566e3..521f0a947ead 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -206,6 +206,7 @@ struct BusState {
      HotplugHandler *hotplug_handler;
      int max_index;
      bool realized;
+    int num_children;
      QTAILQ_HEAD(ChildrenHead, BusChild) children;
      QLIST_ENTRY(BusState) sibling;
  };
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 07147c63bf8b..45a8ba49644c 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -414,7 +414,7 @@ static DeviceState *qbus_find_dev(BusState *bus, char *elem)
  static inline bool qbus_is_full(BusState *bus)
  {
      BusClass *bus_class = BUS_GET_CLASS(bus);
-    return bus_class->max_dev && bus->max_index >= bus_class->max_dev;
+    return bus_class->max_dev && bus->num_children >= bus_class->max_dev;
  }
  /*




--
Pierre Morel
Linux/KVM/QEMU in Böblingen - Germany


Reply via email to