qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* Re: [Qemu-devel] [PATCH V2 4/4] hw/machine: qemu machine opts as properties to QemuMachineState
       [not found]   ` <20140530194530.GD15000@otherpad.lan.raisama.net>
@ 2014-06-01  8:07     ` Marcel Apfelbaum
  0 siblings, 0 replies; 4+ messages in thread
From: Marcel Apfelbaum @ 2014-06-01  8:07 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: agraf, mst, qemu-devel, sw, mdroth, armbru, aliguori, lcapitulino,
	afaerber

On Fri, 2014-05-30 at 16:45 -0300, Eduardo Habkost wrote:
> On Mon, May 26, 2014 at 03:40:58PM +0300, Marcel Apfelbaum wrote:
> > Make machine's QemuOpts QOM properties of machine. The properties
> > are automatically filled in. This opens the possiblity to create
> > opts per machine rather than global.
> > 
> > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > ---
> >  hw/core/machine.c   | 256 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  include/hw/boards.h |   6 +-
> >  vl.c                |  10 +-
> >  3 files changed, 266 insertions(+), 6 deletions(-)
> > 
> > diff --git a/hw/core/machine.c b/hw/core/machine.c
> > index d3ffef7..dbcf2a1 100644
> > --- a/hw/core/machine.c
> > +++ b/hw/core/machine.c
> > @@ -11,6 +11,260 @@
> >   */
> >  
> >  #include "hw/boards.h"
> > +#include "qapi/visitor.h"
> > +
> > +static char *machine_get_accel(Object *obj, Error **errp)
> > +{
> > +    MachineState *ms = MACHINE(obj);
> > +    return g_strdup(ms->accel);
> > +}
> > +
> > +static void machine_set_accel(Object *obj, const char *value, Error **errp)
> > +{
> > +    MachineState *ms = MACHINE(obj);
> > +    ms->accel = g_strdup(value);
> > +}
> 
> You are not freeing the old value here and on the other string setters.
It seems to be the caller responsibility.
> 
> (Do we have some existing common wrapper to automatically free the old
> value and set the new one, or every setter should duplicate the same
> free/strdup logic?)
We don't have yet, from what I know, and this is for the moment the QMP way
to handle string attributes.

Thanks,
Marcel 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH V2 4/4] hw/machine: qemu machine opts as properties to QemuMachineState
       [not found]   ` <20140530192507.GC15000@otherpad.lan.raisama.net>
@ 2014-06-01  8:21     ` Marcel Apfelbaum
  2014-06-02 15:21       ` Eduardo Habkost
  0 siblings, 1 reply; 4+ messages in thread
From: Marcel Apfelbaum @ 2014-06-01  8:21 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: agraf, mst, qemu-devel, sw, mdroth, armbru, aliguori, Scott Wood,
	lcapitulino, afaerber

On Fri, 2014-05-30 at 16:25 -0300, Eduardo Habkost wrote:
> On Mon, May 26, 2014 at 03:40:58PM +0300, Marcel Apfelbaum wrote:
> [...]
> > +static void machine_initfn(Object *obj)
> > +{
> > +    object_property_add_str(obj, "accel",
> > +                            machine_get_accel, machine_set_accel, NULL);
> > +    object_property_add_bool(obj, "kernel_irqchip",
> > +                             machine_get_kernel_irqchip,
> > +                             machine_set_kernel_irqchip,
> > +                             NULL);
> 
> In the case of kernel_irqchip, the information contained in MachineState
> is not a superset of the information contained on
> qemu_get_machine_opts().
> 
> See hw/ppc/{e500,spapr}.c. They use kernel_irqchip like this:
> 
>     bool irqchip_allowed = qemu_opt_get_bool(machine_opts,
>                                             "kernel_irqchip", true);
>     bool irqchip_required = qemu_opt_get_bool(machine_opts,
>                                               "kernel_irqchip", false);
> 
>     if (irqchip_allowed) {
>         dev = ppce500_init_mpic_kvm(params, irqs);
>     }
> 
>     if (irqchip_required && !dev) {
>         fprintf(stderr, "%s: irqchip requested but unavailable\n",
>                 __func__);
>         abort();
>     }
> 
> This means kernel_irqchip have three possible states: "disabled", "required",
> and "allowed".
I already had a patch adding "property_is_set" to QMP, but was not accepted
as there is no way yet to "unset" a property. (I can point you to the series)

> 
> This means that MachineState.kernel_irqchip is not usable by current
> code that uses the kernel_irqchip option. I suppose we plan to address
> this on MachineState, too, to not get stuck with a global
> qemu_get_machine_opts() forever?
I completely agree with you and I already had a patch tackling it,
based on "property_is_set", but was no accepted yet, obviously.
I was instructed to set the default value in the machine init function
and some way (I don't remember now) to emulate  required/allowed.

I do plan to get back to this.

Thanks,
Marcel
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH V2 4/4] hw/machine: qemu machine opts as properties to QemuMachineState
  2014-06-01  8:21     ` Marcel Apfelbaum
@ 2014-06-02 15:21       ` Eduardo Habkost
  2014-06-05 11:49         ` Marcel Apfelbaum
  0 siblings, 1 reply; 4+ messages in thread
From: Eduardo Habkost @ 2014-06-02 15:21 UTC (permalink / raw)
  To: Marcel Apfelbaum
  Cc: agraf, mst, qemu-devel, sw, mdroth, armbru, aliguori, Scott Wood,
	lcapitulino, afaerber

On Sun, Jun 01, 2014 at 11:21:49AM +0300, Marcel Apfelbaum wrote:
> On Fri, 2014-05-30 at 16:25 -0300, Eduardo Habkost wrote:
> > On Mon, May 26, 2014 at 03:40:58PM +0300, Marcel Apfelbaum wrote:
> > [...]
> > > +static void machine_initfn(Object *obj)
> > > +{
> > > +    object_property_add_str(obj, "accel",
> > > +                            machine_get_accel, machine_set_accel, NULL);
> > > +    object_property_add_bool(obj, "kernel_irqchip",
> > > +                             machine_get_kernel_irqchip,
> > > +                             machine_set_kernel_irqchip,
> > > +                             NULL);
> > 
> > In the case of kernel_irqchip, the information contained in MachineState
> > is not a superset of the information contained on
> > qemu_get_machine_opts().
> > 
> > See hw/ppc/{e500,spapr}.c. They use kernel_irqchip like this:
> > 
> >     bool irqchip_allowed = qemu_opt_get_bool(machine_opts,
> >                                             "kernel_irqchip", true);
> >     bool irqchip_required = qemu_opt_get_bool(machine_opts,
> >                                               "kernel_irqchip", false);
> > 
> >     if (irqchip_allowed) {
> >         dev = ppce500_init_mpic_kvm(params, irqs);
> >     }
> > 
> >     if (irqchip_required && !dev) {
> >         fprintf(stderr, "%s: irqchip requested but unavailable\n",
> >                 __func__);
> >         abort();
> >     }
> > 
> > This means kernel_irqchip have three possible states: "disabled", "required",
> > and "allowed".
> I already had a patch adding "property_is_set" to QMP, but was not accepted
> as there is no way yet to "unset" a property. (I can point you to the series)
> 
> > 
> > This means that MachineState.kernel_irqchip is not usable by current
> > code that uses the kernel_irqchip option. I suppose we plan to address
> > this on MachineState, too, to not get stuck with a global
> > qemu_get_machine_opts() forever?
> I completely agree with you and I already had a patch tackling it,
> based on "property_is_set", but was no accepted yet, obviously.
> I was instructed to set the default value in the machine init function
> and some way (I don't remember now) to emulate  required/allowed.

I don't see a need to change to the object model and API. Just add
MachineState-specific properties/fields that are capable of representing
the state we need.

I see two simple solutions:

* Two boolean properties: require-kernel-irqchip and
disable-kernel-irqchip. The default being both set to false (meaning
irqchip is enabled automatically if available). We may still have a
third kernel_irqchip property for compatibility, that will change both
require-kernel-irqchip and disable-kernel-irqchip at the same time when
set.

* A string kernel_irqchip property which accepts three values: "on",
"off", and "auto".

Example of partial implementation of the first approach, below. I still
didn't add the two extra properties, and just let the code access the
require_kernel_irqchip and disable_kernel_irqchip fields directly.

Note that this is on top of some other changes I have been experimenting
with, changing the accelerator init functions to get MachineState as
argument. Git tree containing all work in progress can be seen at:
https://github.com/ehabkost/qemu-hacks/commits/work/machine-irqchip-tristate

    diff --git a/hw/core/machine.c b/hw/core/machine.c
    index cbba679..0797bc1 100644
    --- a/hw/core/machine.c
    +++ b/hw/core/machine.c
    @@ -31,14 +31,15 @@ static bool machine_get_kernel_irqchip(Object *obj, Error **errp)
     {
         MachineState *ms = MACHINE(obj);
     
    -    return ms->kernel_irqchip;
    +    return !ms->disable_kernel_irqchip;
     }
     
     static void machine_set_kernel_irqchip(Object *obj, bool value, Error **errp)
     {
         MachineState *ms = MACHINE(obj);
     
    -    ms->kernel_irqchip = value;
    +    ms->require_kernel_irqchip = value;
    +    ms->disable_kernel_irqchip = !value;
     }
     
     static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v,
    diff --git a/include/hw/boards.h b/include/hw/boards.h
    index 0389933..4a2daee 100644
    --- a/include/hw/boards.h
    +++ b/include/hw/boards.h
    @@ -99,7 +99,8 @@ struct MachineState {
         /*< public >*/
     
         char *accel;
    -    bool kernel_irqchip;
    +    bool require_kernel_irqchip;
    +    bool disable_kernel_irqchip;
         int kvm_shadow_mem;
         char *dtb;
         char *dumpdtb;
    diff --git a/kvm-all.c b/kvm-all.c
    index d2f4d7f..120bf70 100644
    --- a/kvm-all.c
    +++ b/kvm-all.c
    @@ -1315,11 +1315,11 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq)
                false);
     }
     
    -static int kvm_irqchip_create(KVMState *s)
    +static int kvm_irqchip_create(MachineState *ms, KVMState *s)
     {
         int ret;
     
    -    if (!qemu_opt_get_bool(qemu_get_machine_opts(), "kernel_irqchip", true) ||
    +    if (ms->disable_kernel_irqchip ||
             (!kvm_check_extension(s, KVM_CAP_IRQCHIP) &&
              (kvm_vm_enable_cap(s, KVM_CAP_S390_IRQCHIP, 0) < 0))) {
             return 0;
    @@ -1545,7 +1545,7 @@ void kvm_init(MachineState *ms, Error **errp)
             goto err;
         }
     
    -    ret = kvm_irqchip_create(s);
    +    ret = kvm_irqchip_create(ms, s);
         if (ret < 0) {
             error_setg_errno(&err, -ret, "kvm_irqchip_create failed");
             goto err;

-- 
Eduardo

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH V2 4/4] hw/machine: qemu machine opts as properties to QemuMachineState
  2014-06-02 15:21       ` Eduardo Habkost
@ 2014-06-05 11:49         ` Marcel Apfelbaum
  0 siblings, 0 replies; 4+ messages in thread
From: Marcel Apfelbaum @ 2014-06-05 11:49 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: agraf, mst, qemu-devel, sw, mdroth, armbru, aliguori, Scott Wood,
	lcapitulino, afaerber

On Mon, 2014-06-02 at 12:21 -0300, Eduardo Habkost wrote:
> On Sun, Jun 01, 2014 at 11:21:49AM +0300, Marcel Apfelbaum wrote:
> > On Fri, 2014-05-30 at 16:25 -0300, Eduardo Habkost wrote:
> > > On Mon, May 26, 2014 at 03:40:58PM +0300, Marcel Apfelbaum wrote:
> > > [...]
> > > > +static void machine_initfn(Object *obj)
> > > > +{
> > > > +    object_property_add_str(obj, "accel",
> > > > +                            machine_get_accel, machine_set_accel, NULL);
> > > > +    object_property_add_bool(obj, "kernel_irqchip",
> > > > +                             machine_get_kernel_irqchip,
> > > > +                             machine_set_kernel_irqchip,
> > > > +                             NULL);
> > > 
> > > In the case of kernel_irqchip, the information contained in MachineState
> > > is not a superset of the information contained on
> > > qemu_get_machine_opts().
> > > 
> > > See hw/ppc/{e500,spapr}.c. They use kernel_irqchip like this:
> > > 
> > >     bool irqchip_allowed = qemu_opt_get_bool(machine_opts,
> > >                                             "kernel_irqchip", true);
> > >     bool irqchip_required = qemu_opt_get_bool(machine_opts,
> > >                                               "kernel_irqchip", false);
> > > 
> > >     if (irqchip_allowed) {
> > >         dev = ppce500_init_mpic_kvm(params, irqs);
> > >     }
> > > 
> > >     if (irqchip_required && !dev) {
> > >         fprintf(stderr, "%s: irqchip requested but unavailable\n",
> > >                 __func__);
> > >         abort();
> > >     }
> > > 
> > > This means kernel_irqchip have three possible states: "disabled", "required",
> > > and "allowed".
> > I already had a patch adding "property_is_set" to QMP, but was not accepted
> > as there is no way yet to "unset" a property. (I can point you to the series)
> > 
> > > 
> > > This means that MachineState.kernel_irqchip is not usable by current
> > > code that uses the kernel_irqchip option. I suppose we plan to address
> > > this on MachineState, too, to not get stuck with a global
> > > qemu_get_machine_opts() forever?
> > I completely agree with you and I already had a patch tackling it,
> > based on "property_is_set", but was no accepted yet, obviously.
> > I was instructed to set the default value in the machine init function
> > and some way (I don't remember now) to emulate  required/allowed.
> 
> I don't see a need to change to the object model and API. Just add
> MachineState-specific properties/fields that are capable of representing
> the state we need.
> 
> I see two simple solutions:
> 
> * Two boolean properties: require-kernel-irqchip and
> disable-kernel-irqchip. The default being both set to false (meaning
> irqchip is enabled automatically if available). We may still have a
> third kernel_irqchip property for compatibility, that will change both
> require-kernel-irqchip and disable-kernel-irqchip at the same time when
> set.
> 
> * A string kernel_irqchip property which accepts three values: "on",
> "off", and "auto".
> 
> Example of partial implementation of the first approach, below. I still
> didn't add the two extra properties, and just let the code access the
> require_kernel_irqchip and disable_kernel_irqchip fields directly.
> 
> Note that this is on top of some other changes I have been experimenting
> with, changing the accelerator init functions to get MachineState as
> argument. Git tree containing all work in progress can be seen at:
> https://github.com/ehabkost/qemu-hacks/commits/work/machine-irqchip-tristate

Hi Eduardo, thanks for the example.

I would also chose with the first solution, but use {require, allowed}
instead of {required, disabled}, but in the end is the same logic.

Thanks,
Marcel

> 
>     diff --git a/hw/core/machine.c b/hw/core/machine.c
>     index cbba679..0797bc1 100644
>     --- a/hw/core/machine.c
>     +++ b/hw/core/machine.c
>     @@ -31,14 +31,15 @@ static bool machine_get_kernel_irqchip(Object *obj, Error **errp)
>      {
>          MachineState *ms = MACHINE(obj);
>      
>     -    return ms->kernel_irqchip;
>     +    return !ms->disable_kernel_irqchip;
>      }
>      
>      static void machine_set_kernel_irqchip(Object *obj, bool value, Error **errp)
>      {
>          MachineState *ms = MACHINE(obj);
>      
>     -    ms->kernel_irqchip = value;
>     +    ms->require_kernel_irqchip = value;
>     +    ms->disable_kernel_irqchip = !value;
>      }
>      
>      static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v,
>     diff --git a/include/hw/boards.h b/include/hw/boards.h
>     index 0389933..4a2daee 100644
>     --- a/include/hw/boards.h
>     +++ b/include/hw/boards.h
>     @@ -99,7 +99,8 @@ struct MachineState {
>          /*< public >*/
>      
>          char *accel;
>     -    bool kernel_irqchip;
>     +    bool require_kernel_irqchip;
>     +    bool disable_kernel_irqchip;
>          int kvm_shadow_mem;
>          char *dtb;
>          char *dumpdtb;
>     diff --git a/kvm-all.c b/kvm-all.c
>     index d2f4d7f..120bf70 100644
>     --- a/kvm-all.c
>     +++ b/kvm-all.c
>     @@ -1315,11 +1315,11 @@ int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq)
>                 false);
>      }
>      
>     -static int kvm_irqchip_create(KVMState *s)
>     +static int kvm_irqchip_create(MachineState *ms, KVMState *s)
>      {
>          int ret;
>      
>     -    if (!qemu_opt_get_bool(qemu_get_machine_opts(), "kernel_irqchip", true) ||
>     +    if (ms->disable_kernel_irqchip ||
>              (!kvm_check_extension(s, KVM_CAP_IRQCHIP) &&
>               (kvm_vm_enable_cap(s, KVM_CAP_S390_IRQCHIP, 0) < 0))) {
>              return 0;
>     @@ -1545,7 +1545,7 @@ void kvm_init(MachineState *ms, Error **errp)
>              goto err;
>          }
>      
>     -    ret = kvm_irqchip_create(s);
>     +    ret = kvm_irqchip_create(ms, s);
>          if (ret < 0) {
>              error_setg_errno(&err, -ret, "kvm_irqchip_create failed");
>              goto err;
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-06-05 11:49 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1401108058-27348-1-git-send-email-marcel.a@redhat.com>
     [not found] ` <1401108058-27348-5-git-send-email-marcel.a@redhat.com>
     [not found]   ` <20140530194530.GD15000@otherpad.lan.raisama.net>
2014-06-01  8:07     ` [Qemu-devel] [PATCH V2 4/4] hw/machine: qemu machine opts as properties to QemuMachineState Marcel Apfelbaum
     [not found]   ` <20140530192507.GC15000@otherpad.lan.raisama.net>
2014-06-01  8:21     ` Marcel Apfelbaum
2014-06-02 15:21       ` Eduardo Habkost
2014-06-05 11:49         ` Marcel Apfelbaum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).