if (!kvm_cpus)
die("Couldn't allocate array for %d CPUs", nrcpus);
- irq__init(kvm);
+ r = irq__init(kvm);
+ if (r < 0) {
+ pr_err("irq__init() failed with error %d\n", r);
+ goto fail;
+ }
pci__init();
if (r < 0)
pr_warning("symbol__exit() failed with error %d\n", r);
+ r = irq__exit(kvm);
+ if (r < 0)
+ pr_warning("irq__exit() failed with error %d\n", r);
+
fb__stop();
virtio_blk__delete_all(kvm);
else if (result > 0)
new = &((*new)->rb_right);
else
- return 0;
+ return -EEXIST;
}
/* Add new node and rebalance tree. */
rb_link_node(&data->node, parent, new);
rb_insert_color(&data->node, root);
- return 1;
+ return 0;
}
int irq__register_device(u32 dev, u8 *num, u8 *pin, u8 *line)
{
struct pci_dev *node;
+ int r;
node = search(&pci_tree, dev);
/* We haven't found a node - First device of it's kind */
node = malloc(sizeof(*node));
if (node == NULL)
- return -1;
+ return -ENOMEM;
*node = (struct pci_dev) {
.id = dev,
INIT_LIST_HEAD(&node->lines);
- if (insert(&pci_tree, node) != 1) {
+ r = insert(&pci_tree, node);
+ if (r) {
free(node);
- return -1;
+ return r;
}
}
/* This device already has a pin assigned, give out a new line and device id */
struct irq_line *new = malloc(sizeof(*new));
if (new == NULL)
- return -1;
+ return -ENOMEM;
new->line = next_line++;
*line = new->line;
return 0;
}
- return -1;
+ return -EFAULT;
}
-void irq__init(struct kvm *kvm)
+int irq__init(struct kvm *kvm)
{
int i, r;
irq_routing = calloc(sizeof(struct kvm_irq_routing) +
IRQ_MAX_GSI * sizeof(struct kvm_irq_routing_entry), 1);
if (irq_routing == NULL)
- die("Failed allocating space for GSI table");
+ return -ENOMEM;
/* Hook first 8 GSIs to master IRQCHIP */
for (i = 0; i < 8; i++)
}
r = ioctl(kvm->vm_fd, KVM_SET_GSI_ROUTING, irq_routing);
- if (r)
- die("Failed setting GSI routes");
+ if (r) {
+ free(irq_routing);
+ return errno;
+ }
+
+ return 0;
+}
+
+int irq__exit(struct kvm *kvm)
+{
+ free(irq_routing);
+
+ return 0;
}
int irq__add_msix_route(struct kvm *kvm, struct msi_msg *msg)