qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229
@ 2016-02-29  6:58 David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 1/8] spapr_rng: disable hotpluggability David Gibson
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell; +Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson

To probably no-one's surprise, my "hopefully last" pull request before
the soft freeze has turned out not to be the last.  Here are a few
more patches for qemu-2.6.

The following changes since commit 6e378dd214fbbae8138ff011ec3de7ddf13a445f:

  Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20160226' into staging (2016-02-26 16:02:00 +0000)

are available in the git repository at:

  git://github.com/dgibson/qemu.git tags/ppc-for-2.6-20160229

for you to fetch changes up to a005b3ef50439b5bc6b2eb0b5bda8e8c7c2368bf:

  xics: report errors with the QEMU Error API (2016-02-28 16:19:02 +1100)

----------------------------------------------------------------
ppc patch queue for 2016-02-29

Some more accumulated patches for target-ppc, pseries machine type and
related devices to fit in before the qemu-2.6 soft freeze.
    * Mostly bugfixes and small cleanups for spapr and Mac platforms

----------------------------------------------------------------
Greg Kurz (7):
      spapr_rng: disable hotpluggability
      spapr_pci: kill useless variable in rtas_ibm_change_msi()
      spapr_pci: fix irq leak in RTAS ibm,change-msi
      spapr: disable vmdesc submission for old machines
      spapr: skip configuration section during migration of older machines
      migration: allow machine to enforce configuration section migration
      xics: report errors with the QEMU Error API

Hervé Poussineau (1):
      dbdma: warn when using unassigned channel

 hw/core/machine.c         | 21 +++++++++++++++++++++
 hw/intc/xics.c            | 13 +++++++++----
 hw/misc/macio/mac_dbdma.c | 25 +++++++++++++++++++++++--
 hw/ppc/spapr.c            |  2 ++
 hw/ppc/spapr_events.c     |  3 ++-
 hw/ppc/spapr_pci.c        | 31 +++++++++++++++++++++----------
 hw/ppc/spapr_rng.c        |  1 +
 hw/ppc/spapr_vio.c        |  7 ++++---
 include/hw/boards.h       |  1 +
 include/hw/ppc/xics.h     |  5 +++--
 migration/savevm.c        | 10 ++++++++--
 qemu-options.hx           |  3 ++-
 trace-events              |  2 --
 13 files changed, 97 insertions(+), 27 deletions(-)

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 1/8] spapr_rng: disable hotpluggability
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 2/8] spapr_pci: kill useless variable in rtas_ibm_change_msi() David Gibson
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson, Greg Kurz

From: Greg Kurz <gkurz@linux.vnet.ibm.com>

It is currently possible to hotplug a spapr_rng device but QEMU crashes
when we try to hot unplug:

ERROR:hw/core/qdev.c:295:qdev_unplug: assertion failed: (hotplug_ctrl)
Aborted

This happens because spapr_rng isn't plugged to any bus and sPAPR does
not provide hotplug support for it: qdev_get_hotplug_handler() hence
return NULL and we hit the assertion.

And anyway, it doesn't make much sense to unplug this device since hcalls
cannot be unregistered. Even the idea of hotplugging a RNG device instead
of declaring it on the QEMU command line looks weird.

This patch simply disables hotpluggability for the spapr-rng class.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_rng.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/ppc/spapr_rng.c b/hw/ppc/spapr_rng.c
index 8484fcf..a39d472 100644
--- a/hw/ppc/spapr_rng.c
+++ b/hw/ppc/spapr_rng.c
@@ -170,6 +170,7 @@ static void spapr_rng_class_init(ObjectClass *oc, void *data)
     dc->realize = spapr_rng_realize;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
     dc->props = spapr_rng_properties;
+    dc->hotpluggable = false;
 }
 
 static const TypeInfo spapr_rng_info = {
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 2/8] spapr_pci: kill useless variable in rtas_ibm_change_msi()
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 1/8] spapr_rng: disable hotpluggability David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 3/8] spapr_pci: fix irq leak in RTAS ibm, change-msi David Gibson
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson, Greg Kurz

From: Greg Kurz <gkurz@linux.vnet.ibm.com>

The num local variable is initialized to zero and has no writer.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_pci.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index cca9257..19dd6db 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -275,7 +275,7 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     unsigned int req_num = rtas_ld(args, 4); /* 0 == remove all */
     unsigned int seq_num = rtas_ld(args, 5);
     unsigned int ret_intr_type;
-    unsigned int irq, max_irqs = 0, num = 0;
+    unsigned int irq, max_irqs = 0;
     sPAPRPHBState *phb = NULL;
     PCIDevice *pdev = NULL;
     spapr_pci_msi *msi;
@@ -316,10 +316,10 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 
         xics_free(spapr->icp, msi->first_irq, msi->num);
         if (msi_present(pdev)) {
-            spapr_msi_setmsg(pdev, 0, false, 0, num);
+            spapr_msi_setmsg(pdev, 0, false, 0, 0);
         }
         if (msix_present(pdev)) {
-            spapr_msi_setmsg(pdev, 0, true, 0, num);
+            spapr_msi_setmsg(pdev, 0, true, 0, 0);
         }
         g_hash_table_remove(phb->msi, &config_addr);
 
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 3/8] spapr_pci: fix irq leak in RTAS ibm, change-msi
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 1/8] spapr_rng: disable hotpluggability David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 2/8] spapr_pci: kill useless variable in rtas_ibm_change_msi() David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 4/8] spapr: disable vmdesc submission for old machines David Gibson
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson, Greg Kurz

From: Greg Kurz <gkurz@linux.vnet.ibm.com>

This RTAS call is used to request new interrupts or to free all interrupts.

If the driver has already allocated interrupts and asks again for a non-null
number of irqs, then the rtas_ibm_change_msi() function will silently leak
the previous interrupts.

It happens because xics_free() is only called when the driver releases all
interrupts (!req_num case). Note that the previously allocated spapr_pci_msi
is not leaked because the GHashTable is created with destroy functions and
g_hash_table_insert() hence frees the old value.

This patch makes sure any previously allocated MSIs are released when a
new allocation succeeds.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_pci.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 19dd6db..9b2b546 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -305,9 +305,10 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
         return;
     }
 
+    msi = (spapr_pci_msi *) g_hash_table_lookup(phb->msi, &config_addr);
+
     /* Releasing MSIs */
     if (!req_num) {
-        msi = (spapr_pci_msi *) g_hash_table_lookup(phb->msi, &config_addr);
         if (!msi) {
             trace_spapr_pci_msi("Releasing wrong config", config_addr);
             rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
@@ -360,6 +361,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
         return;
     }
 
+    /* Release previous MSIs */
+    if (msi) {
+        xics_free(spapr->icp, msi->first_irq, msi->num);
+        g_hash_table_remove(phb->msi, &config_addr);
+    }
+
     /* Setup MSI/MSIX vectors in the device (via cfgspace or MSIX BAR) */
     spapr_msi_setmsg(pdev, SPAPR_PCI_MSI_WINDOW, ret_intr_type == RTAS_TYPE_MSIX,
                      irq, req_num);
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 4/8] spapr: disable vmdesc submission for old machines
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
                   ` (2 preceding siblings ...)
  2016-02-29  6:58 ` [Qemu-devel] [PULL 3/8] spapr_pci: fix irq leak in RTAS ibm, change-msi David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 5/8] dbdma: warn when using unassigned channel David Gibson
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson, Greg Kurz

From: Greg Kurz <gkurz@linux.vnet.ibm.com>

Since QEMU 2.3, we have a vmdesc section in the migration stream.
This section is not mandatory but when migrating a pseries-2.2
machine from QEMU 2.2, you get a warning at the destination:

qemu-system-ppc64: Expected vmdescription section, but got 0

The warning goes away if we decide to skip vmdesc as well for
older pseries, like it is already done for pc's.

This can only be observed with -cpu POWER7 because POWER8
cannot migrate from QEMU 2.2 to 2.3 (insns_flags2 mismatch).

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index c119f55..3b4a557 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2452,6 +2452,7 @@ DEFINE_SPAPR_MACHINE(2_3, "2.3", false);
 static void spapr_machine_2_2_instance_options(MachineState *machine)
 {
     spapr_machine_2_3_instance_options(machine);
+    machine->suppress_vmdesc = true;
 }
 
 static void spapr_machine_2_2_class_options(MachineClass *mc)
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 5/8] dbdma: warn when using unassigned channel
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
                   ` (3 preceding siblings ...)
  2016-02-29  6:58 ` [Qemu-devel] [PULL 4/8] spapr: disable vmdesc submission for old machines David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 6/8] spapr: skip configuration section during migration of older machines David Gibson
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, Hervé Poussineau,
	David Gibson

From: Hervé Poussineau <hpoussin@reactos.org>

With this, it's easier to know if a guest uses an invalid and/or unimplemented
DMA channel.

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/misc/macio/mac_dbdma.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/hw/misc/macio/mac_dbdma.c b/hw/misc/macio/mac_dbdma.c
index d81dea7..6051f17 100644
--- a/hw/misc/macio/mac_dbdma.c
+++ b/hw/misc/macio/mac_dbdma.c
@@ -557,11 +557,13 @@ void DBDMA_register_channel(void *dbdma, int nchan, qemu_irq irq,
 
     DBDMA_DPRINTF("DBDMA_register_channel 0x%x\n", nchan);
 
+    assert(rw);
+    assert(flush);
+
     ch->irq = irq;
     ch->rw = rw;
     ch->flush = flush;
     ch->io.opaque = opaque;
-    ch->io.channel = ch;
 }
 
 static void
@@ -775,6 +777,20 @@ static void dbdma_reset(void *opaque)
         memset(s->channels[i].regs, 0, DBDMA_SIZE);
 }
 
+static void dbdma_unassigned_rw(DBDMA_io *io)
+{
+    DBDMA_channel *ch = io->channel;
+    qemu_log_mask(LOG_GUEST_ERROR, "%s: use of unassigned channel %d\n",
+                  __func__, ch->channel);
+}
+
+static void dbdma_unassigned_flush(DBDMA_io *io)
+{
+    DBDMA_channel *ch = io->channel;
+    qemu_log_mask(LOG_GUEST_ERROR, "%s: use of unassigned channel %d\n",
+                  __func__, ch->channel);
+}
+
 void* DBDMA_init (MemoryRegion **dbdma_mem)
 {
     DBDMAState *s;
@@ -784,8 +800,13 @@ void* DBDMA_init (MemoryRegion **dbdma_mem)
 
     for (i = 0; i < DBDMA_CHANNELS; i++) {
         DBDMA_io *io = &s->channels[i].io;
+        DBDMA_channel *ch = &s->channels[i];
         qemu_iovec_init(&io->iov, 1);
-        s->channels[i].channel = i;
+
+        ch->rw = dbdma_unassigned_rw;
+        ch->flush = dbdma_unassigned_flush;
+        ch->channel = i;
+        ch->io.channel = ch;
     }
 
     memory_region_init_io(&s->mem, NULL, &dbdma_ops, s, "dbdma", 0x1000);
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 6/8] spapr: skip configuration section during migration of older machines
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
                   ` (4 preceding siblings ...)
  2016-02-29  6:58 ` [Qemu-devel] [PULL 5/8] dbdma: warn when using unassigned channel David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 7/8] migration: allow machine to enforce configuration section migration David Gibson
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson, Greg Kurz

From: Greg Kurz <gkurz@linux.vnet.ibm.com>

Since QEMU 2.4, we have a configuration section in the migration stream.
This must be skipped for older machines, like it is already done for x86.

This patch fixes the migration of pseries-2.3 from/to QEMU 2.3, but it
breaks migration of the same machine from/to QEMU 2.4/2.4.1/2.5. We do
that anyway because QEMU 2.3 is likely to be more widely deployed than
newer QEMU versions.

Fixes: 61964c23e5ddd5a33f15699e45ce126f879e3e33
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 3b4a557..e9d4abf 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2427,6 +2427,7 @@ static void spapr_machine_2_3_instance_options(MachineState *machine)
     spapr_machine_2_4_instance_options(machine);
     savevm_skip_section_footers();
     global_state_set_optional();
+    savevm_skip_configuration();
 }
 
 static void spapr_machine_2_3_class_options(MachineClass *mc)
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 7/8] migration: allow machine to enforce configuration section migration
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
                   ` (5 preceding siblings ...)
  2016-02-29  6:58 ` [Qemu-devel] [PULL 6/8] spapr: skip configuration section during migration of older machines David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29  6:58 ` [Qemu-devel] [PULL 8/8] xics: report errors with the QEMU Error API David Gibson
  2016-02-29 11:24 ` [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 Peter Maydell
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson, Greg Kurz

From: Greg Kurz <gkurz@linux.vnet.ibm.com>

Migration of pseries-2.3 doesn't have configuration section. Unfortunately,
QEMU 2.4/2.4.1/2.5 are buggy and always stream and expect the configuration
section, and break migration both ways.

This patch introduces a property which allows to enforce a configuration
section for machines who don't have one.

It can be set at startup:

-machine enforce-config-section=on

or later from the QEMU monitor:

qom-set /machine enforce-config-section on

It is up to the tooling to set or unset this property according to the
version of the QEMU at the other end of the pipe.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/core/machine.c   | 21 +++++++++++++++++++++
 include/hw/boards.h |  1 +
 migration/savevm.c  | 10 ++++++++--
 qemu-options.hx     |  3 ++-
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/hw/core/machine.c b/hw/core/machine.c
index 6d1a0d8..a8c4680 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -312,6 +312,21 @@ static bool machine_get_suppress_vmdesc(Object *obj, Error **errp)
     return ms->suppress_vmdesc;
 }
 
+static void machine_set_enforce_config_section(Object *obj, bool value,
+                                             Error **errp)
+{
+    MachineState *ms = MACHINE(obj);
+
+    ms->enforce_config_section = value;
+}
+
+static bool machine_get_enforce_config_section(Object *obj, Error **errp)
+{
+    MachineState *ms = MACHINE(obj);
+
+    return ms->enforce_config_section;
+}
+
 static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque)
 {
     error_report("Option '-device %s' cannot be handled by this machine",
@@ -467,6 +482,12 @@ static void machine_initfn(Object *obj)
     object_property_set_description(obj, "suppress-vmdesc",
                                     "Set on to disable self-describing migration",
                                     NULL);
+    object_property_add_bool(obj, "enforce-config-section",
+                             machine_get_enforce_config_section,
+                             machine_set_enforce_config_section, NULL);
+    object_property_set_description(obj, "enforce-config-section",
+                                    "Set on to enforce configuration section migration",
+                                    NULL);
 
     /* Register notifier when init is done for sysbus sanity checks */
     ms->sysbus_notifier.notify = machine_init_notify;
diff --git a/include/hw/boards.h b/include/hw/boards.h
index de3b3bd..b5d7eae 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -127,6 +127,7 @@ struct MachineState {
     char *firmware;
     bool iommu;
     bool suppress_vmdesc;
+    bool enforce_config_section;
 
     ram_addr_t ram_size;
     ram_addr_t maxram_size;
diff --git a/migration/savevm.c b/migration/savevm.c
index b459156..96e7db5 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -878,13 +878,19 @@ bool qemu_savevm_state_blocked(Error **errp)
     return false;
 }
 
+static bool enforce_config_section(void)
+{
+    MachineState *machine = MACHINE(qdev_get_machine());
+    return machine->enforce_config_section;
+}
+
 void qemu_savevm_state_header(QEMUFile *f)
 {
     trace_savevm_state_header();
     qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
     qemu_put_be32(f, QEMU_VM_FILE_VERSION);
 
-    if (!savevm_state.skip_configuration) {
+    if (!savevm_state.skip_configuration || enforce_config_section()) {
         qemu_put_byte(f, QEMU_VM_CONFIGURATION);
         vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
     }
@@ -1883,7 +1889,7 @@ int qemu_loadvm_state(QEMUFile *f)
         return -ENOTSUP;
     }
 
-    if (!savevm_state.skip_configuration) {
+    if (!savevm_state.skip_configuration || enforce_config_section()) {
         if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) {
             error_report("Configuration section missing");
             return -EINVAL;
diff --git a/qemu-options.hx b/qemu-options.hx
index 599db94..144e6a9 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -43,7 +43,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
     "                aes-key-wrap=on|off controls support for AES key wrapping (default=on)\n"
     "                dea-key-wrap=on|off controls support for DEA key wrapping (default=on)\n"
     "                suppress-vmdesc=on|off disables self-describing migration (default=off)\n"
-    "                nvdimm=on|off controls NVDIMM support (default=off)\n",
+    "                nvdimm=on|off controls NVDIMM support (default=off)\n"
+    "                enforce-config-section=on|off enforce configuration section migration (default=off)\n",
     QEMU_ARCH_ALL)
 STEXI
 @item -machine [type=]@var{name}[,prop=@var{value}[,...]]
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PULL 8/8] xics: report errors with the QEMU Error API
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
                   ` (6 preceding siblings ...)
  2016-02-29  6:58 ` [Qemu-devel] [PULL 7/8] migration: allow machine to enforce configuration section migration David Gibson
@ 2016-02-29  6:58 ` David Gibson
  2016-02-29 11:24 ` [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 Peter Maydell
  8 siblings, 0 replies; 10+ messages in thread
From: David Gibson @ 2016-02-29  6:58 UTC (permalink / raw)
  To: peter.maydell
  Cc: mdroth, aik, qemu-devel, agraf, qemu-ppc, David Gibson, Greg Kurz

From: Greg Kurz <gkurz@linux.vnet.ibm.com>

Using the return value to report errors is error prone:
- xics_alloc() returns -1 on error but spapr_vio_busdev_realize() errors
  on 0
- xics_alloc_block() returns the unclear value of ics->offset - 1 on error
  but both rtas_ibm_change_msi() and spapr_phb_realize() error on 0

This patch adds an errp argument to xics_alloc() and xics_alloc_block() to
report errors. The return value of these functions is a valid IRQ number
if errp is NULL. It is undefined otherwise.

The corresponding error traces get promotted to error messages. Note that
the "can't allocate IRQ" error message in spapr_vio_busdev_realize() also
moves to xics_alloc(). Similar error message consolidation isn't really
applicable to xics_alloc_block() because callers have extra context (device
config address, MSI or MSIX).

This fixes the issues mentioned above.

Based on previous work from Brian W. Hart.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/intc/xics.c        | 13 +++++++++----
 hw/ppc/spapr_events.c |  3 ++-
 hw/ppc/spapr_pci.c    | 16 ++++++++++------
 hw/ppc/spapr_vio.c    |  7 ++++---
 include/hw/ppc/xics.h |  5 +++--
 trace-events          |  2 --
 6 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index e66ae32..213a370 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -712,7 +712,7 @@ static int ics_find_free_block(ICSState *ics, int num, int alignnum)
     return -1;
 }
 
-int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
+int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi, Error **errp)
 {
     ICSState *ics = &icp->ics[src];
     int irq;
@@ -720,14 +720,14 @@ int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
     if (irq_hint) {
         assert(src == xics_find_source(icp, irq_hint));
         if (!ICS_IRQ_FREE(ics, irq_hint - ics->offset)) {
-            trace_xics_alloc_failed_hint(src, irq_hint);
+            error_setg(errp, "can't allocate IRQ %d: already in use", irq_hint);
             return -1;
         }
         irq = irq_hint;
     } else {
         irq = ics_find_free_block(ics, 1, 1);
         if (irq < 0) {
-            trace_xics_alloc_failed_no_left(src);
+            error_setg(errp, "can't allocate IRQ: no IRQ left");
             return -1;
         }
         irq += ics->offset;
@@ -743,7 +743,8 @@ int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
  * Allocate block of consecutive IRQs, and return the number of the first IRQ in the block.
  * If align==true, aligns the first IRQ number to num.
  */
-int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align)
+int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align,
+                     Error **errp)
 {
     int i, first = -1;
     ICSState *ics = &icp->ics[src];
@@ -763,6 +764,10 @@ int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align)
     } else {
         first = ics_find_free_block(ics, num, 1);
     }
+    if (first < 0) {
+        error_setg(errp, "can't find a free %d-IRQ block", num);
+        return -1;
+    }
 
     if (first >= 0) {
         for (i = first; i < first + num; ++i) {
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index f5eac4b..39f4682 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -588,7 +588,8 @@ out_no_events:
 void spapr_events_init(sPAPRMachineState *spapr)
 {
     QTAILQ_INIT(&spapr->pending_events);
-    spapr->check_exception_irq = xics_alloc(spapr->icp, 0, 0, false);
+    spapr->check_exception_irq = xics_alloc(spapr->icp, 0, 0, false,
+                                            &error_fatal);
     spapr->epow_notifier.notify = spapr_powerdown_req;
     qemu_register_powerdown_notifier(&spapr->epow_notifier);
     spapr_rtas_register(RTAS_CHECK_EXCEPTION, "check-exception",
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 9b2b546..e8edad3 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -280,6 +280,7 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     PCIDevice *pdev = NULL;
     spapr_pci_msi *msi;
     int *config_addr_key;
+    Error *err = NULL;
 
     switch (func) {
     case RTAS_CHANGE_MSI_FN:
@@ -354,9 +355,10 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 
     /* Allocate MSIs */
     irq = xics_alloc_block(spapr->icp, 0, req_num, false,
-                           ret_intr_type == RTAS_TYPE_MSI);
-    if (!irq) {
-        error_report("Cannot allocate MSIs for device %x", config_addr);
+                           ret_intr_type == RTAS_TYPE_MSI, &err);
+    if (err) {
+        error_reportf_err(err, "Can't allocate MSIs for device %x: ",
+                          config_addr);
         rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
         return;
     }
@@ -1367,10 +1369,12 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
     /* Initialize the LSI table */
     for (i = 0; i < PCI_NUM_PINS; i++) {
         uint32_t irq;
+        Error *local_err = NULL;
 
-        irq = xics_alloc_block(spapr->icp, 0, 1, true, false);
-        if (!irq) {
-            error_setg(errp, "spapr_allocate_lsi failed");
+        irq = xics_alloc_block(spapr->icp, 0, 1, true, false, &local_err);
+        if (local_err) {
+            error_propagate(errp, local_err);
+            error_prepend(errp, "can't allocate LSIs: ");
             return;
         }
 
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index ac6666a..0f61a55 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -431,6 +431,7 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
     VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
     VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
     char *id;
+    Error *local_err = NULL;
 
     if (dev->reg != -1) {
         /*
@@ -463,9 +464,9 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
         dev->qdev.id = id;
     }
 
-    dev->irq = xics_alloc(spapr->icp, 0, dev->irq, false);
-    if (!dev->irq) {
-        error_setg(errp, "can't allocate IRQ");
+    dev->irq = xics_alloc(spapr->icp, 0, dev->irq, false, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
         return;
     }
 
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index 355a966..f60b06a 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -161,8 +161,9 @@ struct ICSIRQState {
 
 qemu_irq xics_get_qirq(XICSState *icp, int irq);
 void xics_set_irq_type(XICSState *icp, int irq, bool lsi);
-int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi);
-int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align);
+int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi, Error **errp);
+int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align,
+                     Error **errp);
 void xics_free(XICSState *icp, int irq, int num);
 
 void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu);
diff --git a/trace-events b/trace-events
index 61a133f..075ec27 100644
--- a/trace-events
+++ b/trace-events
@@ -1409,8 +1409,6 @@ xics_ics_write_xive(int nr, int srcno, int server, uint8_t priority) "ics_write_
 xics_ics_reject(int nr, int srcno) "reject irq %#x [src %d]"
 xics_ics_eoi(int nr) "ics_eoi: irq %#x"
 xics_alloc(int src, int irq) "source#%d, irq %d"
-xics_alloc_failed_hint(int src, int irq) "source#%d, irq %d is already in use"
-xics_alloc_failed_no_left(int src) "source#%d, no irq left"
 xics_alloc_block(int src, int first, int num, bool lsi, int align) "source#%d, first irq %d, %d irqs, lsi=%d, alignnum %d"
 xics_ics_free(int src, int irq, int num) "Source#%d, first irq %d, %d irqs"
 xics_ics_free_warn(int src, int irq) "Source#%d, irq %d is already free"
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229
  2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
                   ` (7 preceding siblings ...)
  2016-02-29  6:58 ` [Qemu-devel] [PULL 8/8] xics: report errors with the QEMU Error API David Gibson
@ 2016-02-29 11:24 ` Peter Maydell
  8 siblings, 0 replies; 10+ messages in thread
From: Peter Maydell @ 2016-02-29 11:24 UTC (permalink / raw)
  To: David Gibson
  Cc: Michael Roth, Alexey Kardashevskiy, QEMU Developers,
	Alexander Graf, qemu-ppc@nongnu.org

On 29 February 2016 at 06:58, David Gibson <david@gibson.dropbear.id.au> wrote:
> To probably no-one's surprise, my "hopefully last" pull request before
> the soft freeze has turned out not to be the last.  Here are a few
> more patches for qemu-2.6.
>
> The following changes since commit 6e378dd214fbbae8138ff011ec3de7ddf13a445f:
>
>   Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20160226' into staging (2016-02-26 16:02:00 +0000)
>
> are available in the git repository at:
>
>   git://github.com/dgibson/qemu.git tags/ppc-for-2.6-20160229
>
> for you to fetch changes up to a005b3ef50439b5bc6b2eb0b5bda8e8c7c2368bf:
>
>   xics: report errors with the QEMU Error API (2016-02-28 16:19:02 +1100)
>
> ----------------------------------------------------------------
> ppc patch queue for 2016-02-29
>
> Some more accumulated patches for target-ppc, pseries machine type and
> related devices to fit in before the qemu-2.6 soft freeze.
>     * Mostly bugfixes and small cleanups for spapr and Mac platforms
>
> ----------------------------------------------------------------

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-02-29 11:24 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-29  6:58 [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 1/8] spapr_rng: disable hotpluggability David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 2/8] spapr_pci: kill useless variable in rtas_ibm_change_msi() David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 3/8] spapr_pci: fix irq leak in RTAS ibm, change-msi David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 4/8] spapr: disable vmdesc submission for old machines David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 5/8] dbdma: warn when using unassigned channel David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 6/8] spapr: skip configuration section during migration of older machines David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 7/8] migration: allow machine to enforce configuration section migration David Gibson
2016-02-29  6:58 ` [Qemu-devel] [PULL 8/8] xics: report errors with the QEMU Error API David Gibson
2016-02-29 11:24 ` [Qemu-devel] [PULL 0/8] ppc-for-2.6 queue 20160229 Peter Maydell

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