Message ID | 1447201710-10229-46-git-send-email-benh@kernel.crashing.org |
---|---|
State | New |
Headers | show |
On 11/11/2015 01:27, Benjamin Herrenschmidt wrote: > This allows a bus class to tell whether a given bus has room for > any new device. max_dev isn't sufficient as the rules can depend > on some arguments or can differ between instances of a bus. This > will be used by PCI in subsequent patches > > Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > --- > include/hw/qdev-core.h | 1 + > qdev-monitor.c | 13 ++++++++----- > 2 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h > index 8057aed..6f3dd8d 100644 > --- a/include/hw/qdev-core.h > +++ b/include/hw/qdev-core.h > @@ -202,6 +202,7 @@ struct BusClass { > */ > char *(*get_fw_dev_path)(DeviceState *dev); > void (*reset)(BusState *bus); > + bool (*can_add_device)(BusState *bus, QemuOpts *opts); > BusRealize realize; > BusUnrealize unrealize; > > diff --git a/qdev-monitor.c b/qdev-monitor.c > index a35098f..4023357 100644 > --- a/qdev-monitor.c > +++ b/qdev-monitor.c > @@ -384,7 +384,7 @@ static inline bool qbus_is_full(BusState *bus) > * Return the bus if found, else %NULL. > */ > static BusState *qbus_find_recursive(BusState *bus, const char *name, > - const char *bus_typename) > + const char *bus_typename, QemuOpts *opts) > { > BusChild *kid; > BusState *pick, *child, *ret; > @@ -398,7 +398,10 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name, > } > > if (match && !qbus_is_full(bus)) { > - return bus; /* root matches and isn't full */ > + BusClass *bc = BUS_GET_CLASS(bus); > + if (!bc->can_add_device || bc->can_add_device(bus, opts)) { > + return bus; /* root matches and isn't full */ > + } > } > > pick = match ? bus : NULL; > @@ -406,7 +409,7 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name, > QTAILQ_FOREACH(kid, &bus->children, sibling) { > DeviceState *dev = kid->child; > QLIST_FOREACH(child, &dev->child_bus, sibling) { > - ret = qbus_find_recursive(child, name, bus_typename); > + ret = qbus_find_recursive(child, name, bus_typename, opts); Tabs for indentation. There are other occurrences in the patch. Apart from this, Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Acked-by: Paolo Bonzini <pbonzini@redhat.com> > if (ret && !qbus_is_full(ret)) { > return ret; /* a descendant matches and isn't full */ > } > @@ -436,7 +439,7 @@ static BusState *qbus_find(const char *path, Error **errp) > assert(!path[0]); > elem[0] = len = 0; > } > - bus = qbus_find_recursive(sysbus_get_default(), elem, NULL); > + bus = qbus_find_recursive(sysbus_get_default(), elem, NULL, NULL); > if (!bus) { > error_setg(errp, "Bus '%s' not found", elem); > return NULL; > @@ -542,7 +545,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp) > return NULL; > } > } else if (dc->bus_type != NULL) { > - bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type); > + bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type, opts); > if (!bus || qbus_is_full(bus)) { > error_setg(errp, "No '%s' bus found for device '%s'", > dc->bus_type, driver); >
On Wed, 2015-11-18 at 13:34 +0100, Paolo Bonzini wrote: ../.. > Tabs for indentation. There are other occurrences in the patch. Ooops. sorry, missed those. Do you need a respin ? > Apart from this, > > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > Acked-by: Paolo Bonzini <pbonzini@redhat.com> > > > if (ret && !qbus_is_full(ret)) { > > return ret; /* a descendant matches and isn't > > full */ > > } > > @@ -436,7 +439,7 @@ static BusState *qbus_find(const char *path, > > Error **errp) > > assert(!path[0]); > > elem[0] = len = 0; > > } > > - bus = qbus_find_recursive(sysbus_get_default(), elem, > > NULL); > > + bus = qbus_find_recursive(sysbus_get_default(), elem, > > NULL, NULL); > > if (!bus) { > > error_setg(errp, "Bus '%s' not found", elem); > > return NULL; > > @@ -542,7 +545,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, > > Error **errp) > > return NULL; > > } > > } else if (dc->bus_type != NULL) { > > - bus = qbus_find_recursive(sysbus_get_default(), NULL, dc- > > >bus_type); > > + bus = qbus_find_recursive(sysbus_get_default(), NULL, > > dc->bus_type, opts); > > if (!bus || qbus_is_full(bus)) { > > error_setg(errp, "No '%s' bus found for device '%s'", > > dc->bus_type, driver); > >
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index 8057aed..6f3dd8d 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -202,6 +202,7 @@ struct BusClass { */ char *(*get_fw_dev_path)(DeviceState *dev); void (*reset)(BusState *bus); + bool (*can_add_device)(BusState *bus, QemuOpts *opts); BusRealize realize; BusUnrealize unrealize; diff --git a/qdev-monitor.c b/qdev-monitor.c index a35098f..4023357 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -384,7 +384,7 @@ static inline bool qbus_is_full(BusState *bus) * Return the bus if found, else %NULL. */ static BusState *qbus_find_recursive(BusState *bus, const char *name, - const char *bus_typename) + const char *bus_typename, QemuOpts *opts) { BusChild *kid; BusState *pick, *child, *ret; @@ -398,7 +398,10 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name, } if (match && !qbus_is_full(bus)) { - return bus; /* root matches and isn't full */ + BusClass *bc = BUS_GET_CLASS(bus); + if (!bc->can_add_device || bc->can_add_device(bus, opts)) { + return bus; /* root matches and isn't full */ + } } pick = match ? bus : NULL; @@ -406,7 +409,7 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name, QTAILQ_FOREACH(kid, &bus->children, sibling) { DeviceState *dev = kid->child; QLIST_FOREACH(child, &dev->child_bus, sibling) { - ret = qbus_find_recursive(child, name, bus_typename); + ret = qbus_find_recursive(child, name, bus_typename, opts); if (ret && !qbus_is_full(ret)) { return ret; /* a descendant matches and isn't full */ } @@ -436,7 +439,7 @@ static BusState *qbus_find(const char *path, Error **errp) assert(!path[0]); elem[0] = len = 0; } - bus = qbus_find_recursive(sysbus_get_default(), elem, NULL); + bus = qbus_find_recursive(sysbus_get_default(), elem, NULL, NULL); if (!bus) { error_setg(errp, "Bus '%s' not found", elem); return NULL; @@ -542,7 +545,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp) return NULL; } } else if (dc->bus_type != NULL) { - bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type); + bus = qbus_find_recursive(sysbus_get_default(), NULL, dc->bus_type, opts); if (!bus || qbus_is_full(bus)) { error_setg(errp, "No '%s' bus found for device '%s'", dc->bus_type, driver);
This allows a bus class to tell whether a given bus has room for any new device. max_dev isn't sufficient as the rules can depend on some arguments or can differ between instances of a bus. This will be used by PCI in subsequent patches Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- include/hw/qdev-core.h | 1 + qdev-monitor.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-)