qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Markus Armbruster <armbru@redhat.com>
Cc: agraf@suse.de, mst@redhat.com, qemu-devel@nongnu.org,
	michael@walle.cc, lcapitulino@redhat.com, blauwirbel@gmail.com,
	andreas.faerber@web.de, qemu-ppc@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/6] Remove monitor.c dependency on CONFIG_I8259
Date: Tue, 31 Mar 2015 11:05:24 +1100	[thread overview]
Message-ID: <20150331000524.GN9908@voom.fritz.box> (raw)
In-Reply-To: <87384mvq1y.fsf@blackfin.pond.sub.org>

[-- Attachment #1: Type: text/plain, Size: 8937 bytes --]

On Mon, Mar 30, 2015 at 10:37:45AM +0200, Markus Armbruster wrote:
> Markus Armbruster <armbru@redhat.com> writes:
> 
> > David Gibson <david@gibson.dropbear.id.au> writes:
> >
> >> The hmp commands "irq" and "pic" are a bit of a mess.  They're implemented
> >> on a number of targets, but not all.  On sparc32 and LM32 they do target
> >> specific things, but on the remainder (i386, ppc and mips) they call into
> >> the i8259 PIC code.
> >
> > Where "info pic" does absolutely nothing unless we're using "isa-i8259".
> > In particular, it does nothing when we're using "kvm-i8259" instead.
> > Fun!
> >
> >> But really, what these commands do shouldn't be dependent on the target
> >> arch, but on the specific machine that's in use.  On ppc, for example,
> >> the "prep" machine usually does have an ISA bridge with an i8259, but
> >> most of the other machine types have never had an i8259 at all.  Similarly
> >> the sparc specific target would stop working if we ever had a sparc32
> >> machine that wasn't sun4m.
> >>
> >> This patch cleans things up by implementing these hmp commands on all
> >> targets via a MachineClass callback.  If the callback is NULL, for now
> >> we fallback to target specific defaults that match the existing behaviour.
> >> The hope is we can remove those later with target specific cleanups.
> >>
> >> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> >
> >> ---
> >>  hw/intc/i8259.c      |  4 ++--
> >>  include/hw/boards.h  |  2 ++
> >>  include/hw/i386/pc.h |  4 ++--
> >>  monitor.c            | 57 ++++++++++++++++++++++++++++++++++++++--------------
> >>  4 files changed, 48 insertions(+), 19 deletions(-)
> >>
> >> diff --git a/hw/intc/i8259.c b/hw/intc/i8259.c
> >> index 0f5c025..43e90b9 100644
> >> --- a/hw/intc/i8259.c
> >> +++ b/hw/intc/i8259.c
> >> @@ -429,7 +429,7 @@ static void pic_realize(DeviceState *dev, Error **errp)
> >>      pc->parent_realize(dev, errp);
> >>  }
> >>  
> >> -void hmp_info_pic(Monitor *mon, const QDict *qdict)
> >> +void i8259_hmp_info_pic(Monitor *mon, const QDict *qdict)
> >>  {
> >>      int i;
> >>      PICCommonState *s;
> >> @@ -447,7 +447,7 @@ void hmp_info_pic(Monitor *mon, const QDict *qdict)
> >>      }
> >>  }
> >>  
> >> -void hmp_info_irq(Monitor *mon, const QDict *qdict)
> >> +void i8259_hmp_info_irq(Monitor *mon, const QDict *qdict)
> >>  {
> >>  #ifndef DEBUG_IRQ_COUNT
> >>      monitor_printf(mon, "irq statistic code not compiled.\n");
> >> diff --git a/include/hw/boards.h b/include/hw/boards.h
> >> index 3ddc449..214a778 100644
> >> --- a/include/hw/boards.h
> >> +++ b/include/hw/boards.h
> >> @@ -111,6 +111,8 @@ struct MachineClass {
> >>  
> >>      HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
> >>                                             DeviceState *dev);
> >> +    void (*hmp_info_irq)(Monitor *mon, const QDict *qdict);
> >> +    void (*hmp_info_pic)(Monitor *mon, const QDict *qdict);
> >>  };
> >>  
> >>  /**
> >
> > Here you're defining the MachineClass callback.
> >
> > The callback is designed for HMP.  This will make code implementing it
> > depend on the monitor.  You could do a QMP-style callback instead, and
> > get a dependency on QAPI or QObject instead.
> >
> > But I'm fine with it as is.
> >
> >> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> >> index 08ab67d..0f376c6 100644
> >> --- a/include/hw/i386/pc.h
> >> +++ b/include/hw/i386/pc.h
> >> @@ -121,8 +121,8 @@ qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
> >>  qemu_irq *kvm_i8259_init(ISABus *bus);
> >>  int pic_read_irq(DeviceState *d);
> >>  int pic_get_output(DeviceState *d);
> >> -void hmp_info_pic(Monitor *mon, const QDict *qdict);
> >> -void hmp_info_irq(Monitor *mon, const QDict *qdict);
> >> +void i8259_hmp_info_pic(Monitor *mon, const QDict *qdict);
> >> +void i8259_hmp_info_irq(Monitor *mon, const QDict *qdict);
> >>  
> >>  /* Global System Interrupts */
> >>  
> >> diff --git a/monitor.c b/monitor.c
> >> index c86a89e..ca226a9 100644
> >> --- a/monitor.c
> >> +++ b/monitor.c
> >> @@ -1064,6 +1064,48 @@ static void hmp_info_history(Monitor *mon, const QDict *qdict)
> >>      }
> >>  }
> >>  
> >> +static void hmp_info_pic(Monitor *mon, const QDict *qdict)
> >> +{
> >> +    MachineClass *mc = MACHINE_GET_CLASS(current_machine);
> >> +
> >> +    if (mc->hmp_info_pic) {
> >> +        (mc->hmp_info_pic)(mon, qdict);
> >
> > Here you're using the MachineClass callback.
> >
> > However, you're not setting it anywhere, so the callback is dead code.
> >
> > Interfacing to the machine-specific parts with a MachineClass callback
> > sounds sensible enough, but not without at least one user.  Please
> > either add one, or drop the dead code for now.
> 
> Scratch that, you're adding one in the next patch.
> 
> Suggest to point to it in the commit message.  Remember, reviewers
> effectively squint at your patches through a toilet roll, and can really
> use help with the non-local stuff, especially connections between
> patches.
> 
> >> +    } else {
> >> +        /* FIXME: Backwards compat fallbacks.  These can go away once
> >> +         * we've finished converting to natively using MachineClass,
> >> +         * rather thatn QEMUMachine */
> >> +#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
> >> +        sun4m_hmp_info_pic(mon, qdict);
> >> +#elif defined(TARGET_LM32)
> >> +        lm32_hmp_info_pic(mon, qdict);
> >> +#elif defined(TARGET_i386) || defined(TARGET_PPC) || defined(TARGET_MIPS)
> >> +        i8259_hmp_info_pic(mon, qdict);
> >> +#endif
> >> +    }
> >> +}
> >> +
> >> +static void hmp_info_irq(Monitor *mon, const QDict *qdict)
> >> +{
> >> +    /* FIXME: The ifdefs can go away once the sun4m and LM32 machines
> >> +     * are converted to use machine classes natively */
> >> +    MachineClass *mc = MACHINE_GET_CLASS(current_machine);
> >> +
> >> +    if (mc->hmp_info_irq) {
> >> +        (mc->hmp_info_irq)(mon, qdict);
> >> +    } else {
> >> +        /* FIXME: Backwards compat fallbacks.  These can go away once
> >> +         * we've finished converting to natively using MachineClass,
> >> +         * rather thatn QEMUMachine */
> >> +#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
> >> +        sun4m_hmp_info_irq(mon, qdict);
> >> +#elif defined(TARGET_LM32)
> >> +        lm32_hmp_info_irq(mon, qdict);
> >> +#elif defined(TARGET_i386) || defined(TARGET_PPC) || defined(TARGET_MIPS)
> >> +        i8259_hmp_info_irq(mon, qdict);
> >> +#endif
> >> +    }
> >> +}
> >> +
> >>  static void hmp_info_cpustats(Monitor *mon, const QDict *qdict)
> >>  {
> >>      CPUState *cpu;
> >> @@ -2661,35 +2703,20 @@ static mon_cmd_t info_cmds[] = {
> >>          .help       = "show the command line history",
> >>          .mhandler.cmd = hmp_info_history,
> >>      },
> >> -#if defined(TARGET_I386) || defined(TARGET_PPC) || defined(TARGET_MIPS) || \
> >> -    defined(TARGET_LM32) || (defined(TARGET_SPARC) && !defined(TARGET_SPARC64))
> 
> This adds "info irq" and "info pic" to the targets that didn't have them
> before, implemented by i8259.c's hmp_info_pic() and hmp_info_irq().
> They do nothing unless the machine has an "isa-i8259" device.
> 
> Cases:
> 
> 1. If the machine has one, and it's the only interrupt controller, the
> commands work as advertized.
> 
> 2. If the machine doesn't have one, the commands are empty promises.
> 
> 3. If the machine has one, but it's not the only interrupt controller,
> the commands confidently claim the i8259 is all there is.
> Misinformation.
> 
> Cases 2 and 3 are common, case 1 is rare.
> 
> We can:
> 
> A. Fix the commands to cover all interrupt controllers.
> 
> B. Fix them to warn the user about missing interrupt controllers.
> 
>    We can approximate this by warning always, because it's almost never
>    the only interrupt controller anyway :)
> 
> C. Rip 'em both out and be done with it.
> 
> D. Do nothing.
> 
> E. Provide them as is on all targets.
> 
>    Spread the badness fairly.
> 
> I vote for C or B.  A seems not worthwhile.

I'd love to do C, if we can get confirmation that no-one's really
using the existing HMP commands.  That would make a bunch of things
simpler.

> What does your series do?  Remember, I'm squinting through a toilet
> roll...

The current draft aims to do 2 things:
   * Keep identical behaviour on machines that currently have a
     non-trivial implementation of "info pic" and "info irq"
   * For all other machines, implement the commands as no-op.

I guess that's closest to your option (E).


-- 
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

[-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --]

  reply	other threads:[~2015-03-31  0:26 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-06  4:18 [Qemu-devel] [PATCH 0/6] Clean up ISA dependencies so we make ISA optional to build David Gibson
2015-03-06  4:18 ` [Qemu-devel] [PATCH 1/6] Split serial-isa into its own config option David Gibson
2015-03-30  7:28   ` Markus Armbruster
2015-03-31  5:36     ` David Gibson
2015-03-06  4:18 ` [Qemu-devel] [PATCH 2/6] Remove monitor.c dependency on CONFIG_I8259 David Gibson
2015-03-30  7:49   ` Markus Armbruster
2015-03-30  8:37     ` Markus Armbruster
2015-03-31  0:05       ` David Gibson [this message]
2015-03-31  9:57         ` Markus Armbruster
2015-04-01  0:40           ` David Gibson
2015-03-30 21:41   ` Andreas Färber
2015-03-31 10:07   ` Peter Maydell
2015-03-06  4:18 ` [Qemu-devel] [PATCH 3/6] pc: Use MachineClass callbacks for "irq" and "pic" hmp commands David Gibson
2015-03-30 21:47   ` Andreas Färber
2015-03-06  4:18 ` [Qemu-devel] [PATCH 4/6] target-ppc: Convert PReP to machine class David Gibson
2015-03-30 21:33   ` Andreas Färber
2015-03-31  5:40     ` David Gibson
2015-03-06  4:18 ` [Qemu-devel] [PATCH 5/6] prep: Use MachineClass callbacks for "irq" and "pic" hmp commands David Gibson
2015-03-30 21:25   ` Andreas Färber
2015-03-06  4:18 ` [Qemu-devel] [PATCH 6/6] Allow ISA bus to be configured out David Gibson
2015-03-06 11:41 ` [Qemu-devel] [PATCH 0/6] Clean up ISA dependencies so we make ISA optional to build Alexander Graf
2015-03-10 14:20 ` Michael S. Tsirkin
2015-03-10 14:56   ` Luiz Capitulino
2015-03-30  2:41     ` David Gibson
2015-03-30  8:48       ` Markus Armbruster
2015-03-30 17:45       ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150331000524.GN9908@voom.fritz.box \
    --to=david@gibson.dropbear.id.au \
    --cc=agraf@suse.de \
    --cc=andreas.faerber@web.de \
    --cc=armbru@redhat.com \
    --cc=blauwirbel@gmail.com \
    --cc=lcapitulino@redhat.com \
    --cc=michael@walle.cc \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).