Skip to content

Commit 8911466

Browse files
committed
PCI/MSI: Switch msix_capability_init() to guard(msi_desc_lock)
Split the lock protected functionality of msix_capability_init() out into a helper function and use guard(msi_desc_lock) to replace the lock/unlock pair. Simplify the error path in the helper function by utilizing a custom cleanup to get rid of the remaining gotos. No functional change intended. Signed-off-by: Thomas Gleixner <[email protected]> Acked-by: Bjorn Helgaas <[email protected]> Link: https://lore.kernel.org/all/[email protected]
1 parent f11cc2a commit 8911466

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

drivers/pci/msi/msi.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -660,35 +660,39 @@ static void msix_mask_all(void __iomem *base, int tsize)
660660
writel(ctrl, base + PCI_MSIX_ENTRY_VECTOR_CTRL);
661661
}
662662

663-
static int msix_setup_interrupts(struct pci_dev *dev, struct msix_entry *entries,
664-
int nvec, struct irq_affinity *affd)
663+
DEFINE_FREE(free_msi_irqs, struct pci_dev *, if (_T) pci_free_msi_irqs(_T));
664+
665+
static int __msix_setup_interrupts(struct pci_dev *__dev, struct msix_entry *entries,
666+
int nvec, struct irq_affinity_desc *masks)
665667
{
666-
struct irq_affinity_desc *masks __free(kfree) =
667-
affd ? irq_create_affinity_masks(nvec, affd) : NULL;
668-
int ret;
668+
struct pci_dev *dev __free(free_msi_irqs) = __dev;
669669

670-
msi_lock_descs(&dev->dev);
671-
ret = msix_setup_msi_descs(dev, entries, nvec, masks);
670+
int ret = msix_setup_msi_descs(dev, entries, nvec, masks);
672671
if (ret)
673-
goto out_free;
672+
return ret;
674673

675674
ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
676675
if (ret)
677-
goto out_free;
676+
return ret;
678677

679678
/* Check if all MSI entries honor device restrictions */
680679
ret = msi_verify_entries(dev);
681680
if (ret)
682-
goto out_free;
681+
return ret;
683682

684683
msix_update_entries(dev, entries);
685-
goto out_unlock;
684+
retain_and_null_ptr(dev);
685+
return 0;
686+
}
686687

687-
out_free:
688-
pci_free_msi_irqs(dev);
689-
out_unlock:
690-
msi_unlock_descs(&dev->dev);
691-
return ret;
688+
static int msix_setup_interrupts(struct pci_dev *dev, struct msix_entry *entries,
689+
int nvec, struct irq_affinity *affd)
690+
{
691+
struct irq_affinity_desc *masks __free(kfree) =
692+
affd ? irq_create_affinity_masks(nvec, affd) : NULL;
693+
694+
guard(msi_descs_lock)(&dev->dev);
695+
return __msix_setup_interrupts(dev, entries, nvec, masks);
692696
}
693697

694698
/**

0 commit comments

Comments
 (0)