diff mbox

[v3,4/4] ioapic: QOM'ify ioapic

Message ID 1383646565-13774-5-git-send-email-zxq_yx_007@163.com
State New
Headers show

Commit Message

zhao xiao qiang Nov. 5, 2013, 10:16 a.m. UTC
changes:
1. use type constant for kvm_ioapic and ioapic
2. convert 'init' to QOM's 'realize' for ioapic and kvm_ioapic
For QOM'ify, I move variable 'ioapic_no' from static to global.
Then we can drop the 'instance_no' argument. Now, it's child
that increase 'ioapic_no' counter.

Signed-off-by: xiaoqiang zhao <zxq_yx_007@163.com>
---
 hw/i386/kvm/ioapic.c              |   15 +++++++++------
 hw/intc/ioapic.c                  |   19 +++++++++++++------
 hw/intc/ioapic_common.c           |   13 ++++++++++---
 include/hw/i386/ioapic_internal.h |    3 ++-
 4 files changed, 34 insertions(+), 16 deletions(-)

Comments

Andreas Färber Dec. 18, 2013, 6:03 p.m. UTC | #1
Am 05.11.2013 11:16, schrieb xiaoqiang zhao:
> changes:
> 1. use type constant for kvm_ioapic and ioapic
> 2. convert 'init' to QOM's 'realize' for ioapic and kvm_ioapic
> For QOM'ify, I move variable 'ioapic_no' from static to global.
> Then we can drop the 'instance_no' argument. Now, it's child
> that increase 'ioapic_no' counter.
> 
> Signed-off-by: xiaoqiang zhao <zxq_yx_007@163.com>
> ---
>  hw/i386/kvm/ioapic.c              |   15 +++++++++------
>  hw/intc/ioapic.c                  |   19 +++++++++++++------
>  hw/intc/ioapic_common.c           |   13 ++++++++++---
>  include/hw/i386/ioapic_internal.h |    3 ++-
>  4 files changed, 34 insertions(+), 16 deletions(-)
> 
> diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
> index 772a712..36f7de2 100644
> --- a/hw/i386/kvm/ioapic.c
> +++ b/hw/i386/kvm/ioapic.c
> @@ -15,6 +15,8 @@
>  #include "hw/i386/apic_internal.h"
>  #include "sysemu/kvm.h"
>  
> +#define TYPE_KVM_IOAPIC "kvm-ioapic"
> +
>  /* PC Utility function */
>  void kvm_pc_setup_irq_routing(bool pci_enabled)
>  {
> @@ -127,12 +129,12 @@ static void kvm_ioapic_set_irq(void *opaque, int irq, int level)
>      apic_report_irq_delivered(delivered);
>  }
>  
> -static void kvm_ioapic_init(IOAPICCommonState *s, int instance_no)
> +static void kvm_ioapic_realize(DeviceState *dev, Error **errp)
>  {
> -    DeviceState *dev = DEVICE(s);
> -
> -    memory_region_init_reservation(&s->io_memory, NULL, "kvm-ioapic", 0x1000);
> +    IOAPICCommonState *s = IOAPIC_COMMON(dev);
>  
> +    memory_region_init_reservation(&s->io_memory, NULL,
> +                                   TYPE_KVM_IOAPIC, 0x1000);
>      qdev_init_gpio_in(dev, kvm_ioapic_set_irq, IOAPIC_NUM_PINS);
>  }
>  
> @@ -143,10 +145,11 @@ static Property kvm_ioapic_properties[] = {
>  
>  static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
>  {
> +
>      IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
>      DeviceClass *dc = DEVICE_CLASS(klass);
>  
> -    k->init      = kvm_ioapic_init;
> +    k->realize   = kvm_ioapic_realize;
>      k->pre_save  = kvm_ioapic_get;
>      k->post_load = kvm_ioapic_put;
>      dc->reset    = kvm_ioapic_reset;
> @@ -154,7 +157,7 @@ static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
>  }
>  
>  static const TypeInfo kvm_ioapic_info = {
> -    .name  = "kvm-ioapic",
> +    .name  = TYPE_KVM_IOAPIC,
>      .parent = TYPE_IOAPIC_COMMON,
>      .instance_size = sizeof(KVMIOAPICState),
>      .class_init = kvm_ioapic_class_init,
> diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
> index 8842845..885f385 100644
> --- a/hw/intc/ioapic.c
> +++ b/hw/intc/ioapic.c
> @@ -36,6 +36,10 @@
>  
>  static IOAPICCommonState *ioapics[MAX_IOAPICS];
>  
> +#define TYPE_IOAPIC "ioapic"
> +/* global variable from ioapic_common.c */
> +extern int ioapic_no;
> +
>  static void ioapic_service(IOAPICCommonState *s)
>  {
>      uint8_t i;
> @@ -225,16 +229,19 @@ static const MemoryRegionOps ioapic_io_ops = {
>      .endianness = DEVICE_NATIVE_ENDIAN,
>  };
>  
> -static void ioapic_init(IOAPICCommonState *s, int instance_no)
> +static void ioapic_realize(DeviceState *dev, Error **errp)
>  {
> -    DeviceState *dev = DEVICE(s);
> +    IOAPICCommonState *s = IOAPIC_COMMON(dev);
>  
>      memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
> -                          "ioapic", 0x1000);
> +                          TYPE_IOAPIC, 0x1000);
>  
>      qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
>  
> -    ioapics[instance_no] = s;
> +    ioapics[ioapic_no] = s;
> +
> +    /* increase the counter */
> +    ioapic_no++;

This increment used to happen in common code before, now it's done for
the non-KVM version only ...

>  }
>  
>  static void ioapic_class_init(ObjectClass *klass, void *data)
> @@ -242,12 +249,12 @@ static void ioapic_class_init(ObjectClass *klass, void *data)
>      IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
>      DeviceClass *dc = DEVICE_CLASS(klass);
>  
> -    k->init = ioapic_init;
> +    k->realize = ioapic_realize;
>      dc->reset = ioapic_reset_common;
>  }
>  
>  static const TypeInfo ioapic_info = {
> -    .name          = "ioapic",
> +    .name          = TYPE_IOAPIC,
>      .parent        = TYPE_IOAPIC_COMMON,
>      .instance_size = sizeof(IOAPICCommonState),
>      .class_init    = ioapic_class_init,
> diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
> index e55c6d1..aac0402 100644
> --- a/hw/intc/ioapic_common.c
> +++ b/hw/intc/ioapic_common.c
> @@ -23,6 +23,14 @@
>  #include "hw/i386/ioapic_internal.h"
>  #include "hw/sysbus.h"
>  
> +/* ioapic_no count start from 0 to MAX_IOAPICS,
> + * remove as static variable from ioapic_common_init.
> + * now as a global variable, let child to increase the counter
> + * then we can drop the 'instance_no' argument
> + * and convert to our QOM's realize function
> + */
> +int ioapic_no;
> +
>  void ioapic_reset_common(DeviceState *dev)
>  {
>      IOAPICCommonState *s = IOAPIC_COMMON(dev);
> @@ -61,7 +69,6 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
>  {
>      IOAPICCommonState *s = IOAPIC_COMMON(dev);
>      IOAPICCommonClass *info;
> -    static int ioapic_no;
>  
>      if (ioapic_no >= MAX_IOAPICS) {
>          error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS);

... while the check for max. IOAPICs still happens in common code.

Do we need to count KVM IOAPICs as well? Or can we consolidate this into
the non-KVM version and keep it static there?

Regards,
Andreas

> @@ -69,10 +76,10 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
>      }
>  
>      info = IOAPIC_COMMON_GET_CLASS(s);
> -    info->init(s, ioapic_no);
> +    info->realize(dev, errp);
>  
>      sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->io_memory);
> -    ioapic_no++;
> +
>  }
>  
>  static const VMStateDescription vmstate_ioapic_common = {
> diff --git a/include/hw/i386/ioapic_internal.h b/include/hw/i386/ioapic_internal.h
> index 25576c8..cbe4744 100644
> --- a/include/hw/i386/ioapic_internal.h
> +++ b/include/hw/i386/ioapic_internal.h
> @@ -83,7 +83,8 @@ typedef struct IOAPICCommonState IOAPICCommonState;
>  
>  typedef struct IOAPICCommonClass {
>      SysBusDeviceClass parent_class;
> -    void (*init)(IOAPICCommonState *s, int instance_no);
> +    /* QOM realize */
> +    DeviceRealize realize;
>      void (*pre_save)(IOAPICCommonState *s);
>      void (*post_load)(IOAPICCommonState *s);
>  } IOAPICCommonClass;
chenfan Dec. 19, 2013, 2:28 a.m. UTC | #2
On Wed, 2013-12-18 at 19:03 +0100, Andreas Färber wrote:
> Am 05.11.2013 11:16, schrieb xiaoqiang zhao:
> > changes:
> > 1. use type constant for kvm_ioapic and ioapic
> > 2. convert 'init' to QOM's 'realize' for ioapic and kvm_ioapic
> > For QOM'ify, I move variable 'ioapic_no' from static to global.
> > Then we can drop the 'instance_no' argument. Now, it's child
> > that increase 'ioapic_no' counter.
> > 
> > Signed-off-by: xiaoqiang zhao <zxq_yx_007@163.com>
> > ---
> >  hw/i386/kvm/ioapic.c              |   15 +++++++++------
> >  hw/intc/ioapic.c                  |   19 +++++++++++++------
> >  hw/intc/ioapic_common.c           |   13 ++++++++++---
> >  include/hw/i386/ioapic_internal.h |    3 ++-
> >  4 files changed, 34 insertions(+), 16 deletions(-)
> > 
> > diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
> > index 772a712..36f7de2 100644
> > --- a/hw/i386/kvm/ioapic.c
> > +++ b/hw/i386/kvm/ioapic.c
> > @@ -15,6 +15,8 @@
> >  #include "hw/i386/apic_internal.h"
> >  #include "sysemu/kvm.h"
> >  
> > +#define TYPE_KVM_IOAPIC "kvm-ioapic"
> > +
> >  /* PC Utility function */
> >  void kvm_pc_setup_irq_routing(bool pci_enabled)
> >  {
> > @@ -127,12 +129,12 @@ static void kvm_ioapic_set_irq(void *opaque, int irq, int level)
> >      apic_report_irq_delivered(delivered);
> >  }
> >  
> > -static void kvm_ioapic_init(IOAPICCommonState *s, int instance_no)
> > +static void kvm_ioapic_realize(DeviceState *dev, Error **errp)
> >  {
> > -    DeviceState *dev = DEVICE(s);
> > -
> > -    memory_region_init_reservation(&s->io_memory, NULL, "kvm-ioapic", 0x1000);
> > +    IOAPICCommonState *s = IOAPIC_COMMON(dev);
> >  
> > +    memory_region_init_reservation(&s->io_memory, NULL,
> > +                                   TYPE_KVM_IOAPIC, 0x1000);
> >      qdev_init_gpio_in(dev, kvm_ioapic_set_irq, IOAPIC_NUM_PINS);
> >  }
> >  
> > @@ -143,10 +145,11 @@ static Property kvm_ioapic_properties[] = {
> >  
> >  static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
> >  {
> > +
> >      IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
> >      DeviceClass *dc = DEVICE_CLASS(klass);
> >  
> > -    k->init      = kvm_ioapic_init;
> > +    k->realize   = kvm_ioapic_realize;
> >      k->pre_save  = kvm_ioapic_get;
> >      k->post_load = kvm_ioapic_put;
> >      dc->reset    = kvm_ioapic_reset;
> > @@ -154,7 +157,7 @@ static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
> >  }
> >  
> >  static const TypeInfo kvm_ioapic_info = {
> > -    .name  = "kvm-ioapic",
> > +    .name  = TYPE_KVM_IOAPIC,
> >      .parent = TYPE_IOAPIC_COMMON,
> >      .instance_size = sizeof(KVMIOAPICState),
> >      .class_init = kvm_ioapic_class_init,
> > diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
> > index 8842845..885f385 100644
> > --- a/hw/intc/ioapic.c
> > +++ b/hw/intc/ioapic.c
> > @@ -36,6 +36,10 @@
> >  
> >  static IOAPICCommonState *ioapics[MAX_IOAPICS];
> >  
> > +#define TYPE_IOAPIC "ioapic"
> > +/* global variable from ioapic_common.c */
> > +extern int ioapic_no;
> > +
> >  static void ioapic_service(IOAPICCommonState *s)
> >  {
> >      uint8_t i;
> > @@ -225,16 +229,19 @@ static const MemoryRegionOps ioapic_io_ops = {
> >      .endianness = DEVICE_NATIVE_ENDIAN,
> >  };
> >  
> > -static void ioapic_init(IOAPICCommonState *s, int instance_no)
> > +static void ioapic_realize(DeviceState *dev, Error **errp)
> >  {
> > -    DeviceState *dev = DEVICE(s);
> > +    IOAPICCommonState *s = IOAPIC_COMMON(dev);
> >  
> >      memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
> > -                          "ioapic", 0x1000);
> > +                          TYPE_IOAPIC, 0x1000);
> >  
> >      qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
> >  
> > -    ioapics[instance_no] = s;
> > +    ioapics[ioapic_no] = s;
> > +
> > +    /* increase the counter */
> > +    ioapic_no++;
> 
> This increment used to happen in common code before, now it's done for
> the non-KVM version only ...

Due to IOAPICS are not more then one, why did not we get rid of
ioapic_no and ioapics, to use one ioapics pointer instead of ioapics[] ?

Thanks,
Chen

> 
> >  }
> >  
> >  static void ioapic_class_init(ObjectClass *klass, void *data)
> > @@ -242,12 +249,12 @@ static void ioapic_class_init(ObjectClass *klass, void *data)
> >      IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
> >      DeviceClass *dc = DEVICE_CLASS(klass);
> >  
> > -    k->init = ioapic_init;
> > +    k->realize = ioapic_realize;
> >      dc->reset = ioapic_reset_common;
> >  }
> >  
> >  static const TypeInfo ioapic_info = {
> > -    .name          = "ioapic",
> > +    .name          = TYPE_IOAPIC,
> >      .parent        = TYPE_IOAPIC_COMMON,
> >      .instance_size = sizeof(IOAPICCommonState),
> >      .class_init    = ioapic_class_init,
> > diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
> > index e55c6d1..aac0402 100644
> > --- a/hw/intc/ioapic_common.c
> > +++ b/hw/intc/ioapic_common.c
> > @@ -23,6 +23,14 @@
> >  #include "hw/i386/ioapic_internal.h"
> >  #include "hw/sysbus.h"
> >  
> > +/* ioapic_no count start from 0 to MAX_IOAPICS,
> > + * remove as static variable from ioapic_common_init.
> > + * now as a global variable, let child to increase the counter
> > + * then we can drop the 'instance_no' argument
> > + * and convert to our QOM's realize function
> > + */
> > +int ioapic_no;
> > +
> >  void ioapic_reset_common(DeviceState *dev)
> >  {
> >      IOAPICCommonState *s = IOAPIC_COMMON(dev);
> > @@ -61,7 +69,6 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
> >  {
> >      IOAPICCommonState *s = IOAPIC_COMMON(dev);
> >      IOAPICCommonClass *info;
> > -    static int ioapic_no;
> >  
> >      if (ioapic_no >= MAX_IOAPICS) {
> >          error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS);
> 
> ... while the check for max. IOAPICs still happens in common code.
> 
> Do we need to count KVM IOAPICs as well? Or can we consolidate this into
> the non-KVM version and keep it static there?
> 
> Regards,
> Andreas
> 
> > @@ -69,10 +76,10 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
> >      }
> >  
> >      info = IOAPIC_COMMON_GET_CLASS(s);
> > -    info->init(s, ioapic_no);
> > +    info->realize(dev, errp);
> >  
> >      sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->io_memory);
> > -    ioapic_no++;
> > +
> >  }
> >  
> >  static const VMStateDescription vmstate_ioapic_common = {
> > diff --git a/include/hw/i386/ioapic_internal.h b/include/hw/i386/ioapic_internal.h
> > index 25576c8..cbe4744 100644
> > --- a/include/hw/i386/ioapic_internal.h
> > +++ b/include/hw/i386/ioapic_internal.h
> > @@ -83,7 +83,8 @@ typedef struct IOAPICCommonState IOAPICCommonState;
> >  
> >  typedef struct IOAPICCommonClass {
> >      SysBusDeviceClass parent_class;
> > -    void (*init)(IOAPICCommonState *s, int instance_no);
> > +    /* QOM realize */
> > +    DeviceRealize realize;
> >      void (*pre_save)(IOAPICCommonState *s);
> >      void (*post_load)(IOAPICCommonState *s);
> >  } IOAPICCommonClass;
>
zhao xiao qiang Dec. 19, 2013, 2:42 a.m. UTC | #3
于 12/19/2013 10:28 AM, Chen Fan 写道:
> On Wed, 2013-12-18 at 19:03 +0100, Andreas Färber wrote:
>> Am 05.11.2013 11:16, schrieb xiaoqiang zhao:
>>> changes:
>>> 1. use type constant for kvm_ioapic and ioapic
>>> 2. convert 'init' to QOM's 'realize' for ioapic and kvm_ioapic
>>> For QOM'ify, I move variable 'ioapic_no' from static to global.
>>> Then we can drop the 'instance_no' argument. Now, it's child
>>> that increase 'ioapic_no' counter.
>>>
>>> Signed-off-by: xiaoqiang zhao <zxq_yx_007@163.com>
>>> ---
>>>   hw/i386/kvm/ioapic.c              |   15 +++++++++------
>>>   hw/intc/ioapic.c                  |   19 +++++++++++++------
>>>   hw/intc/ioapic_common.c           |   13 ++++++++++---
>>>   include/hw/i386/ioapic_internal.h |    3 ++-
>>>   4 files changed, 34 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
>>> index 772a712..36f7de2 100644
>>> --- a/hw/i386/kvm/ioapic.c
>>> +++ b/hw/i386/kvm/ioapic.c
>>> @@ -15,6 +15,8 @@
>>>   #include "hw/i386/apic_internal.h"
>>>   #include "sysemu/kvm.h"
>>>   
>>> +#define TYPE_KVM_IOAPIC "kvm-ioapic"
>>> +
>>>   /* PC Utility function */
>>>   void kvm_pc_setup_irq_routing(bool pci_enabled)
>>>   {
>>> @@ -127,12 +129,12 @@ static void kvm_ioapic_set_irq(void *opaque, int irq, int level)
>>>       apic_report_irq_delivered(delivered);
>>>   }
>>>   
>>> -static void kvm_ioapic_init(IOAPICCommonState *s, int instance_no)
>>> +static void kvm_ioapic_realize(DeviceState *dev, Error **errp)
>>>   {
>>> -    DeviceState *dev = DEVICE(s);
>>> -
>>> -    memory_region_init_reservation(&s->io_memory, NULL, "kvm-ioapic", 0x1000);
>>> +    IOAPICCommonState *s = IOAPIC_COMMON(dev);
>>>   
>>> +    memory_region_init_reservation(&s->io_memory, NULL,
>>> +                                   TYPE_KVM_IOAPIC, 0x1000);
>>>       qdev_init_gpio_in(dev, kvm_ioapic_set_irq, IOAPIC_NUM_PINS);
>>>   }
>>>   
>>> @@ -143,10 +145,11 @@ static Property kvm_ioapic_properties[] = {
>>>   
>>>   static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
>>>   {
>>> +
>>>       IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
>>>       DeviceClass *dc = DEVICE_CLASS(klass);
>>>   
>>> -    k->init      = kvm_ioapic_init;
>>> +    k->realize   = kvm_ioapic_realize;
>>>       k->pre_save  = kvm_ioapic_get;
>>>       k->post_load = kvm_ioapic_put;
>>>       dc->reset    = kvm_ioapic_reset;
>>> @@ -154,7 +157,7 @@ static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
>>>   }
>>>   
>>>   static const TypeInfo kvm_ioapic_info = {
>>> -    .name  = "kvm-ioapic",
>>> +    .name  = TYPE_KVM_IOAPIC,
>>>       .parent = TYPE_IOAPIC_COMMON,
>>>       .instance_size = sizeof(KVMIOAPICState),
>>>       .class_init = kvm_ioapic_class_init,
>>> diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
>>> index 8842845..885f385 100644
>>> --- a/hw/intc/ioapic.c
>>> +++ b/hw/intc/ioapic.c
>>> @@ -36,6 +36,10 @@
>>>   
>>>   static IOAPICCommonState *ioapics[MAX_IOAPICS];
>>>   
>>> +#define TYPE_IOAPIC "ioapic"
>>> +/* global variable from ioapic_common.c */
>>> +extern int ioapic_no;
>>> +
>>>   static void ioapic_service(IOAPICCommonState *s)
>>>   {
>>>       uint8_t i;
>>> @@ -225,16 +229,19 @@ static const MemoryRegionOps ioapic_io_ops = {
>>>       .endianness = DEVICE_NATIVE_ENDIAN,
>>>   };
>>>   
>>> -static void ioapic_init(IOAPICCommonState *s, int instance_no)
>>> +static void ioapic_realize(DeviceState *dev, Error **errp)
>>>   {
>>> -    DeviceState *dev = DEVICE(s);
>>> +    IOAPICCommonState *s = IOAPIC_COMMON(dev);
>>>   
>>>       memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
>>> -                          "ioapic", 0x1000);
>>> +                          TYPE_IOAPIC, 0x1000);
>>>   
>>>       qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
>>>   
>>> -    ioapics[instance_no] = s;
>>> +    ioapics[ioapic_no] = s;
>>> +
>>> +    /* increase the counter */
>>> +    ioapic_no++;
>> This increment used to happen in common code before, now it's done for
>> the non-KVM version only ...
> Due to IOAPICS are not more then one, why did not we get rid of
> ioapic_no and ioapics, to use one ioapics pointer instead of ioapics[] ?
>
> Thanks,
> Chen
>
>>>   }
>>>   
>>>   static void ioapic_class_init(ObjectClass *klass, void *data)
>>> @@ -242,12 +249,12 @@ static void ioapic_class_init(ObjectClass *klass, void *data)
>>>       IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
>>>       DeviceClass *dc = DEVICE_CLASS(klass);
>>>   
>>> -    k->init = ioapic_init;
>>> +    k->realize = ioapic_realize;
>>>       dc->reset = ioapic_reset_common;
>>>   }
>>>   
>>>   static const TypeInfo ioapic_info = {
>>> -    .name          = "ioapic",
>>> +    .name          = TYPE_IOAPIC,
>>>       .parent        = TYPE_IOAPIC_COMMON,
>>>       .instance_size = sizeof(IOAPICCommonState),
>>>       .class_init    = ioapic_class_init,
>>> diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
>>> index e55c6d1..aac0402 100644
>>> --- a/hw/intc/ioapic_common.c
>>> +++ b/hw/intc/ioapic_common.c
>>> @@ -23,6 +23,14 @@
>>>   #include "hw/i386/ioapic_internal.h"
>>>   #include "hw/sysbus.h"
>>>   
>>> +/* ioapic_no count start from 0 to MAX_IOAPICS,
>>> + * remove as static variable from ioapic_common_init.
>>> + * now as a global variable, let child to increase the counter
>>> + * then we can drop the 'instance_no' argument
>>> + * and convert to our QOM's realize function
>>> + */
>>> +int ioapic_no;
>>> +
>>>   void ioapic_reset_common(DeviceState *dev)
>>>   {
>>>       IOAPICCommonState *s = IOAPIC_COMMON(dev);
>>> @@ -61,7 +69,6 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
>>>   {
>>>       IOAPICCommonState *s = IOAPIC_COMMON(dev);
>>>       IOAPICCommonClass *info;
>>> -    static int ioapic_no;
>>>   
>>>       if (ioapic_no >= MAX_IOAPICS) {
>>>           error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS);
>> ... while the check for max. IOAPICs still happens in common code.
>>
>> Do we need to count KVM IOAPICs as well? Or can we consolidate this into
>> the non-KVM version and keep it static there?
>>
>> Regards,
>> Andreas
>>
>>> @@ -69,10 +76,10 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
>>>       }
>>>   
>>>       info = IOAPIC_COMMON_GET_CLASS(s);
>>> -    info->init(s, ioapic_no);
>>> +    info->realize(dev, errp);
>>>   
>>>       sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->io_memory);
>>> -    ioapic_no++;
>>> +
>>>   }
>>>   
>>>   static const VMStateDescription vmstate_ioapic_common = {
>>> diff --git a/include/hw/i386/ioapic_internal.h b/include/hw/i386/ioapic_internal.h
>>> index 25576c8..cbe4744 100644
>>> --- a/include/hw/i386/ioapic_internal.h
>>> +++ b/include/hw/i386/ioapic_internal.h
>>> @@ -83,7 +83,8 @@ typedef struct IOAPICCommonState IOAPICCommonState;
>>>   
>>>   typedef struct IOAPICCommonClass {
>>>       SysBusDeviceClass parent_class;
>>> -    void (*init)(IOAPICCommonState *s, int instance_no);
>>> +    /* QOM realize */
>>> +    DeviceRealize realize;
>>>       void (*pre_save)(IOAPICCommonState *s);
>>>       void (*post_load)(IOAPICCommonState *s);
>>>   } IOAPICCommonClass;
>
> Due to IOAPICS are not more then one, why did not we get rid of
> ioapic_no and ioapics, to use one ioapics pointer instead of ioapics[] ?

     According to intel manul, in a system, IOAPIC can be more than one 
. So, i think developers want to keep
   this compatibility.
Paolo Bonzini Dec. 19, 2013, 2:20 p.m. UTC | #4
Il 18/12/2013 19:03, Andreas Färber ha scritto:
>> > @@ -61,7 +69,6 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
>> >  {
>> >      IOAPICCommonState *s = IOAPIC_COMMON(dev);
>> >      IOAPICCommonClass *info;
>> > -    static int ioapic_no;
>> >  
>> >      if (ioapic_no >= MAX_IOAPICS) {
>> >          error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS);
> ... while the check for max. IOAPICs still happens in common code.
> 
> Do we need to count KVM IOAPICs as well? Or can we consolidate this into
> the non-KVM version and keep it static there?

KVM only supports one IOAPIC.  Creating a second fails with EEXIST.

Paolo
Andreas Färber Dec. 20, 2013, 11:18 a.m. UTC | #5
Am 19.12.2013 15:20, schrieb Paolo Bonzini:
> Il 18/12/2013 19:03, Andreas Färber ha scritto:
>>>> @@ -61,7 +69,6 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp)
>>>>  {
>>>>      IOAPICCommonState *s = IOAPIC_COMMON(dev);
>>>>      IOAPICCommonClass *info;
>>>> -    static int ioapic_no;
>>>>  
>>>>      if (ioapic_no >= MAX_IOAPICS) {
>>>>          error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS);
>> ... while the check for max. IOAPICs still happens in common code.
>>
>> Do we need to count KVM IOAPICs as well? Or can we consolidate this into
>> the non-KVM version and keep it static there?
> 
> KVM only supports one IOAPIC.  Creating a second fails with EEXIST.

As it turns out, MAX_IOAPICS is 1, so covers both cases. No KVM ioctl
actually happens on realize for using said EEXIST, so I moved the
increment back to where it was, minimizing changes.

If we want to redesign it, that can still be done in a follow-up patch.

Thanks,
Andreas
zhao xiao qiang Dec. 20, 2013, 11:02 p.m. UTC | #6
OK. Thx Andreas! 在2013年12月20日 19:18, Andreas Färber写道: Am 19.12.2013 15:20, schrieb Paolo Bonzini: > Il 18/12/2013 19:03, Andreas Färber ha scritto: >>>> @@ -61,7 +69,6 @@ static void ioapic_common_realize(DeviceState *dev, Error **errp) >>>>  { >>>>      IOAPICCommonState *s = IOAPIC_COMMON(dev); >>>>      IOAPICCommonClass *info; >>>> -    static int ioapic_no; >>>>   >>>>      if (ioapic_no >= MAX_IOAPICS) { >>>>          error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS); >> ... while the check for max. IOAPICs still happens in common code. >> >> Do we need to count KVM IOAPICs as well? Or can we consolidate this into >> the non-KVM version and keep it static there? > > KVM only supports one IOAPIC.  Creating a second fails with EEXIST. As it turns out, MAX_IOAPICS is 1, so covers both cases. No KVM ioctl actually happens on realize for using said EEXIST, so I moved the increment back to where it was, minimizing changes. If we want to redesign it, that can still be done in a follow-up patch. Thanks, Andreas -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
diff mbox

Patch

diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
index 772a712..36f7de2 100644
--- a/hw/i386/kvm/ioapic.c
+++ b/hw/i386/kvm/ioapic.c
@@ -15,6 +15,8 @@ 
 #include "hw/i386/apic_internal.h"
 #include "sysemu/kvm.h"
 
+#define TYPE_KVM_IOAPIC "kvm-ioapic"
+
 /* PC Utility function */
 void kvm_pc_setup_irq_routing(bool pci_enabled)
 {
@@ -127,12 +129,12 @@  static void kvm_ioapic_set_irq(void *opaque, int irq, int level)
     apic_report_irq_delivered(delivered);
 }
 
-static void kvm_ioapic_init(IOAPICCommonState *s, int instance_no)
+static void kvm_ioapic_realize(DeviceState *dev, Error **errp)
 {
-    DeviceState *dev = DEVICE(s);
-
-    memory_region_init_reservation(&s->io_memory, NULL, "kvm-ioapic", 0x1000);
+    IOAPICCommonState *s = IOAPIC_COMMON(dev);
 
+    memory_region_init_reservation(&s->io_memory, NULL,
+                                   TYPE_KVM_IOAPIC, 0x1000);
     qdev_init_gpio_in(dev, kvm_ioapic_set_irq, IOAPIC_NUM_PINS);
 }
 
@@ -143,10 +145,11 @@  static Property kvm_ioapic_properties[] = {
 
 static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
 {
+
     IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    k->init      = kvm_ioapic_init;
+    k->realize   = kvm_ioapic_realize;
     k->pre_save  = kvm_ioapic_get;
     k->post_load = kvm_ioapic_put;
     dc->reset    = kvm_ioapic_reset;
@@ -154,7 +157,7 @@  static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo kvm_ioapic_info = {
-    .name  = "kvm-ioapic",
+    .name  = TYPE_KVM_IOAPIC,
     .parent = TYPE_IOAPIC_COMMON,
     .instance_size = sizeof(KVMIOAPICState),
     .class_init = kvm_ioapic_class_init,
diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
index 8842845..885f385 100644
--- a/hw/intc/ioapic.c
+++ b/hw/intc/ioapic.c
@@ -36,6 +36,10 @@ 
 
 static IOAPICCommonState *ioapics[MAX_IOAPICS];
 
+#define TYPE_IOAPIC "ioapic"
+/* global variable from ioapic_common.c */
+extern int ioapic_no;
+
 static void ioapic_service(IOAPICCommonState *s)
 {
     uint8_t i;
@@ -225,16 +229,19 @@  static const MemoryRegionOps ioapic_io_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void ioapic_init(IOAPICCommonState *s, int instance_no)
+static void ioapic_realize(DeviceState *dev, Error **errp)
 {
-    DeviceState *dev = DEVICE(s);
+    IOAPICCommonState *s = IOAPIC_COMMON(dev);
 
     memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
-                          "ioapic", 0x1000);
+                          TYPE_IOAPIC, 0x1000);
 
     qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
 
-    ioapics[instance_no] = s;
+    ioapics[ioapic_no] = s;
+
+    /* increase the counter */
+    ioapic_no++;
 }
 
 static void ioapic_class_init(ObjectClass *klass, void *data)
@@ -242,12 +249,12 @@  static void ioapic_class_init(ObjectClass *klass, void *data)
     IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
     DeviceClass *dc = DEVICE_CLASS(klass);
 
-    k->init = ioapic_init;
+    k->realize = ioapic_realize;
     dc->reset = ioapic_reset_common;
 }
 
 static const TypeInfo ioapic_info = {
-    .name          = "ioapic",
+    .name          = TYPE_IOAPIC,
     .parent        = TYPE_IOAPIC_COMMON,
     .instance_size = sizeof(IOAPICCommonState),
     .class_init    = ioapic_class_init,
diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
index e55c6d1..aac0402 100644
--- a/hw/intc/ioapic_common.c
+++ b/hw/intc/ioapic_common.c
@@ -23,6 +23,14 @@ 
 #include "hw/i386/ioapic_internal.h"
 #include "hw/sysbus.h"
 
+/* ioapic_no count start from 0 to MAX_IOAPICS,
+ * remove as static variable from ioapic_common_init.
+ * now as a global variable, let child to increase the counter
+ * then we can drop the 'instance_no' argument
+ * and convert to our QOM's realize function
+ */
+int ioapic_no;
+
 void ioapic_reset_common(DeviceState *dev)
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
@@ -61,7 +69,6 @@  static void ioapic_common_realize(DeviceState *dev, Error **errp)
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
     IOAPICCommonClass *info;
-    static int ioapic_no;
 
     if (ioapic_no >= MAX_IOAPICS) {
         error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS);
@@ -69,10 +76,10 @@  static void ioapic_common_realize(DeviceState *dev, Error **errp)
     }
 
     info = IOAPIC_COMMON_GET_CLASS(s);
-    info->init(s, ioapic_no);
+    info->realize(dev, errp);
 
     sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->io_memory);
-    ioapic_no++;
+
 }
 
 static const VMStateDescription vmstate_ioapic_common = {
diff --git a/include/hw/i386/ioapic_internal.h b/include/hw/i386/ioapic_internal.h
index 25576c8..cbe4744 100644
--- a/include/hw/i386/ioapic_internal.h
+++ b/include/hw/i386/ioapic_internal.h
@@ -83,7 +83,8 @@  typedef struct IOAPICCommonState IOAPICCommonState;
 
 typedef struct IOAPICCommonClass {
     SysBusDeviceClass parent_class;
-    void (*init)(IOAPICCommonState *s, int instance_no);
+    /* QOM realize */
+    DeviceRealize realize;
     void (*pre_save)(IOAPICCommonState *s);
     void (*post_load)(IOAPICCommonState *s);
 } IOAPICCommonClass;