A few cleanups of the MSI code. There were a couple of race conditions
in the use of msi_dev_head which this patch fixes. Use list_empty
rather than list_empty_careful since pirq_list_head is only ever
accessed under pirq_list_lock. I removed some unused variables.
Signed-off-by: Neil Turton <nturton@xxxxxxxxxxxxxx>
diff -r 0da2e3c3ae18 -r e48832688d07 drivers/pci/msi-xen.c
--- a/drivers/pci/msi-xen.c Thu May 08 13:44:57 2008 +0100
+++ b/drivers/pci/msi-xen.c Fri May 09 14:13:44 2008 +0100
@@ -32,7 +32,7 @@ int msi_register(struct msi_ops *ops)
return 0;
}
-static struct list_head msi_dev_head;
+static LIST_HEAD(msi_dev_head);
static int msi_dev_head_inited = 0;
DEFINE_SPINLOCK(msi_dev_lock);
@@ -54,11 +54,6 @@ static struct msi_dev_list *get_msi_dev_
struct msi_dev_list *msi_dev_list, *ret = NULL;
unsigned long flags;
- if (!msi_dev_head_inited) {
- INIT_LIST_HEAD(&msi_dev_head);
- msi_dev_head_inited = 1;
- }
-
spin_lock_irqsave(&msi_dev_lock, flags);
list_for_each_entry(msi_dev_list, &msi_dev_head, list)
@@ -79,10 +74,10 @@ static struct msi_dev_list *get_msi_dev_
return NULL;
}
+ spin_lock_init(&ret->pirq_list_lock);
+ INIT_LIST_HEAD(&ret->pirq_list_head);
list_add_tail(&ret->list, &msi_dev_head);
spin_unlock_irqrestore(&msi_dev_lock, flags);
- spin_lock_init(&ret->pirq_list_lock);
- INIT_LIST_HEAD(&ret->pirq_list_head);
return ret;
}
@@ -304,10 +299,9 @@ int pci_save_msix_state(struct pci_dev *
msi_dev_entry = get_msi_dev_pirq_list(dev);
spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
- if (!list_empty_careful(&msi_dev_entry->pirq_list_head))
- list_for_each_entry_safe(pirq_entry, tmp,
- &msi_dev_entry->pirq_list_head, list)
- msi_unmap_pirq(dev, pirq_entry->pirq);
+ list_for_each_entry_safe(pirq_entry, tmp,
+ &msi_dev_entry->pirq_list_head, list)
+ msi_unmap_pirq(dev, pirq_entry->pirq);
spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
@@ -394,7 +388,7 @@ static int msix_capability_init(struct p
return -ENOMEM;
spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
- if (!list_empty_careful(&msi_dev_entry->pirq_list_head))
+ if (!list_empty(&msi_dev_entry->pirq_list_head))
{
printk(KERN_WARNING "msix pirqs for dev %02x:%02x:%01x are not
freed \
before acquire again.\n", dev->bus->number,
PCI_SLOT(dev->devfn),
@@ -678,7 +672,7 @@ void msi_remove_pci_irq_vectors(struct p
msi_dev_entry = get_msi_dev_pirq_list(dev);
spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
- if (!list_empty_careful(&msi_dev_entry->pirq_list_head))
+ if (!list_empty(&msi_dev_entry->pirq_list_head))
{
printk(KERN_WARNING "msix pirqs for dev %02x:%02x:%01x are not
freed \
before acquire again.\n", dev->bus->number,
PCI_SLOT(dev->devfn),
diff -r 0da2e3c3ae18 -r e48832688d07
drivers/xen/pciback/conf_space_capability_msi.c
--- a/drivers/xen/pciback/conf_space_capability_msi.c Thu May 08 13:44:57
2008 +0100
+++ b/drivers/xen/pciback/conf_space_capability_msi.c Fri May 09 14:13:44
2008 +0100
@@ -11,7 +11,6 @@ int pciback_enable_msi(struct pciback_de
struct pci_dev *dev, struct xen_pci_op *op)
{
int otherend = pdev->xdev->otherend_id;
- int irq;
int status;
status = pci_enable_msi(dev);
@@ -29,8 +28,6 @@ int pciback_disable_msi(struct pciback_d
int pciback_disable_msi(struct pciback_device *pdev,
struct pci_dev *dev, struct xen_pci_op *op)
{
- int old_irq = dev->irq;
-
pci_disable_msi(dev);
op->value = dev->irq;
@@ -40,7 +37,7 @@ int pciback_enable_msix(struct pciback_d
int pciback_enable_msix(struct pciback_device *pdev,
struct pci_dev *dev, struct xen_pci_op *op)
{
- int otherend = pdev->xdev->otherend_id, result, i;
+ int result;
result = pci_enable_msix(dev, op->msix_entries, op->value);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|