[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH v2 04/22] ppc/xics: add an InterruptStatsProvider
From: |
David Gibson |
Subject: |
Re: [Qemu-ppc] [PATCH v2 04/22] ppc/xics: add an InterruptStatsProvider interface to ICS and ICP objects |
Date: |
Thu, 23 Feb 2017 13:15:31 +1100 |
User-agent: |
Mutt/1.7.1 (2016-10-04) |
On Thu, Feb 16, 2017 at 02:47:27PM +0100, Cédric Le Goater wrote:
> This is, again, to reduce the use of the list of ICS objects. Let's
> make each individual ICS and ICP object an InterruptStatsProvider and
> remove this same interface from XICSState.
>
> Signed-off-by: Cédric Le Goater <address@hidden>
I'm a little hesitant about this, because it means that getting the
interrupt stats information is now spread out over the qom tree,
whereas previously there was a single location to get a good summary
of the systems overall interrupt status. The previous behaviour seems
like it would be more convenient for debugging.
That said, I see the structural advantages of this split. Hmm.. still
thinking..
> ---
> hw/intc/xics.c | 76
> +++++++++++++++++++++++++++++++---------------------------
> 1 file changed, 41 insertions(+), 35 deletions(-)
>
> diff --git a/hw/intc/xics.c b/hw/intc/xics.c
> index 9f22814815c9..b1294417a0ae 100644
> --- a/hw/intc/xics.c
> +++ b/hw/intc/xics.c
> @@ -92,44 +92,44 @@ void xics_cpu_setup(XICSState *xics, PowerPCCPU *cpu)
> }
> }
>
> -static void xics_common_pic_print_info(InterruptStatsProvider *obj,
> - Monitor *mon)
> +static void icp_pic_print_info(InterruptStatsProvider *obj,
> + Monitor *mon)
> {
> - XICSState *xics = XICS_COMMON(obj);
> - ICSState *ics;
> + ICPState *icp = ICP(obj);
> + int cpu_index = icp->cs ? icp->cs->cpu_index : -1;
> +
> + if (!icp->output) {
> + return;
> + }
> + monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n",
> + cpu_index, icp->xirr, icp->xirr_owner,
> + icp->pending_priority, icp->mfrr);
> +}
> +
> +static void ics_simple_pic_print_info(InterruptStatsProvider *obj,
> + Monitor *mon)
> +{
> + ICSState *ics = ICS_SIMPLE(obj);
> uint32_t i;
>
> - for (i = 0; i < xics->nr_servers; i++) {
> - ICPState *icp = &xics->ss[i];
> + monitor_printf(mon, "ICS %4x..%4x %p\n",
> + ics->offset, ics->offset + ics->nr_irqs - 1, ics);
>
> - if (!icp->output) {
> - continue;
> - }
> - monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n",
> - i, icp->xirr, icp->xirr_owner,
> - icp->pending_priority, icp->mfrr);
> + if (!ics->irqs) {
> + return;
> }
>
> - QLIST_FOREACH(ics, &xics->ics, list) {
> - monitor_printf(mon, "ICS %4x..%4x %p\n",
> - ics->offset, ics->offset + ics->nr_irqs - 1, ics);
> + for (i = 0; i < ics->nr_irqs; i++) {
> + ICSIRQState *irq = ics->irqs + i;
>
> - if (!ics->irqs) {
> + if (!(irq->flags & XICS_FLAGS_IRQ_MASK)) {
> continue;
> }
> -
> - for (i = 0; i < ics->nr_irqs; i++) {
> - ICSIRQState *irq = ics->irqs + i;
> -
> - if (!(irq->flags & XICS_FLAGS_IRQ_MASK)) {
> - continue;
> - }
> - monitor_printf(mon, " %4x %s %02x %02x\n",
> - ics->offset + i,
> - (irq->flags & XICS_FLAGS_IRQ_LSI) ?
> - "LSI" : "MSI",
> - irq->priority, irq->status);
> - }
> + monitor_printf(mon, " %4x %s %02x %02x\n",
> + ics->offset + i,
> + (irq->flags & XICS_FLAGS_IRQ_LSI) ?
> + "LSI" : "MSI",
> + irq->priority, irq->status);
> }
> }
>
> @@ -161,10 +161,8 @@ static void xics_common_initfn(Object *obj)
> static void xics_common_class_init(ObjectClass *oc, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(oc);
> - InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(oc);
>
> dc->reset = xics_common_reset;
> - ic->print_info = xics_common_pic_print_info;
> }
>
> static const TypeInfo xics_common_info = {
> @@ -174,10 +172,6 @@ static const TypeInfo xics_common_info = {
> .class_size = sizeof(XICSStateClass),
> .instance_init = xics_common_initfn,
> .class_init = xics_common_class_init,
> - .interfaces = (InterfaceInfo[]) {
> - { TYPE_INTERRUPT_STATS_PROVIDER },
> - { }
> - },
> };
>
> /*
> @@ -414,10 +408,12 @@ static void icp_realize(DeviceState *dev, Error **errp)
> static void icp_class_init(ObjectClass *klass, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> + InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(klass);
>
> dc->reset = icp_reset;
> dc->vmsd = &vmstate_icp_server;
> dc->realize = icp_realize;
> + ic->print_info = icp_pic_print_info;
> }
>
> static const TypeInfo icp_info = {
> @@ -426,6 +422,10 @@ static const TypeInfo icp_info = {
> .instance_size = sizeof(ICPState),
> .class_init = icp_class_init,
> .class_size = sizeof(ICPStateClass),
> + .interfaces = (InterfaceInfo[]) {
> + { TYPE_INTERRUPT_STATS_PROVIDER },
> + { }
> + },
> };
>
> /*
> @@ -692,6 +692,7 @@ static void ics_simple_class_init(ObjectClass *klass,
> void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> ICSStateClass *isc = ICS_BASE_CLASS(klass);
> + InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(klass);
>
> dc->realize = ics_simple_realize;
> dc->props = ics_simple_properties;
> @@ -701,6 +702,7 @@ static void ics_simple_class_init(ObjectClass *klass,
> void *data)
> isc->reject = ics_simple_reject;
> isc->resend = ics_simple_resend;
> isc->eoi = ics_simple_eoi;
> + ic->print_info = ics_simple_pic_print_info;
> }
>
> static const TypeInfo ics_simple_info = {
> @@ -710,6 +712,10 @@ static const TypeInfo ics_simple_info = {
> .class_init = ics_simple_class_init,
> .class_size = sizeof(ICSStateClass),
> .instance_init = ics_simple_initfn,
> + .interfaces = (InterfaceInfo[]) {
> + { TYPE_INTERRUPT_STATS_PROVIDER },
> + { }
> + },
> };
>
> static const TypeInfo ics_base_info = {
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature
[Qemu-ppc] [PATCH v2 05/22] ppc/xics: introduce a QOM interface to handle ICSs, Cédric Le Goater, 2017/02/16
[Qemu-ppc] [PATCH v2 06/22] ppc/xics: use the QOM interface under the sPAPR machine, Cédric Le Goater, 2017/02/16
[Qemu-ppc] [PATCH v2 07/22] ppc/xics: use the QOM interface to get irqs, Cédric Le Goater, 2017/02/16