From mboxrd@z Thu Jan 1 00:00:00 1970 From: Akio Takebe Subject: [Patch] linux: avoid kmalloc while disabling interrupts Date: Tue, 09 Sep 2008 16:41:48 +0900 Message-ID: <48C628BC.8090805@jp.fujitsu.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------000007010200050008080509" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------000007010200050008080509 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hi, We should avoid using kmalloc while interrupts is disabled. kmalloc may sleep. Signed-off-by: Akio Takebe Best Regards, Akio Takebe --------------000007010200050008080509 Content-Type: text/x-diff; name="avoid_kmalloc_while_disabling_interrupts.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="avoid_kmalloc_while_disabling_interrupts.patch" 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; --------------000007010200050008080509 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------000007010200050008080509--