All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: peter.maydell@linaro.org
Cc: lvivier@redhat.com, aik@ozlabs.ru, qemu-devel@nongnu.org,
	groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org,
	David Gibson <david@gibson.dropbear.id.au>,
	rth@twiddle.net
Subject: [Qemu-devel] [PULL 25/49] xics/kvm: Add error propagation to ic*_set_kvm_state() functions
Date: Tue,  2 Jul 2019 16:08:33 +1000	[thread overview]
Message-ID: <20190702060857.3926-26-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20190702060857.3926-1-david@gibson.dropbear.id.au>

From: Greg Kurz <groug@kaod.org>

This allows errors happening there to be propagated up to spapr_irq,
just like XIVE already does.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <156077921763.433243.4614327010172954196.stgit@bahia.lan>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/intc/xics.c        | 39 ++++++++++++++++++++++++++++++++++-----
 hw/intc/xics_kvm.c    | 37 ++++++++++++++++++++++---------------
 include/hw/ppc/xics.h |  6 +++---
 3 files changed, 59 insertions(+), 23 deletions(-)

diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index 978d7f0886..faa976e2f8 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -267,7 +267,14 @@ static int icp_post_load(void *opaque, int version_id)
     ICPState *icp = opaque;
 
     if (kvm_irqchip_in_kernel()) {
-        return icp_set_kvm_state(icp);
+        Error *local_err = NULL;
+        int ret;
+
+        ret = icp_set_kvm_state(icp, &local_err);
+        if (ret < 0) {
+            error_report_err(local_err);
+            return ret;
+        }
     }
 
     return 0;
@@ -300,7 +307,12 @@ static void icp_reset_handler(void *dev)
     qemu_set_irq(icp->output, 0);
 
     if (kvm_irqchip_in_kernel()) {
-        icp_set_kvm_state(ICP(dev));
+        Error *local_err = NULL;
+
+        icp_set_kvm_state(ICP(dev), &local_err);
+        if (local_err) {
+            error_report_err(local_err);
+        }
     }
 }
 
@@ -564,7 +576,12 @@ static void ics_simple_reset(DeviceState *dev)
     icsc->parent_reset(dev);
 
     if (kvm_irqchip_in_kernel()) {
-        ics_set_kvm_state(ICS_BASE(dev));
+        Error *local_err = NULL;
+
+        ics_set_kvm_state(ICS_BASE(dev), &local_err);
+        if (local_err) {
+            error_report_err(local_err);
+        }
     }
 }
 
@@ -680,7 +697,14 @@ static int ics_base_post_load(void *opaque, int version_id)
     ICSState *ics = opaque;
 
     if (kvm_irqchip_in_kernel()) {
-        return ics_set_kvm_state(ics);
+        Error *local_err = NULL;
+        int ret;
+
+        ret = ics_set_kvm_state(ics, &local_err);
+        if (ret < 0) {
+            error_report_err(local_err);
+            return ret;
+        }
     }
 
     return 0;
@@ -766,8 +790,13 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi)
         lsi ? XICS_FLAGS_IRQ_LSI : XICS_FLAGS_IRQ_MSI;
 
     if (kvm_irqchip_in_kernel()) {
+        Error *local_err = NULL;
+
         ics_reset_irq(ics->irqs + srcno);
-        ics_set_kvm_state_one(ics, srcno);
+        ics_set_kvm_state_one(ics, srcno, &local_err);
+        if (local_err) {
+            error_report_err(local_err);
+        }
     }
 }
 
diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
index c9e25fb051..4bfbe1a840 100644
--- a/hw/intc/xics_kvm.c
+++ b/hw/intc/xics_kvm.c
@@ -106,7 +106,7 @@ void icp_synchronize_state(ICPState *icp)
     }
 }
 
-int icp_set_kvm_state(ICPState *icp)
+int icp_set_kvm_state(ICPState *icp, Error **errp)
 {
     uint64_t state;
     int ret;
@@ -126,10 +126,11 @@ int icp_set_kvm_state(ICPState *icp)
         | ((uint64_t)icp->pending_priority << KVM_REG_PPC_ICP_PPRI_SHIFT);
 
     ret = kvm_set_one_reg(icp->cs, KVM_REG_PPC_ICP_STATE, &state);
-    if (ret != 0) {
-        error_report("Unable to restore KVM interrupt controller state (0x%"
-                PRIx64 ") for CPU %ld: %s", state, kvm_arch_vcpu_id(icp->cs),
-                strerror(errno));
+    if (ret < 0) {
+        error_setg_errno(errp, -ret,
+                         "Unable to restore KVM interrupt controller state (0x%"
+                         PRIx64 ") for CPU %ld", state,
+                         kvm_arch_vcpu_id(icp->cs));
         return ret;
     }
 
@@ -240,10 +241,9 @@ void ics_synchronize_state(ICSState *ics)
     ics_get_kvm_state(ics);
 }
 
-int ics_set_kvm_state_one(ICSState *ics, int srcno)
+int ics_set_kvm_state_one(ICSState *ics, int srcno, Error **errp)
 {
     uint64_t state;
-    Error *local_err = NULL;
     ICSIRQState *irq = &ics->irqs[srcno];
     int ret;
 
@@ -278,16 +278,15 @@ int ics_set_kvm_state_one(ICSState *ics, int srcno)
     }
 
     ret = kvm_device_access(kernel_xics_fd, KVM_DEV_XICS_GRP_SOURCES,
-                            srcno + ics->offset, &state, true, &local_err);
-    if (local_err) {
-        error_report_err(local_err);
+                            srcno + ics->offset, &state, true, errp);
+    if (ret < 0) {
         return ret;
     }
 
     return 0;
 }
 
-int ics_set_kvm_state(ICSState *ics)
+int ics_set_kvm_state(ICSState *ics, Error **errp)
 {
     int i;
 
@@ -297,10 +296,12 @@ int ics_set_kvm_state(ICSState *ics)
     }
 
     for (i = 0; i < ics->nr_irqs; i++) {
+        Error *local_err = NULL;
         int ret;
 
-        ret = ics_set_kvm_state_one(ics, i);
-        if (ret) {
+        ret = ics_set_kvm_state_one(ics, i, &local_err);
+        if (ret < 0) {
+            error_propagate(errp, local_err);
             return ret;
         }
     }
@@ -402,12 +403,18 @@ int xics_kvm_connect(SpaprMachineState *spapr, Error **errp)
     }
 
     /* Update the KVM sources */
-    ics_set_kvm_state(spapr->ics);
+    ics_set_kvm_state(spapr->ics, &local_err);
+    if (local_err) {
+        goto fail;
+    }
 
     /* Connect the presenters to the initial VCPUs of the machine */
     CPU_FOREACH(cs) {
         PowerPCCPU *cpu = POWERPC_CPU(cs);
-        icp_set_kvm_state(spapr_cpu_state(cpu)->icp);
+        icp_set_kvm_state(spapr_cpu_state(cpu)->icp, &local_err);
+        if (local_err) {
+            goto fail;
+        }
     }
 
     return 0;
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index eb65ad7e43..1eb7b5cd68 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -190,13 +190,13 @@ Object *icp_create(Object *cpu, const char *type, XICSFabric *xi,
 
 /* KVM */
 void icp_get_kvm_state(ICPState *icp);
-int icp_set_kvm_state(ICPState *icp);
+int icp_set_kvm_state(ICPState *icp, Error **errp);
 void icp_synchronize_state(ICPState *icp);
 void icp_kvm_realize(DeviceState *dev, Error **errp);
 
 void ics_get_kvm_state(ICSState *ics);
-int ics_set_kvm_state_one(ICSState *ics, int srcno);
-int ics_set_kvm_state(ICSState *ics);
+int ics_set_kvm_state_one(ICSState *ics, int srcno, Error **errp);
+int ics_set_kvm_state(ICSState *ics, Error **errp);
 void ics_synchronize_state(ICSState *ics);
 void ics_kvm_set_irq(ICSState *ics, int srcno, int val);
 
-- 
2.21.0



  parent reply	other threads:[~2019-07-02  6:45 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-02  6:08 [Qemu-devel] [PULL 00/49] ppc-for-4.1 queue 20190702 David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 01/49] spapr/rtas: Force big endian compile for rtas David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 02/49] docs: updates on the POWER9 XIVE interrupt controller documentation David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 03/49] ppc/pnv: fix StoreEOI activation David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 04/49] ppc/pnv: fix XSCOM MMIO base address for P9 machines with multiple chips David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 05/49] ppc/pnv: remove xscom_base field from PnvChip David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 06/49] spapr_pci: Fix potential NULL pointer dereference in spapr_dt_pci_bus() David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 07/49] xics/spapr: Prevent RTAS/hypercalls emulation to be used by in-kernel XICS David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 08/49] xics/spapr: Register RTAS/hypercalls once at machine init David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 09/49] xics/spapr: Detect old KVM XICS on POWER9 hosts David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 10/49] target/ppc: fix compile error in kvmppc_define_rtas_kernel_token() David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 11/49] xics: Add comment about CPU hotplug David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 12/49] target/ppc: remove getVSR()/putVSR() from fpu_helper.c David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 13/49] target/ppc: remove getVSR()/putVSR() from mem_helper.c David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 14/49] spapr_pci: Fix DRC owner in spapr_dt_pci_bus() David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 15/49] xics/spapr: Only emulated XICS should use RTAS/hypercalls emulation David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 16/49] spapr_pci: Drop useless CONFIG_KVM ifdefery David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 17/49] hw/ppc/mac_oldworld: " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 18/49] hw/ppc/mac_newworld: " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 19/49] hw/ppc/prep: " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 20/49] hw/ppc: " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 21/49] xics/spapr: Drop unused function declaration David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 22/49] xics/spapr: Rename xics_kvm_init() David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 23/49] xics/kvm: Skip rollback when KVM XICS is absent David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 24/49] xics/kvm: Always use local_err in xics_kvm_init() David Gibson
2019-07-02  6:08 ` David Gibson [this message]
2019-07-02  6:08 ` [Qemu-devel] [PULL 26/49] xics/kvm: Add proper rollback to xics_kvm_init() David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 27/49] ppc: Introduce kvmppc_set_reg_tb_offset() helper David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 28/49] target/ppc/machine: Add kvmppc_pvr_workaround_required() stub David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 29/49] target/ppc: remove getVSR()/putVSR() from int_helper.c David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 30/49] target/ppc: introduce separate VSX_CMP macro for xvcmp* instructions David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 31/49] target/ppc: introduce GEN_VSX_HELPER_X3 macro to fpu_helper.c David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 32/49] target/ppc: introduce separate generator and helper for xscvqpdp David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 33/49] target/ppc: introduce GEN_VSX_HELPER_X2 macro to fpu_helper.c David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 34/49] target/ppc: introduce GEN_VSX_HELPER_X2_AB " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 35/49] target/ppc: introduce GEN_VSX_HELPER_X1 " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 36/49] target/ppc: introduce GEN_VSX_HELPER_R3 " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 37/49] target/ppc: introduce GEN_VSX_HELPER_R2 " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 38/49] target/ppc: introduce GEN_VSX_HELPER_R2_AB " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 39/49] target/ppc: decode target register in VSX_VECTOR_LOAD_STORE_LENGTH at translation time David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 40/49] target/ppc: decode target register in VSX_EXTRACT_INSERT " David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 41/49] target/ppc: improve VSX_FMADD with new GEN_VSX_HELPER_VSX_MADD macro David Gibson
2019-08-28 15:50   ` [Qemu-devel] [Qemu-ppc] " Laurent Vivier
2019-08-28 17:08     ` Paul Clarke
2019-07-02  6:08 ` [Qemu-devel] [PULL 42/49] spapr_pci: Unregister listeners before destroying the IOMMU address space David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 43/49] spapr/xive: rework the mapping the KVM memory regions David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 44/49] spapr/xive: simplify spapr_irq_init_device() to remove the emulated init David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 45/49] ppc/xive: Force the Physical CAM line value to group mode David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 46/49] ppc/xive: Make the PIPR register readonly David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 47/49] ppc/pnv: Rework cache watch model of PnvXIVE David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 48/49] ppc/xive: Fix TM_PULL_POOL_CTX special operation David Gibson
2019-07-02  6:08 ` [Qemu-devel] [PULL 49/49] spapr/xive: Add proper rollback to kvmppc_xive_connect() David Gibson
2019-07-02  7:54 ` [Qemu-devel] [PULL 00/49] ppc-for-4.1 queue 20190702 no-reply
2019-07-02 19:21 ` Peter Maydell

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=20190702060857.3926-26-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=aik@ozlabs.ru \
    --cc=clg@kaod.org \
    --cc=groug@kaod.org \
    --cc=lvivier@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=rth@twiddle.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.