qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-ppc] [PATCH 7/8] spapr: move spapr_ics_free() under irq_free_block


From: Cédric Le Goater
Subject: [Qemu-ppc] [PATCH 7/8] spapr: move spapr_ics_free() under irq_free_block() operation
Date: Sun, 29 Oct 2017 19:12:16 +0100

So we can now use bitmap_clear() which is slightly more efficent but
more important, it removes the usage of ics_valid_irq() which has a
reference to the 'ics' object of the machine.

Signed-off-by: Cédric Le Goater <address@hidden>
---
 hw/intc/trace-events |  2 --
 hw/intc/xics_spapr.c | 19 ++-----------------
 hw/ppc/spapr.c       | 11 ++++++++++-
 hw/ppc/trace-events  |  2 ++
 4 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/hw/intc/trace-events b/hw/intc/trace-events
index b86f242b0fcf..e34ecf7a16e5 100644
--- a/hw/intc/trace-events
+++ b/hw/intc/trace-events
@@ -65,8 +65,6 @@ xics_ics_simple_reject(int nr, int srcno) "reject irq 0x%x 
[src %d]"
 xics_ics_simple_eoi(int nr) "ics_eoi: irq 0x%x"
 xics_alloc(int irq) "irq %d"
 xics_alloc_block(int first, int num, bool lsi, int align) "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"
 
 # hw/intc/s390_flic_kvm.c
 flic_create_device(int err) "flic: create device failed %d"
diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c
index 23d81ff83182..4ba23fe5125b 100644
--- a/hw/intc/xics_spapr.c
+++ b/hw/intc/xics_spapr.c
@@ -304,25 +304,10 @@ int spapr_ics_alloc_block(ICSState *ics, int num, bool 
lsi,
     return first;
 }
 
-static void ics_free(ICSState *ics, int irq, int num)
-{
-    int i;
-    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(ics->xics);
-
-    for (i = irq; i < irq + num; ++i) {
-        if (xic->irq_test(ics->xics, i)) {
-            trace_xics_ics_free_warn(0, i);
-        }
-        xic->irq_free_block(ics->xics, i, 1);
-    }
-}
-
 void spapr_ics_free(ICSState *ics, int irq, int num)
 {
-    if (ics_valid_irq(ics, irq)) {
-        trace_xics_ics_free(0, irq, num);
-        ics_free(ics, irq, num);
-    }
+    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(ics->xics);
+    xic->irq_free_block(ics->xics, irq, num);
 }
 
 void spapr_dt_xics(int nr_servers, void *fdt, uint32_t phandle)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 557d89d9ecb5..f8224ea3e894 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3629,8 +3629,17 @@ static void spapr_irq_free_block(XICSFabric *xi, int 
irq, int num)
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
     int srcno = irq - spapr->irq_base;
+    int i;
 
-    bitmap_clear(spapr->irq_map, srcno, num);
+    if (srcno >= 0 && srcno < spapr->nr_irqs) {
+        trace_spapr_irq_free(0, irq, num);
+        for (i = srcno; i < srcno + num; ++i) {
+            if (!test_bit(i, spapr->irq_map)) {
+                trace_spapr_irq_free_warn(0, i);
+            }
+        }
+        bitmap_clear(spapr->irq_map, srcno, num);
+    }
 }
 
 static bool spapr_irq_is_lsi(XICSFabric *xi, int irq)
diff --git a/hw/ppc/trace-events b/hw/ppc/trace-events
index 4a6a6490fa78..dc9ab4c4deb3 100644
--- a/hw/ppc/trace-events
+++ b/hw/ppc/trace-events
@@ -12,6 +12,8 @@ spapr_pci_msi_retry(unsigned config_addr, unsigned req_num, 
unsigned max_irqs) "
 # hw/ppc/spapr.c
 spapr_cas_failed(unsigned long n) "DT diff buffer is too small: %ld bytes"
 spapr_cas_continue(unsigned long n) "Copy changes to the guest: %ld bytes"
+spapr_irq_free(int src, int irq, int num) "Source#%d, first irq %d, %d irqs"
+spapr_irq_free_warn(int src, int irq) "Source#%d, irq %d is already free"
 
 # hw/ppc/spapr_hcall.c
 spapr_cas_pvr_try(uint32_t pvr) "0x%x"
-- 
2.13.6




reply via email to

[Prev in Thread] Current Thread [Next in Thread]