@@ -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"
@@ -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)
@@ -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)
@@ -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"
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 <clg@kaod.org> --- 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(-)