Hi, This commit renders igb_uio unusable on Fedora 20, kernel version 3.19.8-100.fc20.x86_64.
During the build (make -j 20), a warning is issued for igb_uio regarding a missing symbol (pci_msi_unmask): WARNING: "pci_msi_unmask_irq" [/home/<redacted>/x86_64-native-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko] undefined! WARNING: "pci_msi_mask_irq" [/home/<redacted>/x86_64-native-linuxapp-gcc/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko] undefined! Subsequently, the module is may not be loaded on account of same. (from dmesg): [673425.712110] igb_uio: Unknown symbol pci_msi_unmask_irq (err 0) [673425.712124] igb_uio: Unknown symbol pci_msi_mask_irq (err 0) Thanks, Mark >-----Original Message----- >From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Markus Theil >Sent: Tuesday, September 5, 2017 1:04 PM >To: dev@dpdk.org >Cc: Yigit, Ferruh <ferruh.yi...@intel.com>; step...@networkplumber.org; Markus >Theil <markus.th...@tu-ilmenau.de> >Subject: [dpdk-dev] [PATCH v7 5/6] igb_uio: use kernel functions for masking >MSI-X > >This patch removes the custom MSI-X mask/unmask code and >uses already existing kernel functions. > >Signed-off-by: Markus Theil <markus.th...@tu-ilmenau.de> >--- > lib/librte_eal/linuxapp/igb_uio/compat.h | 26 +++++----------- > lib/librte_eal/linuxapp/igb_uio/igb_uio.c | 51 ++++++++++++------------------ >- > 2 files changed, 28 insertions(+), 49 deletions(-) > >diff --git a/lib/librte_eal/linuxapp/igb_uio/compat.h >b/lib/librte_eal/linuxapp/igb_uio/compat.h >index 3825933..67a7ab3 100644 >--- a/lib/librte_eal/linuxapp/igb_uio/compat.h >+++ b/lib/librte_eal/linuxapp/igb_uio/compat.h >@@ -15,24 +15,6 @@ > #define HAVE_PTE_MASK_PAGE_IOMAP > #endif > >-#ifndef PCI_MSIX_ENTRY_SIZE >-#define PCI_MSIX_ENTRY_SIZE 16 >-#define PCI_MSIX_ENTRY_LOWER_ADDR 0 >-#define PCI_MSIX_ENTRY_UPPER_ADDR 4 >-#define PCI_MSIX_ENTRY_DATA 8 >-#define PCI_MSIX_ENTRY_VECTOR_CTRL 12 >-#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1 >-#endif >- >-/* >- * for kernels < 2.6.38 and backported patch that moves MSI-X entry >definition >- * to pci_regs.h Those kernels has PCI_MSIX_ENTRY_SIZE defined but not >- * PCI_MSIX_ENTRY_CTRL_MASKBIT >- */ >-#ifndef PCI_MSIX_ENTRY_CTRL_MASKBIT >-#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1 >-#endif >- > #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34) && \ > (!(defined(RHEL_RELEASE_CODE) && \ > RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5, 9))) >@@ -127,3 +109,11 @@ static bool pci_check_and_mask_intx(struct pci_dev *pdev) > #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) > #define HAVE_ALLOC_IRQ_VECTORS 1 > #endif >+ >+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) >+#define HAVE_PCI_MSI_MASK_IRQ 1 >+#endif >+ >+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) >+#define HAVE_IRQ_DATA 1 >+#endif >diff --git a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c >b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c >index c570eed..e4ef817 100644 >--- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c >+++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c >@@ -91,27 +91,6 @@ static struct attribute *dev_attrs[] = { > static const struct attribute_group dev_attr_grp = { > .attrs = dev_attrs, > }; >-/* >- * It masks the msix on/off of generating MSI-X messages. >- */ >-static void >-igbuio_msix_mask_irq(struct msi_desc *desc, int32_t state) >-{ >- u32 mask_bits = desc->masked; >- unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + >- PCI_MSIX_ENTRY_VECTOR_CTRL; >- >- if (state != 0) >- mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; >- else >- mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; >- >- if (mask_bits != desc->masked) { >- writel(mask_bits, desc->mask_base + offset); >- readl(desc->mask_base); >- desc->masked = mask_bits; >- } >-} > > /** > * This is the irqcontrol callback to be registered to uio_info. >@@ -132,21 +111,31 @@ igbuio_pci_irqcontrol(struct uio_info *info, s32 >irq_state) > struct rte_uio_pci_dev *udev = info->priv; > struct pci_dev *pdev = udev->pdev; > >- pci_cfg_access_lock(pdev); >- if (udev->mode == RTE_INTR_MODE_LEGACY) >- pci_intx(pdev, !!irq_state); >+#ifdef HAVE_IRQ_DATA >+ struct irq_data *irq = irq_get_irq_data(udev->info.irq); >+#else >+ unsigned int irq = udev->info.irq; >+#endif > >- else if (udev->mode == RTE_INTR_MODE_MSIX) { >- struct msi_desc *desc; >+ pci_cfg_access_lock(pdev); > >-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)) >- list_for_each_entry(desc, &pdev->msi_list, list) >- igbuio_msix_mask_irq(desc, irq_state); >+ if (udev->mode == RTE_INTR_MODE_MSIX) { >+#ifdef HAVE_PCI_MSI_MASK_IRQ >+ if (irq_state == 1) >+ pci_msi_unmask_irq(irq); >+ else >+ pci_msi_mask_irq(irq); > #else >- list_for_each_entry(desc, &pdev->dev.msi_list, list) >- igbuio_msix_mask_irq(desc, irq_state); >+ if (irq_state == 1) >+ unmask_msi_irq(irq); >+ else >+ mask_msi_irq(irq); > #endif > } >+ >+ if (udev->mode == RTE_INTR_MODE_LEGACY) >+ pci_intx(pdev, !!irq_state); >+ > pci_cfg_access_unlock(pdev); > > return 0; >-- >2.7.4