Commit 6b292a04 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by David S. Miller

pci_irq_vector() can't be used in atomic context any longer. This conflicts

with the usage of this function in nic_mbx_intr_handler().

Cache the Linux interrupt numbers in struct nicpf and use that cache in the
interrupt handler to select the mailbox.

Fixes: 495c66ac ("genirq/msi: Convert to new functions")
Reported-by: default avatarOndrej Mosnacek <omosnace@redhat.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Sunil Goutham <sgoutham@marvell.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: netdev@vger.kernel.org
Cc: stable@vger.kernel.org
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2041772Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b6693611
...@@ -59,7 +59,7 @@ struct nicpf { ...@@ -59,7 +59,7 @@ struct nicpf {
/* MSI-X */ /* MSI-X */
u8 num_vec; u8 num_vec;
bool irq_allocated[NIC_PF_MSIX_VECTORS]; unsigned int irq_allocated[NIC_PF_MSIX_VECTORS];
char irq_name[NIC_PF_MSIX_VECTORS][20]; char irq_name[NIC_PF_MSIX_VECTORS][20];
}; };
...@@ -1150,7 +1150,7 @@ static irqreturn_t nic_mbx_intr_handler(int irq, void *nic_irq) ...@@ -1150,7 +1150,7 @@ static irqreturn_t nic_mbx_intr_handler(int irq, void *nic_irq)
u64 intr; u64 intr;
u8 vf; u8 vf;
if (irq == pci_irq_vector(nic->pdev, NIC_PF_INTR_ID_MBOX0)) if (irq == nic->irq_allocated[NIC_PF_INTR_ID_MBOX0])
mbx = 0; mbx = 0;
else else
mbx = 1; mbx = 1;
...@@ -1176,14 +1176,14 @@ static void nic_free_all_interrupts(struct nicpf *nic) ...@@ -1176,14 +1176,14 @@ static void nic_free_all_interrupts(struct nicpf *nic)
for (irq = 0; irq < nic->num_vec; irq++) { for (irq = 0; irq < nic->num_vec; irq++) {
if (nic->irq_allocated[irq]) if (nic->irq_allocated[irq])
free_irq(pci_irq_vector(nic->pdev, irq), nic); free_irq(nic->irq_allocated[irq], nic);
nic->irq_allocated[irq] = false; nic->irq_allocated[irq] = 0;
} }
} }
static int nic_register_interrupts(struct nicpf *nic) static int nic_register_interrupts(struct nicpf *nic)
{ {
int i, ret; int i, ret, irq;
nic->num_vec = pci_msix_vec_count(nic->pdev); nic->num_vec = pci_msix_vec_count(nic->pdev);
/* Enable MSI-X */ /* Enable MSI-X */
...@@ -1201,13 +1201,13 @@ static int nic_register_interrupts(struct nicpf *nic) ...@@ -1201,13 +1201,13 @@ static int nic_register_interrupts(struct nicpf *nic)
sprintf(nic->irq_name[i], sprintf(nic->irq_name[i],
"NICPF Mbox%d", (i - NIC_PF_INTR_ID_MBOX0)); "NICPF Mbox%d", (i - NIC_PF_INTR_ID_MBOX0));
ret = request_irq(pci_irq_vector(nic->pdev, i), irq = pci_irq_vector(nic->pdev, i);
nic_mbx_intr_handler, 0, ret = request_irq(irq, nic_mbx_intr_handler, 0,
nic->irq_name[i], nic); nic->irq_name[i], nic);
if (ret) if (ret)
goto fail; goto fail;
nic->irq_allocated[i] = true; nic->irq_allocated[i] = irq;
} }
/* Enable mailbox interrupt */ /* Enable mailbox interrupt */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment