[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH] Dont call msi_unmap_pirq() if did not enabled msi



Seems this list handling need a clean-up, sometimes it is protected, sometimes 
seems not. I will check it again because I didn't touch the this code for a 
long time.

--jyh

xen-devel-bounces@xxxxxxxxxxxxxxxxxxx wrote:
> I also noticed following code  have no lock protection in the
> list_for_each_entry_safe(pirq_entry, tmp,
> &msi_dev_entry->pirq_list_head, list) and needs a fix.
> 
> -- jyh
> 
>> void pci_disable_msix(struct pci_dev* dev)
>> {
>>     int pos;
>>     u16 control;
>> 
>>     if (!pci_msi_enable)
>>         return;
>>     if (!dev)
>>         return;
>> 
>> #ifdef CONFIG_XEN_PCIDEV_FRONTEND
>>     if (!is_initial_xendomain()) {
>>         struct msi_dev_list *msi_dev_entry;
>>         struct msi_pirq_entry *pirq_entry, *tmp;
>> 
>>         pci_frontend_disable_msix(dev);
>> 
>>         msi_dev_entry = get_msi_dev_pirq_list(dev);
>>         list_for_each_entry_safe(pirq_entry, tmp,
>>                                  &msi_dev_entry->pirq_list_head,
>>             list) { evtchn_map_pirq(pirq_entry->pirq, 0);
>>             list_del(&pirq_entry->list);
>>             kfree(pirq_entry);
>>         }
>> 
>>         dev->irq = msi_dev_entry->default_irq;
>>         return;
>>     }
>> #endif
> 
> 
> Jan Beulich wrote:
>> Wouldn't we need the same also for MSI-X?
>> 
>> Jan
>> 
>>>>> Joe Jin <joe.jin@xxxxxxxxxx> 24.11.09 03:02 >>>
>> Sorry I lost to set @dev->msi_enabled to false in pci_disable_msi,
>> here are the patch, please review and comment:
>> 
>> When device driver unload, it may call pci_disable_msi(), if
>> msi did not
>> enabled but do msi_unmap_pirq(), then later driver reload and without
>> msi, then will failed in request_irq() for irq_desc[irq]->chip valie
>> is no_irq_chip. So when did not enable msi during driver
>> initializing, then unloaded driver will not try to disable it.
>> 
>> How to reproduce it:
>>  At the server with QLogic 25xx, try to reload qla2xxx will hit it.
>> 
>> 
>> Signed-off-by: Joe Jin <joe.jin@xxxxxxxxxx>
>> ---
>> msi-xen.c |   13 +++++++++++++
>> 1 file changed, 13 insertions(+)
>> 
>> 
>> diff -r c5c40e80bd7d drivers/pci/msi-xen.c
>> --- a/drivers/pci/msi-xen.c  Fri Nov 13 22:01:54 2009 +0000
>> +++ b/drivers/pci/msi-xen.c  Tue Nov 24 09:56:52 2009 +0800 @@ -618,6
>> +618,7 @@ return ret; 
>> 
>>              dev->irq = evtchn_map_pirq(-1, dev->irq);
>> +            dev->msi_enabled = 1;
>>              msi_dev_entry->default_irq = temp;
>> 
>>              return ret;
>> @@ -662,9 +663,15 @@
>> 
>> #ifdef CONFIG_XEN_PCIDEV_FRONTEND
>>      if (!is_initial_xendomain()) {
>> +            if (!(dev->msi_enabled)) {
>> +                    printk(KERN_INFO "PCI: %s: Device did
>> not enabled MSI.\n",
>> +                           pci_name(dev));
>> +                    return;
>> +            }
>>              evtchn_map_pirq(dev->irq, 0);
>>              pci_frontend_disable_msi(dev);
>>              dev->irq = msi_dev_entry->default_irq;
>> +            dev->msi_enabled = 0;
>>              return;
>>      }
>> #endif
>> @@ -673,6 +680,12 @@
>>      if (!pos)
>>              return;
>> 
>> +    if (!(dev->msi_enabled)) {
>> +            printk(KERN_INFO "PCI: %s: Device did not
>> enabled MSI.\n",
>> +                   pci_name(dev));
>> +            return;
>> +    }
>> +
>>      pirq = dev->irq;
>>      /* Restore dev->irq to its default pin-assertion vector */
>>      dev->irq = msi_dev_entry->default_irq;
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.