On Tue, 17 Jan 2017, Marc Zyngier wrote: > +static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, > + unsigned int nr_irqs, void *args) > +{ > + msi_alloc_info_t *info = args; > + struct its_vpe **vpes = info->scratchpad[0].ptr; > + struct its_vm *vm = vpes[0]->its_vm; > + unsigned long *bitmap; > + struct page *vprop_page; > + int base, nr_ids, i, err = 0; > + > + bitmap = its_lpi_alloc_chunks(nr_irqs, &base, &nr_ids); > + if (!bitmap) > + return -ENOMEM; > + > + if (nr_ids < nr_irqs) { > + its_lpi_free_chunks(bitmap, base, nr_ids); > + return -ENOMEM; > + } > + > + vprop_page = its_allocate_prop_table(GFP_KERNEL); > + if (!vprop_page) { > + its_lpi_free_chunks(bitmap, base, nr_ids); > + return ENOMEM; > + } > + > + for (i = 0; i < nr_irqs; i++) { > + vpes[i]->vpe_db_lpi = base + i; > + err = its_vpe_init(vpes[i]); > + if (err) > + break; > + irq_domain_set_hwirq_and_chip(domain, > + virq + i, vpes[i]->vpe_db_lpi, > + &its_vpe_irq_chip, vpes[i]); > + set_bit(i, bitmap); > + } > + > + if (err) { > + while (--i >= 0) { > + its_vpe_teardown(vpes[i]); > + clear_bit(i, bitmap); > + } > + > + its_lpi_free_chunks(bitmap, base, nr_ids); > + its_free_prop_table(vprop_page); Couldn't you just do: if (err) { if (i > 0) its_vpe_irq_domain_free(domain, virq, i - 1) Hmm? Thanks, tglx _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm