[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 12/20] spapr: Simplify spapr_qirq() handling
From: |
Greg Kurz |
Subject: |
Re: [PATCH 12/20] spapr: Simplify spapr_qirq() handling |
Date: |
Wed, 25 Sep 2019 22:30:15 +0200 |
On Wed, 25 Sep 2019 16:45:26 +1000
David Gibson <address@hidden> wrote:
> Currently spapr_qirq() used to find the qemu_irq for an spapr global irq
> number, redirects through the SpaprIrq::qirq method. But the array of
> qemu_irqs is allocated in the PAPR layer, not the backends, and so the
> method implementations all return the same thing, just differing in the
> preliminary checks they make.
>
> So, we can remove the method, and just implement spapr_qirq() directly,
> including all the relevant checks in one place. We change all those
> checks into assert()s as well, since a failure here indicates an error in
> the calling code.
>
> Signed-off-by: David Gibson <address@hidden>
> ---
Reviewed-by: Greg Kurz <address@hidden>
> hw/ppc/spapr_irq.c | 47 ++++++++++----------------------------
> include/hw/ppc/spapr_irq.h | 1 -
> 2 files changed, 12 insertions(+), 36 deletions(-)
>
> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> index 9a9e486eb5..038bfffff4 100644
> --- a/hw/ppc/spapr_irq.c
> +++ b/hw/ppc/spapr_irq.c
> @@ -150,17 +150,6 @@ static void spapr_irq_free_xics(SpaprMachineState
> *spapr, int irq, int num)
> }
> }
>
> -static qemu_irq spapr_qirq_xics(SpaprMachineState *spapr, int irq)
> -{
> - ICSState *ics = spapr->ics;
> -
> - if (ics_valid_irq(ics, irq)) {
> - return spapr->qirqs[irq];
> - }
> -
> - return NULL;
> -}
> -
> static void spapr_irq_print_info_xics(SpaprMachineState *spapr, Monitor *mon)
> {
> CPUState *cs;
> @@ -242,7 +231,6 @@ SpaprIrq spapr_irq_xics = {
> .init = spapr_irq_init_xics,
> .claim = spapr_irq_claim_xics,
> .free = spapr_irq_free_xics,
> - .qirq = spapr_qirq_xics,
> .print_info = spapr_irq_print_info_xics,
> .dt_populate = spapr_dt_xics,
> .cpu_intc_create = spapr_irq_cpu_intc_create_xics,
> @@ -300,20 +288,6 @@ static void spapr_irq_free_xive(SpaprMachineState
> *spapr, int irq, int num)
> }
> }
>
> -static qemu_irq spapr_qirq_xive(SpaprMachineState *spapr, int irq)
> -{
> - SpaprXive *xive = spapr->xive;
> -
> - if ((irq < SPAPR_XIRQ_BASE) || (irq >= xive->nr_irqs)) {
> - return NULL;
> - }
> -
> - /* The sPAPR machine/device should have claimed the IRQ before */
> - assert(xive_eas_is_valid(&xive->eat[irq]));
> -
> - return spapr->qirqs[irq];
> -}
> -
> static void spapr_irq_print_info_xive(SpaprMachineState *spapr,
> Monitor *mon)
> {
> @@ -413,7 +387,6 @@ SpaprIrq spapr_irq_xive = {
> .init = spapr_irq_init_xive,
> .claim = spapr_irq_claim_xive,
> .free = spapr_irq_free_xive,
> - .qirq = spapr_qirq_xive,
> .print_info = spapr_irq_print_info_xive,
> .dt_populate = spapr_dt_xive,
> .cpu_intc_create = spapr_irq_cpu_intc_create_xive,
> @@ -487,11 +460,6 @@ static void spapr_irq_free_dual(SpaprMachineState
> *spapr, int irq, int num)
> spapr_irq_xive.free(spapr, irq, num);
> }
>
> -static qemu_irq spapr_qirq_dual(SpaprMachineState *spapr, int irq)
> -{
> - return spapr_irq_current(spapr)->qirq(spapr, irq);
> -}
> -
> static void spapr_irq_print_info_dual(SpaprMachineState *spapr, Monitor *mon)
> {
> spapr_irq_current(spapr)->print_info(spapr, mon);
> @@ -586,7 +554,6 @@ SpaprIrq spapr_irq_dual = {
> .init = spapr_irq_init_dual,
> .claim = spapr_irq_claim_dual,
> .free = spapr_irq_free_dual,
> - .qirq = spapr_qirq_dual,
> .print_info = spapr_irq_print_info_dual,
> .dt_populate = spapr_irq_dt_populate_dual,
> .cpu_intc_create = spapr_irq_cpu_intc_create_dual,
> @@ -700,7 +667,18 @@ void spapr_irq_free(SpaprMachineState *spapr, int irq,
> int num)
>
> qemu_irq spapr_qirq(SpaprMachineState *spapr, int irq)
> {
> - return spapr->irq->qirq(spapr, irq);
> + assert(irq >= SPAPR_XIRQ_BASE);
> + assert(irq < (spapr->irq->nr_xirqs + SPAPR_XIRQ_BASE));
> +
> + if (spapr->ics) {
> + assert(ics_valid_irq(spapr->ics, irq));
> + }
> + if (spapr->xive) {
> + assert(irq < spapr->xive->nr_irqs);
> + assert(xive_eas_is_valid(&spapr->xive->eat[irq]));
> + }
> +
> + return spapr->qirqs[irq];
> }
>
> int spapr_irq_post_load(SpaprMachineState *spapr, int version_id)
> @@ -803,7 +781,6 @@ SpaprIrq spapr_irq_xics_legacy = {
> .init = spapr_irq_init_xics,
> .claim = spapr_irq_claim_xics,
> .free = spapr_irq_free_xics,
> - .qirq = spapr_qirq_xics,
> .print_info = spapr_irq_print_info_xics,
> .dt_populate = spapr_dt_xics,
> .cpu_intc_create = spapr_irq_cpu_intc_create_xics,
> diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h
> index 7e26288fcd..a4e790ef60 100644
> --- a/include/hw/ppc/spapr_irq.h
> +++ b/include/hw/ppc/spapr_irq.h
> @@ -44,7 +44,6 @@ typedef struct SpaprIrq {
> void (*init)(SpaprMachineState *spapr, Error **errp);
> int (*claim)(SpaprMachineState *spapr, int irq, bool lsi, Error **errp);
> void (*free)(SpaprMachineState *spapr, int irq, int num);
> - qemu_irq (*qirq)(SpaprMachineState *spapr, int irq);
> void (*print_info)(SpaprMachineState *spapr, Monitor *mon);
> void (*dt_populate)(SpaprMachineState *spapr, uint32_t nr_servers,
> void *fdt, uint32_t phandle);
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, (continued)
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, Cédric Le Goater, 2019/09/25
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, Greg Kurz, 2019/09/25
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, David Gibson, 2019/09/25
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, Cédric Le Goater, 2019/09/26
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, Greg Kurz, 2019/09/27
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, David Gibson, 2019/09/30
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, Greg Kurz, 2019/09/30
- Re: [PATCH 06/20] xics: Create sPAPR specific ICS subtype, David Gibson, 2019/09/30
[PATCH 12/20] spapr: Simplify spapr_qirq() handling, David Gibson, 2019/09/25
[PATCH 10/20] spapr: Eliminate nr_irqs parameter to SpaprIrq::init, David Gibson, 2019/09/25
[PATCH 14/20] spapr: Remove unhelpful tracepoints from spapr_irq_free_xics(), David Gibson, 2019/09/25
[PATCH 15/20] spapr: Handle freeing of multiple irqs in frontend only, David Gibson, 2019/09/25