Skip to content

Commit 112e43e

Browse files
committed
Revert "Merge tag 'irq-msi-2025-03-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip"
This reverts commit 36f5f02, reversing changes made to 43a7eec. Thomas says: "I just noticed that for some incomprehensible reason, probably sheer incompetemce when trying to utilize b4, I managed to merge an outdated _and_ buggy version of that series. Can you please revert that merge completely?" Done. Requested-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent acb4f33 commit 112e43e

File tree

12 files changed

+287
-252
lines changed

12 files changed

+287
-252
lines changed

drivers/ntb/msi.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,10 @@ int ntb_msi_setup_mws(struct ntb_dev *ntb)
106106
if (!ntb->msi)
107107
return -EINVAL;
108108

109-
scoped_guard (msi_descs_lock, &ntb->pdev->dev) {
110-
desc = msi_first_desc(&ntb->pdev->dev, MSI_DESC_ASSOCIATED);
111-
addr = desc->msg.address_lo + ((uint64_t)desc->msg.address_hi << 32);
112-
}
109+
msi_lock_descs(&ntb->pdev->dev);
110+
desc = msi_first_desc(&ntb->pdev->dev, MSI_DESC_ASSOCIATED);
111+
addr = desc->msg.address_lo + ((uint64_t)desc->msg.address_hi << 32);
112+
msi_unlock_descs(&ntb->pdev->dev);
113113

114114
for (peer = 0; peer < ntb_peer_port_count(ntb); peer++) {
115115
peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
@@ -289,7 +289,7 @@ int ntbm_msi_request_threaded_irq(struct ntb_dev *ntb, irq_handler_t handler,
289289
if (!ntb->msi)
290290
return -EINVAL;
291291

292-
guard(msi_descs_lock)(dev);
292+
msi_lock_descs(dev);
293293
msi_for_each_desc(entry, dev, MSI_DESC_ASSOCIATED) {
294294
if (irq_has_action(entry->irq))
295295
continue;
@@ -307,11 +307,17 @@ int ntbm_msi_request_threaded_irq(struct ntb_dev *ntb, irq_handler_t handler,
307307
ret = ntbm_msi_setup_callback(ntb, entry, msi_desc);
308308
if (ret) {
309309
devm_free_irq(&ntb->dev, entry->irq, dev_id);
310-
return ret;
310+
goto unlock;
311311
}
312-
return entry->irq;
312+
313+
ret = entry->irq;
314+
goto unlock;
313315
}
314-
return -ENODEV;
316+
ret = -ENODEV;
317+
318+
unlock:
319+
msi_unlock_descs(dev);
320+
return ret;
315321
}
316322
EXPORT_SYMBOL(ntbm_msi_request_threaded_irq);
317323

drivers/pci/controller/pci-hyperv.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3975,18 +3975,24 @@ static int hv_pci_restore_msi_msg(struct pci_dev *pdev, void *arg)
39753975
{
39763976
struct irq_data *irq_data;
39773977
struct msi_desc *entry;
3978+
int ret = 0;
39783979

39793980
if (!pdev->msi_enabled && !pdev->msix_enabled)
39803981
return 0;
39813982

3982-
guard(msi_descs_lock)(&pdev->dev);
3983+
msi_lock_descs(&pdev->dev);
39833984
msi_for_each_desc(entry, &pdev->dev, MSI_DESC_ASSOCIATED) {
39843985
irq_data = irq_get_irq_data(entry->irq);
3985-
if (WARN_ON_ONCE(!irq_data))
3986-
return -EINVAL;
3986+
if (WARN_ON_ONCE(!irq_data)) {
3987+
ret = -EINVAL;
3988+
break;
3989+
}
3990+
39873991
hv_compose_msi_msg(irq_data, &entry->msg);
39883992
}
3989-
return 0;
3993+
msi_unlock_descs(&pdev->dev);
3994+
3995+
return ret;
39903996
}
39913997

39923998
/*

drivers/pci/msi/api.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ void pci_disable_msi(struct pci_dev *dev)
5353
if (!pci_msi_enabled() || !dev || !dev->msi_enabled)
5454
return;
5555

56-
guard(msi_descs_lock)(&dev->dev);
56+
msi_lock_descs(&dev->dev);
5757
pci_msi_shutdown(dev);
5858
pci_free_msi_irqs(dev);
59+
msi_unlock_descs(&dev->dev);
5960
}
6061
EXPORT_SYMBOL(pci_disable_msi);
6162

@@ -195,9 +196,10 @@ void pci_disable_msix(struct pci_dev *dev)
195196
if (!pci_msi_enabled() || !dev || !dev->msix_enabled)
196197
return;
197198

198-
guard(msi_descs_lock)(&dev->dev);
199+
msi_lock_descs(&dev->dev);
199200
pci_msix_shutdown(dev);
200201
pci_free_msi_irqs(dev);
202+
msi_unlock_descs(&dev->dev);
201203
}
202204
EXPORT_SYMBOL(pci_disable_msix);
203205

drivers/pci/msi/msi.c

Lines changed: 60 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,41 @@ static int msi_verify_entries(struct pci_dev *dev)
335335
return !entry ? 0 : -EIO;
336336
}
337337

338-
static int __msi_capability_init(struct pci_dev *dev, int nvec, struct irq_affinity_desc *masks)
338+
/**
339+
* msi_capability_init - configure device's MSI capability structure
340+
* @dev: pointer to the pci_dev data structure of MSI device function
341+
* @nvec: number of interrupts to allocate
342+
* @affd: description of automatic IRQ affinity assignments (may be %NULL)
343+
*
344+
* Setup the MSI capability structure of the device with the requested
345+
* number of interrupts. A return value of zero indicates the successful
346+
* setup of an entry with the new MSI IRQ. A negative return value indicates
347+
* an error, and a positive return value indicates the number of interrupts
348+
* which could have been allocated.
349+
*/
350+
static int msi_capability_init(struct pci_dev *dev, int nvec,
351+
struct irq_affinity *affd)
339352
{
340-
int ret = msi_setup_msi_desc(dev, nvec, masks);
353+
struct irq_affinity_desc *masks = NULL;
341354
struct msi_desc *entry, desc;
355+
int ret;
342356

357+
/* Reject multi-MSI early on irq domain enabled architectures */
358+
if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY))
359+
return 1;
360+
361+
/*
362+
* Disable MSI during setup in the hardware, but mark it enabled
363+
* so that setup code can evaluate it.
364+
*/
365+
pci_msi_set_enable(dev, 0);
366+
dev->msi_enabled = 1;
367+
368+
if (affd)
369+
masks = irq_create_affinity_masks(nvec, affd);
370+
371+
msi_lock_descs(&dev->dev);
372+
ret = msi_setup_msi_desc(dev, nvec, masks);
343373
if (ret)
344374
goto fail;
345375

@@ -368,48 +398,19 @@ static int __msi_capability_init(struct pci_dev *dev, int nvec, struct irq_affin
368398

369399
pcibios_free_irq(dev);
370400
dev->irq = entry->irq;
371-
return 0;
401+
goto unlock;
402+
372403
err:
373404
pci_msi_unmask(&desc, msi_multi_mask(&desc));
374405
pci_free_msi_irqs(dev);
375406
fail:
376407
dev->msi_enabled = 0;
408+
unlock:
409+
msi_unlock_descs(&dev->dev);
410+
kfree(masks);
377411
return ret;
378412
}
379413

380-
/**
381-
* msi_capability_init - configure device's MSI capability structure
382-
* @dev: pointer to the pci_dev data structure of MSI device function
383-
* @nvec: number of interrupts to allocate
384-
* @affd: description of automatic IRQ affinity assignments (may be %NULL)
385-
*
386-
* Setup the MSI capability structure of the device with the requested
387-
* number of interrupts. A return value of zero indicates the successful
388-
* setup of an entry with the new MSI IRQ. A negative return value indicates
389-
* an error, and a positive return value indicates the number of interrupts
390-
* which could have been allocated.
391-
*/
392-
static int msi_capability_init(struct pci_dev *dev, int nvec,
393-
struct irq_affinity *affd)
394-
{
395-
/* Reject multi-MSI early on irq domain enabled architectures */
396-
if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY))
397-
return 1;
398-
399-
/*
400-
* Disable MSI during setup in the hardware, but mark it enabled
401-
* so that setup code can evaluate it.
402-
*/
403-
pci_msi_set_enable(dev, 0);
404-
dev->msi_enabled = 1;
405-
406-
struct irq_affinity_desc *masks __free(kfree) =
407-
affd ? irq_create_affinity_masks(nvec, affd) : NULL;
408-
409-
guard(msi_descs_lock)(&dev->dev);
410-
return __msi_capability_init(dev, nvec, masks);
411-
}
412-
413414
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
414415
struct irq_affinity *affd)
415416
{
@@ -662,41 +663,40 @@ static void msix_mask_all(void __iomem *base, int tsize)
662663
writel(ctrl, base + PCI_MSIX_ENTRY_VECTOR_CTRL);
663664
}
664665

665-
static int __msix_setup_interrupts(struct pci_dev *dev, struct msix_entry *entries,
666-
int nvec, struct irq_affinity_desc *masks)
666+
static int msix_setup_interrupts(struct pci_dev *dev, struct msix_entry *entries,
667+
int nvec, struct irq_affinity *affd)
667668
{
668-
int ret = msix_setup_msi_descs(dev, entries, nvec, masks);
669+
struct irq_affinity_desc *masks = NULL;
670+
int ret;
671+
672+
if (affd)
673+
masks = irq_create_affinity_masks(nvec, affd);
669674

675+
msi_lock_descs(&dev->dev);
676+
ret = msix_setup_msi_descs(dev, entries, nvec, masks);
670677
if (ret)
671-
goto fail;
678+
goto out_free;
672679

673680
ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
674681
if (ret)
675-
goto fail;
682+
goto out_free;
676683

677684
/* Check if all MSI entries honor device restrictions */
678685
ret = msi_verify_entries(dev);
679686
if (ret)
680-
goto fail;
687+
goto out_free;
681688

682689
msix_update_entries(dev, entries);
683-
return 0;
690+
goto out_unlock;
684691

685-
fail:
692+
out_free:
686693
pci_free_msi_irqs(dev);
694+
out_unlock:
695+
msi_unlock_descs(&dev->dev);
696+
kfree(masks);
687697
return ret;
688698
}
689699

690-
static int msix_setup_interrupts(struct pci_dev *dev, struct msix_entry *entries,
691-
int nvec, struct irq_affinity *affd)
692-
{
693-
struct irq_affinity_desc *masks __free(kfree) =
694-
affd ? irq_create_affinity_masks(nvec, affd) : NULL;
695-
696-
guard(msi_descs_lock)(&dev->dev);
697-
return __msix_setup_interrupts(dev, entries, nvec, masks);
698-
}
699-
700700
/**
701701
* msix_capability_init - configure device's MSI-X capability
702702
* @dev: pointer to the pci_dev data structure of MSI-X device function
@@ -870,13 +870,13 @@ void __pci_restore_msix_state(struct pci_dev *dev)
870870

871871
write_msg = arch_restore_msi_irqs(dev);
872872

873-
scoped_guard (msi_descs_lock, &dev->dev) {
874-
msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
875-
if (write_msg)
876-
__pci_write_msi_msg(entry, &entry->msg);
877-
pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
878-
}
873+
msi_lock_descs(&dev->dev);
874+
msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
875+
if (write_msg)
876+
__pci_write_msi_msg(entry, &entry->msg);
877+
pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
879878
}
879+
msi_unlock_descs(&dev->dev);
880880

881881
pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
882882
}
@@ -915,53 +915,6 @@ void pci_free_msi_irqs(struct pci_dev *dev)
915915
}
916916
}
917917

918-
#ifdef CONFIG_PCIE_TPH
919-
/**
920-
* pci_msix_write_tph_tag - Update the TPH tag for a given MSI-X vector
921-
* @pdev: The PCIe device to update
922-
* @index: The MSI-X index to update
923-
* @tag: The tag to write
924-
*
925-
* Returns: 0 on success, error code on failure
926-
*/
927-
int pci_msix_write_tph_tag(struct pci_dev *pdev, unsigned int index, u16 tag)
928-
{
929-
struct msi_desc *msi_desc;
930-
struct irq_desc *irq_desc;
931-
unsigned int virq;
932-
933-
if (!pdev->msix_enabled)
934-
return -ENXIO;
935-
936-
guard(msi_descs_lock)(&pdev->dev);
937-
virq = msi_get_virq(&pdev->dev, index);
938-
if (!virq)
939-
return -ENXIO;
940-
/*
941-
* This is a horrible hack, but short of implementing a PCI
942-
* specific interrupt chip callback and a huge pile of
943-
* infrastructure, this is the minor nuissance. It provides the
944-
* protection against concurrent operations on this entry and keeps
945-
* the control word cache in sync.
946-
*/
947-
irq_desc = irq_to_desc(virq);
948-
if (!irq_desc)
949-
return -ENXIO;
950-
951-
guard(raw_spinlock_irq)(&irq_desc->lock);
952-
msi_desc = irq_data_get_msi_desc(&irq_desc->irq_data);
953-
if (!msi_desc || msi_desc->pci.msi_attrib.is_virtual)
954-
return -ENXIO;
955-
956-
msi_desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_ST;
957-
msi_desc->pci.msix_ctrl |= FIELD_PREP(PCI_MSIX_ENTRY_CTRL_ST, tag);
958-
pci_msix_write_vector_ctrl(msi_desc, msi_desc->pci.msix_ctrl);
959-
/* Flush the write */
960-
readl(pci_msix_desc_addr(msi_desc));
961-
return 0;
962-
}
963-
#endif
964-
965918
/* Misc. infrastructure */
966919

967920
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)

drivers/pci/pci.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -989,15 +989,6 @@ int pcim_request_region_exclusive(struct pci_dev *pdev, int bar,
989989
const char *name);
990990
void pcim_release_region(struct pci_dev *pdev, int bar);
991991

992-
#ifdef CONFIG_PCI_MSI
993-
int pci_msix_write_tph_tag(struct pci_dev *pdev, unsigned int index, u16 tag);
994-
#else
995-
static inline int pci_msix_write_tph_tag(struct pci_dev *pdev, unsigned int index, u16 tag)
996-
{
997-
return -ENODEV;
998-
}
999-
#endif
1000-
1001992
/*
1002993
* Config Address for PCI Configuration Mechanism #1
1003994
*

0 commit comments

Comments
 (0)