lkml.org 
[lkml]   [2021]   [Nov]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [patch 29/37] PCI/MSI: Use __msi_get_virq() in pci_get_vector()
    On Sat, 27 Nov 2021 01:22:03 +0000,
    Thomas Gleixner <tglx@linutronix.de> wrote:
    >
    > Use __msi_get_vector() and handle the return values to be compatible.
    >
    > No functional change intended.

    You wish ;-).

    [ 15.779540] pcieport 0001:00:01.0: AER: request AER IRQ -22 failed

    Notice how amusing the IRQ number is?

    >
    > Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    > ---
    > drivers/pci/msi/msi.c | 25 +++++--------------------
    > 1 file changed, 5 insertions(+), 20 deletions(-)
    >
    > --- a/drivers/pci/msi/msi.c
    > +++ b/drivers/pci/msi/msi.c
    > @@ -1023,28 +1023,13 @@ EXPORT_SYMBOL(pci_free_irq_vectors);
    > */
    > int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
    > {
    > - if (dev->msix_enabled) {
    > - struct msi_desc *entry;
    > + int irq = __msi_get_virq(&dev->dev, nr);
    >
    > - for_each_pci_msi_entry(entry, dev) {
    > - if (entry->msi_index == nr)
    > - return entry->irq;
    > - }
    > - WARN_ON_ONCE(1);
    > - return -EINVAL;
    > + switch (irq) {
    > + case -ENODEV: return !nr ? dev->irq : -EINVAL;
    > + case -ENOENT: return -EINVAL;
    > }
    > -
    > - if (dev->msi_enabled) {
    > - struct msi_desc *entry = first_pci_msi_entry(dev);
    > -
    > - if (WARN_ON_ONCE(nr >= entry->nvec_used))
    > - return -EINVAL;
    > - } else {
    > - if (WARN_ON_ONCE(nr > 0))
    > - return -EINVAL;
    > - }
    > -
    > - return dev->irq + nr;
    > + return irq;
    > }
    > EXPORT_SYMBOL(pci_irq_vector);

    I worked around it with the hack below, but I doubt this is the real
    thing. portdrv_core.c does complicated things, and I don't completely
    understand its logic.

    M.

    diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
    index 1f72bc734226..b15278a5fb4b 100644
    --- a/drivers/pci/msi/msi.c
    +++ b/drivers/pci/msi/msi.c
    @@ -1092,8 +1092,9 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
    int irq = __msi_get_virq(&dev->dev, nr);

    switch (irq) {
    - case -ENODEV: return !nr ? dev->irq : -EINVAL;
    - case -ENOENT: return -EINVAL;
    + case -ENOENT:
    + case -ENODEV:
    + return !nr ? dev->irq : -EINVAL;
    }
    return irq;
    }
    --
    Without deviation from the norm, progress is not possible.

    \
     
     \ /
      Last update: 2021-11-28 20:40    [W:6.963 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site