diff mbox series

[09/10] spapr/irq: Use the "simple" ICS class for KVM

Message ID 155023083585.1011724.2868047424353921455.stgit@bahia.lan (mailing list archive)
State New, archived
Headers show
Series xics: Get rid of KVM specific classes | expand

Commit Message

Greg Kurz Feb. 15, 2019, 11:40 a.m. UTC
The "simple" ICS class knows how to interract with KVM. Adapt sPAPR to use
it instead of the ICS KVM class.

Signed-off-by: Greg Kurz <groug@kaod.org>
---
 hw/ppc/spapr_irq.c |   15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

Comments

Cédric Le Goater Feb. 15, 2019, 1:02 p.m. UTC | #1
On 2/15/19 12:40 PM, Greg Kurz wrote:
> The "simple" ICS class knows how to interract with KVM. Adapt sPAPR to use
> it instead of the ICS KVM class.

You are changing the type name. What about migration ? 

Can't we move the xics_kvm_init() and xics_spapr_init() call under 
spapr_ics_create() ? It would simplify a lot the routine I think
if these were done before creating the ICSState. 

C.

> Signed-off-by: Greg Kurz <groug@kaod.org>
> ---
>  hw/ppc/spapr_irq.c |   15 +++++++--------
>  1 file changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> index 9f43b7b3bf16..4aa8165307c7 100644
> --- a/hw/ppc/spapr_irq.c
> +++ b/hw/ppc/spapr_irq.c
> @@ -67,13 +67,12 @@ void spapr_irq_msi_reset(sPAPRMachineState *spapr)
>   */
>  
>  static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
> -                                  const char *type_ics,
>                                    int nr_irqs, Error **errp)
>  {
>      Error *local_err = NULL;
>      Object *obj;
>  
> -    obj = object_new(type_ics);
> +    obj = object_new(TYPE_ICS_SIMPLE);
>      object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort);
>      object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr),
>                                     &error_abort);
> @@ -98,14 +97,14 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
>  {
>      MachineState *machine = MACHINE(spapr);
>      Error *local_err = NULL;
> +    bool xics_kvm = false;
>  
>      if (kvm_enabled()) {
>          if (machine_kernel_irqchip_allowed(machine) &&
>              !xics_kvm_init(spapr, &local_err)) {
> -            spapr->ics = spapr_ics_create(spapr, TYPE_ICS_KVM, nr_irqs,
> -                                          &local_err);
> +            xics_kvm = true;
>          }
> -        if (machine_kernel_irqchip_required(machine) && !spapr->ics) {
> +        if (machine_kernel_irqchip_required(machine) && !xics_kvm) {
>              error_prepend(&local_err,
>                            "kernel_irqchip requested but unavailable: ");
>              goto error;
> @@ -114,12 +113,12 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
>          local_err = NULL;
>      }
>  
> -    if (!spapr->ics) {
> +    if (!xics_kvm) {
>          xics_spapr_init(spapr);
> -        spapr->ics = spapr_ics_create(spapr, TYPE_ICS_SIMPLE, nr_irqs,
> -                                      &local_err);
>      }
>  
> +    spapr->ics = spapr_ics_create(spapr, nr_irqs, &local_err);
> +
>  error:
>      error_propagate(errp, local_err);
>  }
>
Greg Kurz Feb. 15, 2019, 1:32 p.m. UTC | #2
On Fri, 15 Feb 2019 14:02:16 +0100
Cédric Le Goater <clg@kaod.org> wrote:

> On 2/15/19 12:40 PM, Greg Kurz wrote:
> > The "simple" ICS class knows how to interract with KVM. Adapt sPAPR to use
> > it instead of the ICS KVM class.  
> 
> You are changing the type name. What about migration ? 
> 

Huh ?!? I don't see how the type name would relate to migration. AFAICT they
aren't being referred to in the vmstate descriptors in xics.c.

> Can't we move the xics_kvm_init() and xics_spapr_init() call under 
> spapr_ics_create() ? It would simplify a lot the routine I think
> if these were done before creating the ICSState. 
> 

I'll look into that if there's a v2 or else in a followup patch.

> C.
> 
> > Signed-off-by: Greg Kurz <groug@kaod.org>
> > ---
> >  hw/ppc/spapr_irq.c |   15 +++++++--------
> >  1 file changed, 7 insertions(+), 8 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> > index 9f43b7b3bf16..4aa8165307c7 100644
> > --- a/hw/ppc/spapr_irq.c
> > +++ b/hw/ppc/spapr_irq.c
> > @@ -67,13 +67,12 @@ void spapr_irq_msi_reset(sPAPRMachineState *spapr)
> >   */
> >  
> >  static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
> > -                                  const char *type_ics,
> >                                    int nr_irqs, Error **errp)
> >  {
> >      Error *local_err = NULL;
> >      Object *obj;
> >  
> > -    obj = object_new(type_ics);
> > +    obj = object_new(TYPE_ICS_SIMPLE);
> >      object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort);
> >      object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr),
> >                                     &error_abort);
> > @@ -98,14 +97,14 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
> >  {
> >      MachineState *machine = MACHINE(spapr);
> >      Error *local_err = NULL;
> > +    bool xics_kvm = false;
> >  
> >      if (kvm_enabled()) {
> >          if (machine_kernel_irqchip_allowed(machine) &&
> >              !xics_kvm_init(spapr, &local_err)) {
> > -            spapr->ics = spapr_ics_create(spapr, TYPE_ICS_KVM, nr_irqs,
> > -                                          &local_err);
> > +            xics_kvm = true;
> >          }
> > -        if (machine_kernel_irqchip_required(machine) && !spapr->ics) {
> > +        if (machine_kernel_irqchip_required(machine) && !xics_kvm) {
> >              error_prepend(&local_err,
> >                            "kernel_irqchip requested but unavailable: ");
> >              goto error;
> > @@ -114,12 +113,12 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
> >          local_err = NULL;
> >      }
> >  
> > -    if (!spapr->ics) {
> > +    if (!xics_kvm) {
> >          xics_spapr_init(spapr);
> > -        spapr->ics = spapr_ics_create(spapr, TYPE_ICS_SIMPLE, nr_irqs,
> > -                                      &local_err);
> >      }
> >  
> > +    spapr->ics = spapr_ics_create(spapr, nr_irqs, &local_err);
> > +
> >  error:
> >      error_propagate(errp, local_err);
> >  }
> >   
>
Cédric Le Goater Feb. 15, 2019, 1:37 p.m. UTC | #3
On 2/15/19 2:32 PM, Greg Kurz wrote:
> On Fri, 15 Feb 2019 14:02:16 +0100
> Cédric Le Goater <clg@kaod.org> wrote:
> 
>> On 2/15/19 12:40 PM, Greg Kurz wrote:
>>> The "simple" ICS class knows how to interract with KVM. Adapt sPAPR to use
>>> it instead of the ICS KVM class.  
>>
>> You are changing the type name. What about migration ? 
>>
> 
> Huh ?!? I don't see how the type name would relate to migration. AFAICT they
> aren't being referred to in the vmstate descriptors in xics.c.

In that case all is fine.

C. 
>> Can't we move the xics_kvm_init() and xics_spapr_init() call under 
>> spapr_ics_create() ? It would simplify a lot the routine I think
>> if these were done before creating the ICSState. 
>>
> 
> I'll look into that if there's a v2 or else in a followup patch.
> 
>> C.
>>
>>> Signed-off-by: Greg Kurz <groug@kaod.org>
>>> ---
>>>  hw/ppc/spapr_irq.c |   15 +++++++--------
>>>  1 file changed, 7 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
>>> index 9f43b7b3bf16..4aa8165307c7 100644
>>> --- a/hw/ppc/spapr_irq.c
>>> +++ b/hw/ppc/spapr_irq.c
>>> @@ -67,13 +67,12 @@ void spapr_irq_msi_reset(sPAPRMachineState *spapr)
>>>   */
>>>  
>>>  static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
>>> -                                  const char *type_ics,
>>>                                    int nr_irqs, Error **errp)
>>>  {
>>>      Error *local_err = NULL;
>>>      Object *obj;
>>>  
>>> -    obj = object_new(type_ics);
>>> +    obj = object_new(TYPE_ICS_SIMPLE);
>>>      object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort);
>>>      object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr),
>>>                                     &error_abort);
>>> @@ -98,14 +97,14 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
>>>  {
>>>      MachineState *machine = MACHINE(spapr);
>>>      Error *local_err = NULL;
>>> +    bool xics_kvm = false;
>>>  
>>>      if (kvm_enabled()) {
>>>          if (machine_kernel_irqchip_allowed(machine) &&
>>>              !xics_kvm_init(spapr, &local_err)) {
>>> -            spapr->ics = spapr_ics_create(spapr, TYPE_ICS_KVM, nr_irqs,
>>> -                                          &local_err);
>>> +            xics_kvm = true;
>>>          }
>>> -        if (machine_kernel_irqchip_required(machine) && !spapr->ics) {
>>> +        if (machine_kernel_irqchip_required(machine) && !xics_kvm) {
>>>              error_prepend(&local_err,
>>>                            "kernel_irqchip requested but unavailable: ");
>>>              goto error;
>>> @@ -114,12 +113,12 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
>>>          local_err = NULL;
>>>      }
>>>  
>>> -    if (!spapr->ics) {
>>> +    if (!xics_kvm) {
>>>          xics_spapr_init(spapr);
>>> -        spapr->ics = spapr_ics_create(spapr, TYPE_ICS_SIMPLE, nr_irqs,
>>> -                                      &local_err);
>>>      }
>>>  
>>> +    spapr->ics = spapr_ics_create(spapr, nr_irqs, &local_err);
>>> +
>>>  error:
>>>      error_propagate(errp, local_err);
>>>  }
>>>   
>>
>
David Gibson Feb. 17, 2019, 11:49 p.m. UTC | #4
On Fri, Feb 15, 2019 at 02:02:16PM +0100, Cédric Le Goater wrote:
> On 2/15/19 12:40 PM, Greg Kurz wrote:
> > The "simple" ICS class knows how to interract with KVM. Adapt sPAPR to use
> > it instead of the ICS KVM class.
> 
> You are changing the type name. What about migration ?

As with ICP this would be a problem if the ics-kvm class had any extra
migration state, but it doesn't.
David Gibson Feb. 17, 2019, 11:51 p.m. UTC | #5
On Fri, Feb 15, 2019 at 12:40:35PM +0100, Greg Kurz wrote:
> The "simple" ICS class knows how to interract with KVM. Adapt sPAPR to use
> it instead of the ICS KVM class.
> 
> Signed-off-by: Greg Kurz <groug@kaod.org>
> ---
>  hw/ppc/spapr_irq.c |   15 +++++++--------
>  1 file changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> index 9f43b7b3bf16..4aa8165307c7 100644
> --- a/hw/ppc/spapr_irq.c
> +++ b/hw/ppc/spapr_irq.c
> @@ -67,13 +67,12 @@ void spapr_irq_msi_reset(sPAPRMachineState *spapr)
>   */
>  
>  static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
> -                                  const char *type_ics,
>                                    int nr_irqs, Error **errp)
>  {
>      Error *local_err = NULL;
>      Object *obj;
>  
> -    obj = object_new(type_ics);
> +    obj = object_new(TYPE_ICS_SIMPLE);
>      object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort);
>      object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr),
>                                     &error_abort);
> @@ -98,14 +97,14 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
>  {
>      MachineState *machine = MACHINE(spapr);
>      Error *local_err = NULL;
> +    bool xics_kvm = false;
>  
>      if (kvm_enabled()) {
>          if (machine_kernel_irqchip_allowed(machine) &&
>              !xics_kvm_init(spapr, &local_err)) {
> -            spapr->ics = spapr_ics_create(spapr, TYPE_ICS_KVM, nr_irqs,
> -                                          &local_err);
> +            xics_kvm = true;
>          }
> -        if (machine_kernel_irqchip_required(machine) && !spapr->ics) {
> +        if (machine_kernel_irqchip_required(machine) && !xics_kvm) {
>              error_prepend(&local_err,
>                            "kernel_irqchip requested but unavailable: ");
>              goto error;
> @@ -114,12 +113,12 @@ static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
>          local_err = NULL;
>      }
>  
> -    if (!spapr->ics) {
> +    if (!xics_kvm) {
>          xics_spapr_init(spapr);
> -        spapr->ics = spapr_ics_create(spapr, TYPE_ICS_SIMPLE, nr_irqs,
> -                                      &local_err);

As Cédric suggested, I think this would be nicer if xics_kvm_init()
and xics_spapr_init() were folded together with the KVM fallback
inside.

That can be a follow up patch, though,

Applied.

>      }
>  
> +    spapr->ics = spapr_ics_create(spapr, nr_irqs, &local_err);
> +
>  error:
>      error_propagate(errp, local_err);
>  }
>
diff mbox series

Patch

diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index 9f43b7b3bf16..4aa8165307c7 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -67,13 +67,12 @@  void spapr_irq_msi_reset(sPAPRMachineState *spapr)
  */
 
 static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
-                                  const char *type_ics,
                                   int nr_irqs, Error **errp)
 {
     Error *local_err = NULL;
     Object *obj;
 
-    obj = object_new(type_ics);
+    obj = object_new(TYPE_ICS_SIMPLE);
     object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort);
     object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr),
                                    &error_abort);
@@ -98,14 +97,14 @@  static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
 {
     MachineState *machine = MACHINE(spapr);
     Error *local_err = NULL;
+    bool xics_kvm = false;
 
     if (kvm_enabled()) {
         if (machine_kernel_irqchip_allowed(machine) &&
             !xics_kvm_init(spapr, &local_err)) {
-            spapr->ics = spapr_ics_create(spapr, TYPE_ICS_KVM, nr_irqs,
-                                          &local_err);
+            xics_kvm = true;
         }
-        if (machine_kernel_irqchip_required(machine) && !spapr->ics) {
+        if (machine_kernel_irqchip_required(machine) && !xics_kvm) {
             error_prepend(&local_err,
                           "kernel_irqchip requested but unavailable: ");
             goto error;
@@ -114,12 +113,12 @@  static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
         local_err = NULL;
     }
 
-    if (!spapr->ics) {
+    if (!xics_kvm) {
         xics_spapr_init(spapr);
-        spapr->ics = spapr_ics_create(spapr, TYPE_ICS_SIMPLE, nr_irqs,
-                                      &local_err);
     }
 
+    spapr->ics = spapr_ics_create(spapr, nr_irqs, &local_err);
+
 error:
     error_propagate(errp, local_err);
 }