Hi,
We should avoid using kmalloc while interrupts is disabled.
kmalloc may sleep.
Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx>
Best Regards,
Akio Takebe
diff -r e86f9e05144a drivers/xen/pciback/controller.c
--- a/drivers/xen/pciback/controller.c Mon Sep 08 14:02:13 2008 +0100
+++ b/drivers/xen/pciback/controller.c Tue Sep 09 16:28:20 2008 +0900
@@ -101,15 +101,15 @@
unsigned long flags;
int ret = 0, found = 0;
+ /* Look to see if we already have a domain:bus for this controller */
spin_lock_irqsave(&dev_data->lock, flags);
-
- /* Look to see if we already have a domain:bus for this controller */
list_for_each_entry(cntrl_entry, &dev_data->list, list) {
if (cntrl_entry->controller == dev_controller) {
found = 1;
break;
}
}
+ spin_unlock_irqrestore(&dev_data->lock, flags);
if (!found) {
cntrl_entry = kmalloc(sizeof(*cntrl_entry), GFP_ATOMIC);
@@ -128,9 +128,10 @@
dev_data->next_bus = 0;
}
+ spin_lock_irqsave(&dev_data->lock, flags);
INIT_LIST_HEAD(&cntrl_entry->dev_list);
-
list_add_tail(&cntrl_entry->list, &dev_data->list);
+ spin_unlock_irqrestore(&dev_data->lock, flags);
}
if (PCI_SLOT(cntrl_entry->next_devfn) > PCI_MAX_SLOTS) {
@@ -149,24 +150,24 @@
dev_entry = kmalloc(sizeof(*dev_entry), GFP_ATOMIC);
if (!dev_entry) {
+ spin_lock_irqsave(&dev_data->lock, flags);
if (list_empty(&cntrl_entry->dev_list)) {
list_del(&cntrl_entry->list);
kfree(cntrl_entry);
}
ret = -ENOMEM;
+ spin_unlock_irqrestore(&dev_data->lock, flags);
goto out;
}
dev_entry->dev = dev;
dev_entry->devfn = cntrl_entry->next_devfn;
+ spin_lock_irqsave(&dev_data->lock, flags);
list_add_tail(&dev_entry->list, &cntrl_entry->dev_list);
-
cntrl_entry->next_devfn += PCI_DEVFN(1, 0);
-
+ spin_unlock_irqrestore(&dev_data->lock, flags);
out:
- spin_unlock_irqrestore(&dev_data->lock, flags);
-
/* TODO: Publish virtual domain:bus:slot.func here. */
return ret;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|