Patchwork [RFC,V4,1/6] qdev : add a maximum device allowed field for the bus.

login
register
mail settings
Submitter fred.konrad@greensocs.com
Date Nov. 30, 2012, 5:12 p.m.
Message ID <1354295530-18644-2-git-send-email-fred.konrad@greensocs.com>
Download mbox | patch
Permalink /patch/203002/
State New
Headers show

Comments

fred.konrad@greensocs.com - Nov. 30, 2012, 5:12 p.m.
From: KONRAD Frederic <fred.konrad@greensocs.com>

Only one device can be connected to virtio-bus.
This patch add a field max_dev which is :
    * the maximum amount of devices connected on the bus ( when
    * max_dev!=0 ).
    * have no effect ( when max_dev=0 ).

The function qbus_find_recursive is modified :
    * to return a non full bus when the "bus=" option is not present.
    * to give an error when the "bus=" option is pointing a full bus.

Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
---
 hw/qdev-core.h    |    2 ++
 hw/qdev-monitor.c |   11 +++++++++++
 qerror.h          |    3 +++
 3 files changed, 16 insertions(+), 0 deletions(-)
Peter Maydell - Nov. 30, 2012, 6:26 p.m.
On 30 November 2012 17:12,  <fred.konrad@greensocs.com> wrote:
> From: KONRAD Frederic <fred.konrad@greensocs.com>
>
> Only one device can be connected to virtio-bus.
> This patch add a field max_dev which is :
>     * the maximum amount of devices connected on the bus ( when
>     * max_dev!=0 ).
>     * have no effect ( when max_dev=0 ).
>
> The function qbus_find_recursive is modified :
>     * to return a non full bus when the "bus=" option is not present.
>     * to give an error when the "bus=" option is pointing a full bus.

You don't need to describe the exact details of code changes in
a commit message -- anybody who wants that can use 'git show'.
Commit messages should describe the overall change and rationale,
not the mechanics. So for instance you should talk about the
effects as visible to the QEMU user, not the changes in semantics
of a particular function.

(Also I don't like commit messages that say "this patch", because
they're not patches once they've been applied; but that's just a
personal quirk.)

> Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
> ---
>  hw/qdev-core.h    |    2 ++
>  hw/qdev-monitor.c |   11 +++++++++++
>  qerror.h          |    3 +++
>  3 files changed, 16 insertions(+), 0 deletions(-)
>
> diff --git a/hw/qdev-core.h b/hw/qdev-core.h
> index fff7f0f..f5019b1 100644
> --- a/hw/qdev-core.h
> +++ b/hw/qdev-core.h
> @@ -113,6 +113,8 @@ struct BusState {
>      const char *name;
>      int allow_hotplug;
>      int max_index;
> +    /* maximum devices allowed on the bus. */

", 0 if no limit. "

> +    int max_dev;
>      QTAILQ_HEAD(ChildrenHead, BusChild) children;
>      QLIST_ENTRY(BusState) sibling;
>  };
> diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c
> index a1b4d6a..4471b3a 100644
> --- a/hw/qdev-monitor.c
> +++ b/hw/qdev-monitor.c
> @@ -292,6 +292,17 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name,
>      if (bus_typename && !object_dynamic_cast(OBJECT(bus), bus_typename)) {
>          match = 0;
>      }
> +    /* Check if max_dev is reached */

This comment is veering perilously close to "Add one to x" territory.

> +    if ((bus->max_dev != 0) && (bus->max_dev <= bus->max_index)) {
> +        if (name != NULL) {
> +            /* bus was explicitly specified : return an error. */
> +            qerror_report(QERR_BUS_IS_FULL, bus->name);

So I could be wrong here, but I think we aren't defining new
QERR constants any more, but just having format-string style
errors inline. In this case that would be something like:

qerror_report(ERROR_CLASS_GENERIC_ERROR, "Bus '%s' is full", bus->name);

> +            return NULL;
> +        } else {
> +            /* bus was not specified : try to find another one. */
> +            match = 0;
> +        }
> +    }
>      if (match) {
>          return bus;
>      }

-- PMM

Patch

diff --git a/hw/qdev-core.h b/hw/qdev-core.h
index fff7f0f..f5019b1 100644
--- a/hw/qdev-core.h
+++ b/hw/qdev-core.h
@@ -113,6 +113,8 @@  struct BusState {
     const char *name;
     int allow_hotplug;
     int max_index;
+    /* maximum devices allowed on the bus. */
+    int max_dev;
     QTAILQ_HEAD(ChildrenHead, BusChild) children;
     QLIST_ENTRY(BusState) sibling;
 };
diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c
index a1b4d6a..4471b3a 100644
--- a/hw/qdev-monitor.c
+++ b/hw/qdev-monitor.c
@@ -292,6 +292,17 @@  static BusState *qbus_find_recursive(BusState *bus, const char *name,
     if (bus_typename && !object_dynamic_cast(OBJECT(bus), bus_typename)) {
         match = 0;
     }
+    /* Check if max_dev is reached */
+    if ((bus->max_dev != 0) && (bus->max_dev <= bus->max_index)) {
+        if (name != NULL) {
+            /* bus was explicitly specified : return an error. */
+            qerror_report(QERR_BUS_IS_FULL, bus->name);
+            return NULL;
+        } else {
+            /* bus was not specified : try to find another one. */
+            match = 0;
+        }
+    }
     if (match) {
         return bus;
     }
diff --git a/qerror.h b/qerror.h
index 8db4309..b159828 100644
--- a/qerror.h
+++ b/qerror.h
@@ -69,6 +69,9 @@  void assert_no_error(Error *err);
 #define QERR_BUS_NOT_FOUND \
     ERROR_CLASS_GENERIC_ERROR, "Bus '%s' not found"
 
+#define QERR_BUS_IS_FULL \
+    ERROR_CLASS_GENERIC_ERROR, "Bus '%s' is full"
+
 #define QERR_COMMAND_DISABLED \
     ERROR_CLASS_GENERIC_ERROR, "The command %s has been disabled for this instance"