diff mbox

[v2,2/5] spapr: convert slot name property to numeric core and links

Message ID 1457443095-213125-3-git-send-email-imammedo@redhat.com
State New
Headers show

Commit Message

Igor Mammedov March 8, 2016, 1:18 p.m. UTC
it's just a hack to get qiuck swith to numeric core id
should be split and merged in patches
introducing modified code.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/cpu/core.c           | 32 +++++++++++++++++++++++---------
 hw/ppc/spapr.c          | 39 ++-------------------------------------
 hw/ppc/spapr_cpu_core.c | 25 ++-----------------------
 include/hw/cpu/core.h   |  4 ++--
 4 files changed, 29 insertions(+), 71 deletions(-)

Comments

Bharata B Rao March 8, 2016, 3:09 p.m. UTC | #1
On Tue, Mar 08, 2016 at 02:18:12PM +0100, Igor Mammedov wrote:
> it's just a hack to get qiuck swith to numeric core id
> should be split and merged in patches
> introducing modified code.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  hw/cpu/core.c           | 32 +++++++++++++++++++++++---------
>  hw/ppc/spapr.c          | 39 ++-------------------------------------
>  hw/ppc/spapr_cpu_core.c | 25 ++-----------------------
>  include/hw/cpu/core.h   |  4 ++--
>  4 files changed, 29 insertions(+), 71 deletions(-)
> 
> diff --git a/hw/cpu/core.c b/hw/cpu/core.c
> index d8caf37..90a9408 100644
> --- a/hw/cpu/core.c
> +++ b/hw/cpu/core.c
> @@ -7,25 +7,39 @@
>   * See the COPYING file in the top-level directory.
>   */
>  #include "hw/cpu/core.h"
> +#include "qapi/visitor.h"
> 
> -static char *core_prop_get_slot(Object *obj, Error **errp)
> +static void core_prop_get_core(Object *obj, Visitor *v,
> +                               const char *name, void *opaque,
> +                               Error **errp)
>  {
> -    CPUCore *core = CPU_CORE(obj);
> +    CPUCore *cc = CPU_CORE(obj);
> +    int64_t value = cc->core;
> 
> -    return g_strdup(core->slot);
> +    visit_type_int(v, name, &value, errp);
>  }
> 
> -static void core_prop_set_slot(Object *obj, const char *val, Error **errp)
> +static void core_prop_set_core(Object *obj, Visitor *v,
> +                               const char *name, void *opaque,
> +                               Error **errp)
>  {
> -    CPUCore *core = CPU_CORE(obj);
> -
> -    core->slot = g_strdup(val);
> +    CPUCore *cc = CPU_CORE(obj);
> +    Error *local_err = NULL;
> +    int64_t value;
> +
> +    visit_type_int(v, name, &value, &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
> +        return;
> +    }
> +    cc->core = value;
>  }
> 
>  static void cpu_core_instance_init(Object *obj)
>  {
> -    object_property_add_str(obj, "slot", core_prop_get_slot, core_prop_set_slot,
> -                            NULL);
> +    object_property_add(obj, CPU_CORE_ID_PROP, "int",
> +                            core_prop_get_core, core_prop_set_core,
> +                            NULL, NULL, NULL);
>  }
> 
>  static const TypeInfo cpu_core_type_info = {
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 6173c1b..6890a44 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1755,28 +1755,6 @@ static void spapr_validate_node_memory(MachineState *machine, Error **errp)
>      }
>  }
> 
> -/*
> - * Check to see if core is being hot-plugged into an already populated slot.
> - */
> -static void spapr_cpu_core_allow_set_link(Object *obj, const char *name,
> -                                          Object *val, Error **errp)
> -{
> -    Object *core = object_property_get_link(qdev_get_machine(), name, NULL);
> -
> -    /*
> -     * Allow the link to be unset when the core is unplugged.
> -     */
> -    if (!val) {
> -        return;
> -    }
> -
> -    if (core) {
> -        char *path = object_get_canonical_path(core);
> -        error_setg(errp, "Slot %s already populated with %s", name, path);
> -        g_free(path);
> -    }
> -}
> -
>  /* pSeries LPAR / sPAPR hardware init */
>  static void ppc_spapr_init(MachineState *machine)
>  {
> @@ -1884,21 +1862,8 @@ static void ppc_spapr_init(MachineState *machine)
>      spapr->cores = g_new0(Object *, spapr_max_cores);
> 
>      for (i = 0; i < spapr_max_cores; i++) {
> -        char name[32];
> -
> -        /*
> -         * Create links from machine objects to all possible cores.
> -         */
> -        snprintf(name, sizeof(name), "%s[%d]", SPAPR_MACHINE_CPU_CORE_PROP, i);
> -        object_property_add_link(OBJECT(spapr), name, TYPE_SPAPR_CPU_CORE,
> -                                 (Object **)&spapr->cores[i],
> -                                 spapr_cpu_core_allow_set_link,
> -                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
> -                                 &error_fatal);

With the removal of this link, I don't see any code that explicitly sets
spapr->cores[i] on which you depend upon. However I can add that when I
absorb required bits from this patchset to my sPAPR hotplug series if
this is the agreed way forward.

Regards,
Bharata.
Eric Blake March 8, 2016, 4:48 p.m. UTC | #2
On 03/08/2016 06:18 AM, Igor Mammedov wrote:
> it's just a hack to get qiuck swith to numeric core id

s/qiuck swith/a quick switch/

> should be split and merged in patches
> introducing modified code.

Does that mean this series is still RFC, and you plan to respin it
differently?
David Gibson March 9, 2016, 3:19 a.m. UTC | #3
On Tue, Mar 08, 2016 at 02:18:12PM +0100, Igor Mammedov wrote:
> it's just a hack to get qiuck swith to numeric core id
> should be split and merged in patches
> introducing modified code.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  hw/cpu/core.c           | 32 +++++++++++++++++++++++---------
>  hw/ppc/spapr.c          | 39 ++-------------------------------------
>  hw/ppc/spapr_cpu_core.c | 25 ++-----------------------
>  include/hw/cpu/core.h   |  4 ++--
>  4 files changed, 29 insertions(+), 71 deletions(-)
> 
> diff --git a/hw/cpu/core.c b/hw/cpu/core.c
> index d8caf37..90a9408 100644
> --- a/hw/cpu/core.c
> +++ b/hw/cpu/core.c
> @@ -7,25 +7,39 @@
>   * See the COPYING file in the top-level directory.
>   */
>  #include "hw/cpu/core.h"
> +#include "qapi/visitor.h"
>  
> -static char *core_prop_get_slot(Object *obj, Error **errp)
> +static void core_prop_get_core(Object *obj, Visitor *v,
> +                               const char *name, void *opaque,
> +                               Error **errp)
>  {
> -    CPUCore *core = CPU_CORE(obj);
> +    CPUCore *cc = CPU_CORE(obj);
> +    int64_t value = cc->core;
>  
> -    return g_strdup(core->slot);
> +    visit_type_int(v, name, &value, errp);
>  }
>  
> -static void core_prop_set_slot(Object *obj, const char *val, Error **errp)
> +static void core_prop_set_core(Object *obj, Visitor *v,
> +                               const char *name, void *opaque,
> +                               Error **errp)
>  {
> -    CPUCore *core = CPU_CORE(obj);
> -
> -    core->slot = g_strdup(val);
> +    CPUCore *cc = CPU_CORE(obj);
> +    Error *local_err = NULL;
> +    int64_t value;
> +
> +    visit_type_int(v, name, &value, &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
> +        return;
> +    }
> +    cc->core = value;
>  }
>  
>  static void cpu_core_instance_init(Object *obj)
>  {
> -    object_property_add_str(obj, "slot", core_prop_get_slot, core_prop_set_slot,
> -                            NULL);
> +    object_property_add(obj, CPU_CORE_ID_PROP, "int",
> +                            core_prop_get_core, core_prop_set_core,
> +                            NULL, NULL, NULL);
>  }

Something we should clarify at some point: is the core property
intended to be globally unique on its own, or just unique in
combination with other information (e.g. socket and/or node).

>  static const TypeInfo cpu_core_type_info = {
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 6173c1b..6890a44 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1755,28 +1755,6 @@ static void spapr_validate_node_memory(MachineState *machine, Error **errp)
>      }
>  }
>  
> -/*
> - * Check to see if core is being hot-plugged into an already populated slot.
> - */
> -static void spapr_cpu_core_allow_set_link(Object *obj, const char *name,
> -                                          Object *val, Error **errp)
> -{
> -    Object *core = object_property_get_link(qdev_get_machine(), name, NULL);
> -
> -    /*
> -     * Allow the link to be unset when the core is unplugged.
> -     */
> -    if (!val) {
> -        return;
> -    }
> -
> -    if (core) {
> -        char *path = object_get_canonical_path(core);
> -        error_setg(errp, "Slot %s already populated with %s", name, path);
> -        g_free(path);
> -    }
> -}
> -
>  /* pSeries LPAR / sPAPR hardware init */
>  static void ppc_spapr_init(MachineState *machine)
>  {
> @@ -1884,21 +1862,8 @@ static void ppc_spapr_init(MachineState *machine)
>      spapr->cores = g_new0(Object *, spapr_max_cores);
>  
>      for (i = 0; i < spapr_max_cores; i++) {
> -        char name[32];
> -
> -        /*
> -         * Create links from machine objects to all possible cores.
> -         */
> -        snprintf(name, sizeof(name), "%s[%d]", SPAPR_MACHINE_CPU_CORE_PROP, i);
> -        object_property_add_link(OBJECT(spapr), name, TYPE_SPAPR_CPU_CORE,
> -                                 (Object **)&spapr->cores[i],
> -                                 spapr_cpu_core_allow_set_link,
> -                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
> -                                 &error_fatal);
> -
>          /*
> -         * Create cores and set link from machine object to core object for
> -         * boot time CPUs and realize them.
> +         * Create cores for boot time CPUs and realize them.
>           */
>          if (i < spapr_cores) {
>              Object *core  = object_new(TYPE_SPAPR_CPU_CORE);
> @@ -1907,7 +1872,7 @@ static void ppc_spapr_init(MachineState *machine)
>                                      &error_fatal);
>              object_property_set_int(core, smp_threads, "nr_threads",
>                                      &error_fatal);
> -            object_property_set_str(core, name, CPU_CORE_SLOT_PROP,
> +            object_property_set_int(core, i, CPU_CORE_ID_PROP,
>                                      &error_fatal);

Not really important for this quick hack, but for spapr it might make
sense to have the "core" property be the dt_id, rather than just an
arbitrary index.

>              object_property_set_bool(core, true, "realized", &error_fatal);
>          }
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index 5156eb3..98af840 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -117,19 +117,12 @@ static int spapr_cpu_release(Object *obj, void *opaque)
>  static void spapr_core_release(DeviceState *dev, void *opaque)
>  {
>      struct sPAPRCPUUnplugList unplug_list;
> -    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
>      sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
> -    char *slot = object_property_get_str(OBJECT(dev), CPU_CORE_SLOT_PROP,
> -                 &error_fatal);
>  
>      QLIST_INIT(&unplug_list);
>      object_child_foreach(OBJECT(dev), spapr_cpu_release, &unplug_list);
>      spapr_cpu_core_cleanup(&unplug_list);
>  
> -    /* Unset the link from machine object to this core */
> -    object_property_set_link(OBJECT(spapr), NULL, slot, NULL);
> -    g_free(slot);
> -
>      g_free(core->threads);
>      object_unparent(OBJECT(dev));
>  }
> @@ -181,9 +174,6 @@ static int spapr_cpu_core_realize_child(Object *child, void *opaque)
>  static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
>  {
>      sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
> -    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
> -    char *slot;
> -    Error *local_err = NULL;
>  
>      if (!core->nr_threads) {
>          error_setg(errp, "nr_threads property can't be 0");
> @@ -199,19 +189,8 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
>       * TODO: If slot isn't specified, plug this core into
>       * an existing empty slot.
>       */
> -    slot = object_property_get_str(OBJECT(dev), CPU_CORE_SLOT_PROP, &local_err);
> -    if (!slot) {
> -        error_setg(errp, "slot property isn't set");
> -        return;
> -    }
> -
> -    object_property_set_link(OBJECT(spapr), OBJECT(core), slot, &local_err);
> -    g_free(slot);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> -        return;
> -    }
> -
> +    /* probably should error out as 'core' should be specified
> +       either by board or by user */
>      object_child_foreach(OBJECT(dev), spapr_cpu_core_realize_child, errp);
>  }
>  
> diff --git a/include/hw/cpu/core.h b/include/hw/cpu/core.h
> index 2daa724..a627969 100644
> --- a/include/hw/cpu/core.h
> +++ b/include/hw/cpu/core.h
> @@ -22,9 +22,9 @@ typedef struct CPUCore {
>      DeviceState parent_obj;
>  
>      /*< public >*/
> -    char *slot;
> +    int core;
>  } CPUCore;
>  
> -#define CPU_CORE_SLOT_PROP "slot"
> +#define CPU_CORE_ID_PROP "core"
>  
>  #endif
Igor Mammedov March 9, 2016, 9:27 a.m. UTC | #4
On Tue, 8 Mar 2016 20:39:39 +0530
Bharata B Rao <bharata@linux.vnet.ibm.com> wrote:

> On Tue, Mar 08, 2016 at 02:18:12PM +0100, Igor Mammedov wrote:
> > it's just a hack to get qiuck swith to numeric core id
> > should be split and merged in patches
> > introducing modified code.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> >  hw/cpu/core.c           | 32 +++++++++++++++++++++++---------
> >  hw/ppc/spapr.c          | 39 ++-------------------------------------
> >  hw/ppc/spapr_cpu_core.c | 25 ++-----------------------
> >  include/hw/cpu/core.h   |  4 ++--
> >  4 files changed, 29 insertions(+), 71 deletions(-)
> > 
> > diff --git a/hw/cpu/core.c b/hw/cpu/core.c
> > index d8caf37..90a9408 100644
> > --- a/hw/cpu/core.c
> > +++ b/hw/cpu/core.c
> > @@ -7,25 +7,39 @@
> >   * See the COPYING file in the top-level directory.
> >   */
> >  #include "hw/cpu/core.h"
> > +#include "qapi/visitor.h"
> > 
> > -static char *core_prop_get_slot(Object *obj, Error **errp)
> > +static void core_prop_get_core(Object *obj, Visitor *v,
> > +                               const char *name, void *opaque,
> > +                               Error **errp)
> >  {
> > -    CPUCore *core = CPU_CORE(obj);
> > +    CPUCore *cc = CPU_CORE(obj);
> > +    int64_t value = cc->core;
> > 
> > -    return g_strdup(core->slot);
> > +    visit_type_int(v, name, &value, errp);
> >  }
> > 
> > -static void core_prop_set_slot(Object *obj, const char *val, Error **errp)
> > +static void core_prop_set_core(Object *obj, Visitor *v,
> > +                               const char *name, void *opaque,
> > +                               Error **errp)
> >  {
> > -    CPUCore *core = CPU_CORE(obj);
> > -
> > -    core->slot = g_strdup(val);
> > +    CPUCore *cc = CPU_CORE(obj);
> > +    Error *local_err = NULL;
> > +    int64_t value;
> > +
> > +    visit_type_int(v, name, &value, &local_err);
> > +    if (local_err) {
> > +        error_propagate(errp, local_err);
> > +        return;
> > +    }
> > +    cc->core = value;
> >  }
> > 
> >  static void cpu_core_instance_init(Object *obj)
> >  {
> > -    object_property_add_str(obj, "slot", core_prop_get_slot, core_prop_set_slot,
> > -                            NULL);
> > +    object_property_add(obj, CPU_CORE_ID_PROP, "int",
> > +                            core_prop_get_core, core_prop_set_core,
> > +                            NULL, NULL, NULL);
> >  }
> > 
> >  static const TypeInfo cpu_core_type_info = {
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index 6173c1b..6890a44 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -1755,28 +1755,6 @@ static void spapr_validate_node_memory(MachineState *machine, Error **errp)
> >      }
> >  }
> > 
> > -/*
> > - * Check to see if core is being hot-plugged into an already populated slot.
> > - */
> > -static void spapr_cpu_core_allow_set_link(Object *obj, const char *name,
> > -                                          Object *val, Error **errp)
> > -{
> > -    Object *core = object_property_get_link(qdev_get_machine(), name, NULL);
> > -
> > -    /*
> > -     * Allow the link to be unset when the core is unplugged.
> > -     */
> > -    if (!val) {
> > -        return;
> > -    }
> > -
> > -    if (core) {
> > -        char *path = object_get_canonical_path(core);
> > -        error_setg(errp, "Slot %s already populated with %s", name, path);
> > -        g_free(path);
> > -    }
> > -}
> > -
> >  /* pSeries LPAR / sPAPR hardware init */
> >  static void ppc_spapr_init(MachineState *machine)
> >  {
> > @@ -1884,21 +1862,8 @@ static void ppc_spapr_init(MachineState *machine)
> >      spapr->cores = g_new0(Object *, spapr_max_cores);
> > 
> >      for (i = 0; i < spapr_max_cores; i++) {
> > -        char name[32];
> > -
> > -        /*
> > -         * Create links from machine objects to all possible cores.
> > -         */
> > -        snprintf(name, sizeof(name), "%s[%d]", SPAPR_MACHINE_CPU_CORE_PROP, i);
> > -        object_property_add_link(OBJECT(spapr), name, TYPE_SPAPR_CPU_CORE,
> > -                                 (Object **)&spapr->cores[i],
> > -                                 spapr_cpu_core_allow_set_link,
> > -                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
> > -                                 &error_fatal);  
> 
> With the removal of this link, I don't see any code that explicitly sets
> spapr->cores[i] on which you depend upon. However I can add that when I
> absorb required bits from this patchset to my sPAPR hotplug series if
> this is the agreed way forward.
yep, that's need to be fixed, thanks for noticing


> 
> Regards,
> Bharata.
>
Igor Mammedov March 9, 2016, 9:40 a.m. UTC | #5
On Tue, 8 Mar 2016 09:48:18 -0700
Eric Blake <eblake@redhat.com> wrote:

> On 03/08/2016 06:18 AM, Igor Mammedov wrote:
> > it's just a hack to get qiuck swith to numeric core id  
> 
> s/qiuck swith/a quick switch/
> 
> > should be split and merged in patches
> > introducing modified code.  
> 
> Does that mean this series is still RFC, and you plan to respin it
> differently?
It should have been RFC since it's on top another RFC,
some patches are meant to be absorbed by spapr hotplug patchset.
But generic patch introducing QMP command can be posted before
any target specific patchset if we find consensus earlier.
Igor Mammedov March 9, 2016, 9:48 a.m. UTC | #6
On Wed, 9 Mar 2016 14:19:26 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> On Tue, Mar 08, 2016 at 02:18:12PM +0100, Igor Mammedov wrote:
> > it's just a hack to get qiuck swith to numeric core id
> > should be split and merged in patches
> > introducing modified code.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> >  hw/cpu/core.c           | 32 +++++++++++++++++++++++---------
> >  hw/ppc/spapr.c          | 39 ++-------------------------------------
> >  hw/ppc/spapr_cpu_core.c | 25 ++-----------------------
> >  include/hw/cpu/core.h   |  4 ++--
> >  4 files changed, 29 insertions(+), 71 deletions(-)
> > 
> > diff --git a/hw/cpu/core.c b/hw/cpu/core.c
> > index d8caf37..90a9408 100644
> > --- a/hw/cpu/core.c
> > +++ b/hw/cpu/core.c
> > @@ -7,25 +7,39 @@
> >   * See the COPYING file in the top-level directory.
> >   */
> >  #include "hw/cpu/core.h"
> > +#include "qapi/visitor.h"
> >  
> > -static char *core_prop_get_slot(Object *obj, Error **errp)
> > +static void core_prop_get_core(Object *obj, Visitor *v,
> > +                               const char *name, void *opaque,
> > +                               Error **errp)
> >  {
> > -    CPUCore *core = CPU_CORE(obj);
> > +    CPUCore *cc = CPU_CORE(obj);
> > +    int64_t value = cc->core;
> >  
> > -    return g_strdup(core->slot);
> > +    visit_type_int(v, name, &value, errp);
> >  }
> >  
> > -static void core_prop_set_slot(Object *obj, const char *val, Error **errp)
> > +static void core_prop_set_core(Object *obj, Visitor *v,
> > +                               const char *name, void *opaque,
> > +                               Error **errp)
> >  {
> > -    CPUCore *core = CPU_CORE(obj);
> > -
> > -    core->slot = g_strdup(val);
> > +    CPUCore *cc = CPU_CORE(obj);
> > +    Error *local_err = NULL;
> > +    int64_t value;
> > +
> > +    visit_type_int(v, name, &value, &local_err);
> > +    if (local_err) {
> > +        error_propagate(errp, local_err);
> > +        return;
> > +    }
> > +    cc->core = value;
> >  }
> >  
> >  static void cpu_core_instance_init(Object *obj)
> >  {
> > -    object_property_add_str(obj, "slot", core_prop_get_slot, core_prop_set_slot,
> > -                            NULL);
> > +    object_property_add(obj, CPU_CORE_ID_PROP, "int",
> > +                            core_prop_get_core, core_prop_set_core,
> > +                            NULL, NULL, NULL);
> >  }  
> 
> Something we should clarify at some point: is the core property
> intended to be globally unique on its own, or just unique in
> combination with other information (e.g. socket and/or node).
I'd think it should be unique in combination with other information.
However I wouldn't enforce it globally, since it might be platform dependent
and I'd leave this check upto a concrete target. 


> 
> >  static const TypeInfo cpu_core_type_info = {
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index 6173c1b..6890a44 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -1755,28 +1755,6 @@ static void spapr_validate_node_memory(MachineState *machine, Error **errp)
> >      }
> >  }
> >  
> > -/*
> > - * Check to see if core is being hot-plugged into an already populated slot.
> > - */
> > -static void spapr_cpu_core_allow_set_link(Object *obj, const char *name,
> > -                                          Object *val, Error **errp)
> > -{
> > -    Object *core = object_property_get_link(qdev_get_machine(), name, NULL);
> > -
> > -    /*
> > -     * Allow the link to be unset when the core is unplugged.
> > -     */
> > -    if (!val) {
> > -        return;
> > -    }
> > -
> > -    if (core) {
> > -        char *path = object_get_canonical_path(core);
> > -        error_setg(errp, "Slot %s already populated with %s", name, path);
> > -        g_free(path);
> > -    }
> > -}
> > -
> >  /* pSeries LPAR / sPAPR hardware init */
> >  static void ppc_spapr_init(MachineState *machine)
> >  {
> > @@ -1884,21 +1862,8 @@ static void ppc_spapr_init(MachineState *machine)
> >      spapr->cores = g_new0(Object *, spapr_max_cores);
> >  
> >      for (i = 0; i < spapr_max_cores; i++) {
> > -        char name[32];
> > -
> > -        /*
> > -         * Create links from machine objects to all possible cores.
> > -         */
> > -        snprintf(name, sizeof(name), "%s[%d]", SPAPR_MACHINE_CPU_CORE_PROP, i);
> > -        object_property_add_link(OBJECT(spapr), name, TYPE_SPAPR_CPU_CORE,
> > -                                 (Object **)&spapr->cores[i],
> > -                                 spapr_cpu_core_allow_set_link,
> > -                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
> > -                                 &error_fatal);
> > -
> >          /*
> > -         * Create cores and set link from machine object to core object for
> > -         * boot time CPUs and realize them.
> > +         * Create cores for boot time CPUs and realize them.
> >           */
> >          if (i < spapr_cores) {
> >              Object *core  = object_new(TYPE_SPAPR_CPU_CORE);
> > @@ -1907,7 +1872,7 @@ static void ppc_spapr_init(MachineState *machine)
> >                                      &error_fatal);
> >              object_property_set_int(core, smp_threads, "nr_threads",
> >                                      &error_fatal);
> > -            object_property_set_str(core, name, CPU_CORE_SLOT_PROP,
> > +            object_property_set_int(core, i, CPU_CORE_ID_PROP,
> >                                      &error_fatal);  
> 
> Not really important for this quick hack, but for spapr it might make
> sense to have the "core" property be the dt_id, rather than just an
> arbitrary index.
anything that hides cpu_index from user interface and guest ABI,
and replaces it with some deterministic id (which makes sense for target),
sounds good tome.

> 
> >              object_property_set_bool(core, true, "realized", &error_fatal);
> >          }
> > diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> > index 5156eb3..98af840 100644
> > --- a/hw/ppc/spapr_cpu_core.c
> > +++ b/hw/ppc/spapr_cpu_core.c
> > @@ -117,19 +117,12 @@ static int spapr_cpu_release(Object *obj, void *opaque)
> >  static void spapr_core_release(DeviceState *dev, void *opaque)
> >  {
> >      struct sPAPRCPUUnplugList unplug_list;
> > -    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
> >      sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
> > -    char *slot = object_property_get_str(OBJECT(dev), CPU_CORE_SLOT_PROP,
> > -                 &error_fatal);
> >  
> >      QLIST_INIT(&unplug_list);
> >      object_child_foreach(OBJECT(dev), spapr_cpu_release, &unplug_list);
> >      spapr_cpu_core_cleanup(&unplug_list);
> >  
> > -    /* Unset the link from machine object to this core */
> > -    object_property_set_link(OBJECT(spapr), NULL, slot, NULL);
> > -    g_free(slot);
> > -
> >      g_free(core->threads);
> >      object_unparent(OBJECT(dev));
> >  }
> > @@ -181,9 +174,6 @@ static int spapr_cpu_core_realize_child(Object *child, void *opaque)
> >  static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
> >  {
> >      sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
> > -    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
> > -    char *slot;
> > -    Error *local_err = NULL;
> >  
> >      if (!core->nr_threads) {
> >          error_setg(errp, "nr_threads property can't be 0");
> > @@ -199,19 +189,8 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
> >       * TODO: If slot isn't specified, plug this core into
> >       * an existing empty slot.
> >       */
> > -    slot = object_property_get_str(OBJECT(dev), CPU_CORE_SLOT_PROP, &local_err);
> > -    if (!slot) {
> > -        error_setg(errp, "slot property isn't set");
> > -        return;
> > -    }
> > -
> > -    object_property_set_link(OBJECT(spapr), OBJECT(core), slot, &local_err);
> > -    g_free(slot);
> > -    if (local_err) {
> > -        error_propagate(errp, local_err);
> > -        return;
> > -    }
> > -
> > +    /* probably should error out as 'core' should be specified
> > +       either by board or by user */
> >      object_child_foreach(OBJECT(dev), spapr_cpu_core_realize_child, errp);
> >  }
> >  
> > diff --git a/include/hw/cpu/core.h b/include/hw/cpu/core.h
> > index 2daa724..a627969 100644
> > --- a/include/hw/cpu/core.h
> > +++ b/include/hw/cpu/core.h
> > @@ -22,9 +22,9 @@ typedef struct CPUCore {
> >      DeviceState parent_obj;
> >  
> >      /*< public >*/
> > -    char *slot;
> > +    int core;
> >  } CPUCore;
> >  
> > -#define CPU_CORE_SLOT_PROP "slot"
> > +#define CPU_CORE_ID_PROP "core"
> >  
> >  #endif  
>
diff mbox

Patch

diff --git a/hw/cpu/core.c b/hw/cpu/core.c
index d8caf37..90a9408 100644
--- a/hw/cpu/core.c
+++ b/hw/cpu/core.c
@@ -7,25 +7,39 @@ 
  * See the COPYING file in the top-level directory.
  */
 #include "hw/cpu/core.h"
+#include "qapi/visitor.h"
 
-static char *core_prop_get_slot(Object *obj, Error **errp)
+static void core_prop_get_core(Object *obj, Visitor *v,
+                               const char *name, void *opaque,
+                               Error **errp)
 {
-    CPUCore *core = CPU_CORE(obj);
+    CPUCore *cc = CPU_CORE(obj);
+    int64_t value = cc->core;
 
-    return g_strdup(core->slot);
+    visit_type_int(v, name, &value, errp);
 }
 
-static void core_prop_set_slot(Object *obj, const char *val, Error **errp)
+static void core_prop_set_core(Object *obj, Visitor *v,
+                               const char *name, void *opaque,
+                               Error **errp)
 {
-    CPUCore *core = CPU_CORE(obj);
-
-    core->slot = g_strdup(val);
+    CPUCore *cc = CPU_CORE(obj);
+    Error *local_err = NULL;
+    int64_t value;
+
+    visit_type_int(v, name, &value, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+    cc->core = value;
 }
 
 static void cpu_core_instance_init(Object *obj)
 {
-    object_property_add_str(obj, "slot", core_prop_get_slot, core_prop_set_slot,
-                            NULL);
+    object_property_add(obj, CPU_CORE_ID_PROP, "int",
+                            core_prop_get_core, core_prop_set_core,
+                            NULL, NULL, NULL);
 }
 
 static const TypeInfo cpu_core_type_info = {
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 6173c1b..6890a44 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1755,28 +1755,6 @@  static void spapr_validate_node_memory(MachineState *machine, Error **errp)
     }
 }
 
-/*
- * Check to see if core is being hot-plugged into an already populated slot.
- */
-static void spapr_cpu_core_allow_set_link(Object *obj, const char *name,
-                                          Object *val, Error **errp)
-{
-    Object *core = object_property_get_link(qdev_get_machine(), name, NULL);
-
-    /*
-     * Allow the link to be unset when the core is unplugged.
-     */
-    if (!val) {
-        return;
-    }
-
-    if (core) {
-        char *path = object_get_canonical_path(core);
-        error_setg(errp, "Slot %s already populated with %s", name, path);
-        g_free(path);
-    }
-}
-
 /* pSeries LPAR / sPAPR hardware init */
 static void ppc_spapr_init(MachineState *machine)
 {
@@ -1884,21 +1862,8 @@  static void ppc_spapr_init(MachineState *machine)
     spapr->cores = g_new0(Object *, spapr_max_cores);
 
     for (i = 0; i < spapr_max_cores; i++) {
-        char name[32];
-
-        /*
-         * Create links from machine objects to all possible cores.
-         */
-        snprintf(name, sizeof(name), "%s[%d]", SPAPR_MACHINE_CPU_CORE_PROP, i);
-        object_property_add_link(OBJECT(spapr), name, TYPE_SPAPR_CPU_CORE,
-                                 (Object **)&spapr->cores[i],
-                                 spapr_cpu_core_allow_set_link,
-                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
-                                 &error_fatal);
-
         /*
-         * Create cores and set link from machine object to core object for
-         * boot time CPUs and realize them.
+         * Create cores for boot time CPUs and realize them.
          */
         if (i < spapr_cores) {
             Object *core  = object_new(TYPE_SPAPR_CPU_CORE);
@@ -1907,7 +1872,7 @@  static void ppc_spapr_init(MachineState *machine)
                                     &error_fatal);
             object_property_set_int(core, smp_threads, "nr_threads",
                                     &error_fatal);
-            object_property_set_str(core, name, CPU_CORE_SLOT_PROP,
+            object_property_set_int(core, i, CPU_CORE_ID_PROP,
                                     &error_fatal);
             object_property_set_bool(core, true, "realized", &error_fatal);
         }
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 5156eb3..98af840 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -117,19 +117,12 @@  static int spapr_cpu_release(Object *obj, void *opaque)
 static void spapr_core_release(DeviceState *dev, void *opaque)
 {
     struct sPAPRCPUUnplugList unplug_list;
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
-    char *slot = object_property_get_str(OBJECT(dev), CPU_CORE_SLOT_PROP,
-                 &error_fatal);
 
     QLIST_INIT(&unplug_list);
     object_child_foreach(OBJECT(dev), spapr_cpu_release, &unplug_list);
     spapr_cpu_core_cleanup(&unplug_list);
 
-    /* Unset the link from machine object to this core */
-    object_property_set_link(OBJECT(spapr), NULL, slot, NULL);
-    g_free(slot);
-
     g_free(core->threads);
     object_unparent(OBJECT(dev));
 }
@@ -181,9 +174,6 @@  static int spapr_cpu_core_realize_child(Object *child, void *opaque)
 static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
 {
     sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
-    char *slot;
-    Error *local_err = NULL;
 
     if (!core->nr_threads) {
         error_setg(errp, "nr_threads property can't be 0");
@@ -199,19 +189,8 @@  static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
      * TODO: If slot isn't specified, plug this core into
      * an existing empty slot.
      */
-    slot = object_property_get_str(OBJECT(dev), CPU_CORE_SLOT_PROP, &local_err);
-    if (!slot) {
-        error_setg(errp, "slot property isn't set");
-        return;
-    }
-
-    object_property_set_link(OBJECT(spapr), OBJECT(core), slot, &local_err);
-    g_free(slot);
-    if (local_err) {
-        error_propagate(errp, local_err);
-        return;
-    }
-
+    /* probably should error out as 'core' should be specified
+       either by board or by user */
     object_child_foreach(OBJECT(dev), spapr_cpu_core_realize_child, errp);
 }
 
diff --git a/include/hw/cpu/core.h b/include/hw/cpu/core.h
index 2daa724..a627969 100644
--- a/include/hw/cpu/core.h
+++ b/include/hw/cpu/core.h
@@ -22,9 +22,9 @@  typedef struct CPUCore {
     DeviceState parent_obj;
 
     /*< public >*/
-    char *slot;
+    int core;
 } CPUCore;
 
-#define CPU_CORE_SLOT_PROP "slot"
+#define CPU_CORE_ID_PROP "core"
 
 #endif