Blame SOURCES/kvm-hw-ppc-clear-pending_events-on-machine-reset.patch

9bac43
From 32a2cf9dfe251696b1d26b70723c5014e7ecbf45 Mon Sep 17 00:00:00 2001
9bac43
From: David Gibson <dgibson@redhat.com>
9bac43
Date: Wed, 4 Oct 2017 05:40:12 +0200
9bac43
Subject: [PATCH 05/34] hw/ppc: clear pending_events on machine reset
9bac43
9bac43
RH-Author: David Gibson <dgibson@redhat.com>
9bac43
Message-id: <20171004054014.14159-3-dgibson@redhat.com>
9bac43
Patchwork-id: 76803
9bac43
O-Subject: [RHEL-7.5 qemu-kvm-rhev PATCH 2/4] hw/ppc: clear pending_events on machine reset
9bac43
Bugzilla: 1448344
9bac43
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
9bac43
RH-Acked-by: Thomas Huth <thuth@redhat.com>
9bac43
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
9bac43
From: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
9bac43
9bac43
The sPAPR machine isn't clearing up the pending events QTAILQ on
9bac43
machine reboot. This allows for unprocessed hotplug/epow events
9bac43
to persist in the queue after reset and, when reasserting the IRQs in
9bac43
check_exception later on, these will be being processed by the OS.
9bac43
9bac43
This patch implements a new function called 'spapr_clear_pending_events'
9bac43
that clears up the pending_events QTAILQ. This helper is then called
9bac43
inside ppc_spapr_reset to clear up the events queue, preventing
9bac43
old/deprecated events from persisting after a reset.
9bac43
9bac43
Signed-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
9bac43
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
9bac43
(cherry picked from commit 56258174238eb25df629a53a96e1ac16a32dc7d4)
9bac43
9bac43
Signed-off-by: David Gibson <dgibson@redhat.com>
9bac43
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
---
9bac43
 hw/ppc/spapr.c         |  1 +
9bac43
 hw/ppc/spapr_events.c  | 11 +++++++++++
9bac43
 include/hw/ppc/spapr.h |  1 +
9bac43
 3 files changed, 13 insertions(+)
9bac43
9bac43
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
9bac43
index 8d1cfcf..a419aa7 100644
9bac43
--- a/hw/ppc/spapr.c
9bac43
+++ b/hw/ppc/spapr.c
9bac43
@@ -1393,6 +1393,7 @@ static void ppc_spapr_reset(void)
9bac43
     }
9bac43
 
9bac43
     qemu_devices_reset();
9bac43
+    spapr_clear_pending_events(spapr);
9bac43
 
9bac43
     /*
9bac43
      * We place the device tree and RTAS just below either the top of the RMA,
9bac43
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
9bac43
index f952b78..66b8164 100644
9bac43
--- a/hw/ppc/spapr_events.c
9bac43
+++ b/hw/ppc/spapr_events.c
9bac43
@@ -700,6 +700,17 @@ static void event_scan(PowerPCCPU *cpu, sPAPRMachineState *spapr,
9bac43
     rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND);
9bac43
 }
9bac43
 
9bac43
+void spapr_clear_pending_events(sPAPRMachineState *spapr)
9bac43
+{
9bac43
+    sPAPREventLogEntry *entry = NULL;
9bac43
+
9bac43
+    QTAILQ_FOREACH(entry, &spapr->pending_events, next) {
9bac43
+        QTAILQ_REMOVE(&spapr->pending_events, entry, next);
9bac43
+        g_free(entry->extended_log);
9bac43
+        g_free(entry);
9bac43
+    }
9bac43
+}
9bac43
+
9bac43
 void spapr_events_init(sPAPRMachineState *spapr)
9bac43
 {
9bac43
     QTAILQ_INIT(&spapr->pending_events);
9bac43
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
9bac43
index 2a303a7..5d161ec 100644
9bac43
--- a/include/hw/ppc/spapr.h
9bac43
+++ b/include/hw/ppc/spapr.h
9bac43
@@ -662,6 +662,7 @@ void spapr_cpu_parse_features(sPAPRMachineState *spapr);
9bac43
 int spapr_hpt_shift_for_ramsize(uint64_t ramsize);
9bac43
 void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
9bac43
                           Error **errp);
9bac43
+void spapr_clear_pending_events(sPAPRMachineState *spapr);
9bac43
 
9bac43
 /* CPU and LMB DRC release callbacks. */
9bac43
 void spapr_core_release(DeviceState *dev);
9bac43
-- 
9bac43
1.8.3.1
9bac43