From: Greg Kroah-Hartman Date: Fri, 19 Nov 2021 14:16:19 +0000 (+0100) Subject: 4.19-stable patches X-Git-Tag: v5.4.161~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5796573622dc38ff529c9e3d1b7503decb02abbd;p=thirdparty%2Fkernel%2Fstable-queue.git 4.19-stable patches added patches: pci-add-msi-masking-quirk-for-nvidia-ion-ahci.patch pci-msi-deal-with-devices-lying-about-their-msi-mask-capability.patch pci-msi-destroy-sysfs-before-freeing-entries.patch --- diff --git a/queue-4.19/pci-add-msi-masking-quirk-for-nvidia-ion-ahci.patch b/queue-4.19/pci-add-msi-masking-quirk-for-nvidia-ion-ahci.patch new file mode 100644 index 00000000000..1b650614218 --- /dev/null +++ b/queue-4.19/pci-add-msi-masking-quirk-for-nvidia-ion-ahci.patch @@ -0,0 +1,38 @@ +From f21082fb20dbfb3e42b769b59ef21c2a7f2c7c1f Mon Sep 17 00:00:00 2001 +From: Marc Zyngier +Date: Thu, 4 Nov 2021 18:01:30 +0000 +Subject: PCI: Add MSI masking quirk for Nvidia ION AHCI + +From: Marc Zyngier + +commit f21082fb20dbfb3e42b769b59ef21c2a7f2c7c1f upstream. + +The ION AHCI device pretends that MSI masking isn't a thing, while it +actually implements it and needs MSIs to be unmasked to work. Add a quirk +to that effect. + +Reported-by: Rui Salvaterra +Signed-off-by: Marc Zyngier +Signed-off-by: Thomas Gleixner +Tested-by: Rui Salvaterra +Reviewed-by: Thomas Gleixner +Cc: Bjorn Helgaas +Link: https://lore.kernel.org/r/CALjTZvbzYfBuLB+H=fj2J+9=DxjQ2Uqcy0if_PvmJ-nU-qEgkg@mail.gmail.com +Link: https://lore.kernel.org/r/20211104180130.3825416-3-maz@kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pci/quirks.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -5579,3 +5579,9 @@ static void apex_pci_fixup_class(struct + } + DECLARE_PCI_FIXUP_CLASS_HEADER(0x1ac1, 0x089a, + PCI_CLASS_NOT_DEFINED, 8, apex_pci_fixup_class); ++ ++static void nvidia_ion_ahci_fixup(struct pci_dev *pdev) ++{ ++ pdev->dev_flags |= PCI_DEV_FLAGS_HAS_MSI_MASKING; ++} ++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, 0x0ab8, nvidia_ion_ahci_fixup); diff --git a/queue-4.19/pci-msi-deal-with-devices-lying-about-their-msi-mask-capability.patch b/queue-4.19/pci-msi-deal-with-devices-lying-about-their-msi-mask-capability.patch new file mode 100644 index 00000000000..ffe8b58f564 --- /dev/null +++ b/queue-4.19/pci-msi-deal-with-devices-lying-about-their-msi-mask-capability.patch @@ -0,0 +1,51 @@ +From 2226667a145db2e1f314d7f57fd644fe69863ab9 Mon Sep 17 00:00:00 2001 +From: Marc Zyngier +Date: Thu, 4 Nov 2021 18:01:29 +0000 +Subject: PCI/MSI: Deal with devices lying about their MSI mask capability + +From: Marc Zyngier + +commit 2226667a145db2e1f314d7f57fd644fe69863ab9 upstream. + +It appears that some devices are lying about their mask capability, +pretending that they don't have it, while they actually do. +The net result is that now that we don't enable MSIs on such +endpoint. + +Add a new per-device flag to deal with this. Further patches will +make use of it, sadly. + +Signed-off-by: Marc Zyngier +Signed-off-by: Thomas Gleixner +Reviewed-by: Thomas Gleixner +Link: https://lore.kernel.org/r/20211104180130.3825416-2-maz@kernel.org +Cc: Bjorn Helgaas +Signed-off-by: Greg Kroah-Hartman +--- + drivers/pci/msi.c | 3 +++ + include/linux/pci.h | 2 ++ + 2 files changed, 5 insertions(+) + +--- a/drivers/pci/msi.c ++++ b/drivers/pci/msi.c +@@ -569,6 +569,9 @@ msi_setup_entry(struct pci_dev *dev, int + goto out; + + pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); ++ /* Lies, damned lies, and MSIs */ ++ if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING) ++ control |= PCI_MSI_FLAGS_MASKBIT; + + entry->msi_attrib.is_msix = 0; + entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT); +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -205,6 +205,8 @@ enum pci_dev_flags { + PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10), + /* Don't use Relaxed Ordering for TLPs directed at this device */ + PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11), ++ /* Device does honor MSI masking despite saying otherwise */ ++ PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12), + }; + + enum pci_irq_reroute_variant { diff --git a/queue-4.19/pci-msi-destroy-sysfs-before-freeing-entries.patch b/queue-4.19/pci-msi-destroy-sysfs-before-freeing-entries.patch new file mode 100644 index 00000000000..5b6aff409f2 --- /dev/null +++ b/queue-4.19/pci-msi-destroy-sysfs-before-freeing-entries.patch @@ -0,0 +1,67 @@ +From 3735459037114d31e5acd9894fad9aed104231a0 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 9 Nov 2021 14:53:57 +0100 +Subject: PCI/MSI: Destroy sysfs before freeing entries + +From: Thomas Gleixner + +commit 3735459037114d31e5acd9894fad9aed104231a0 upstream. + +free_msi_irqs() frees the MSI entries before destroying the sysfs entries +which are exposing them. Nothing prevents a concurrent free while a sysfs +file is read and accesses the possibly freed entry. + +Move the sysfs release ahead of freeing the entries. + +Fixes: 1c51b50c2995 ("PCI/MSI: Export MSI mode using attributes, not kobjects") +Signed-off-by: Thomas Gleixner +Reviewed-by: Greg Kroah-Hartman +Cc: Bjorn Helgaas +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/87sfw5305m.ffs@tglx +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/msi.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +--- a/drivers/pci/msi.c ++++ b/drivers/pci/msi.c +@@ -372,18 +372,6 @@ static void free_msi_irqs(struct pci_dev + for (i = 0; i < entry->nvec_used; i++) + BUG_ON(irq_has_action(entry->irq + i)); + +- pci_msi_teardown_msi_irqs(dev); +- +- list_for_each_entry_safe(entry, tmp, msi_list, list) { +- if (entry->msi_attrib.is_msix) { +- if (list_is_last(&entry->list, msi_list)) +- iounmap(entry->mask_base); +- } +- +- list_del(&entry->list); +- free_msi_entry(entry); +- } +- + if (dev->msi_irq_groups) { + sysfs_remove_groups(&dev->dev.kobj, dev->msi_irq_groups); + msi_attrs = dev->msi_irq_groups[0]->attrs; +@@ -399,6 +387,18 @@ static void free_msi_irqs(struct pci_dev + kfree(dev->msi_irq_groups); + dev->msi_irq_groups = NULL; + } ++ ++ pci_msi_teardown_msi_irqs(dev); ++ ++ list_for_each_entry_safe(entry, tmp, msi_list, list) { ++ if (entry->msi_attrib.is_msix) { ++ if (list_is_last(&entry->list, msi_list)) ++ iounmap(entry->mask_base); ++ } ++ ++ list_del(&entry->list); ++ free_msi_entry(entry); ++ } + } + + static void pci_intx_for_msi(struct pci_dev *dev, int enable) diff --git a/queue-4.19/series b/queue-4.19/series index dca4dbdcd2e..025068a1e7b 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -251,3 +251,6 @@ x86-cpu-fix-migration-safety-with-x86_bug_null_sel.patch ext4-fix-lazy-initialization-next-schedule-time-computation-in-more-granular-unit.patch fortify-explicitly-disable-clang-support.patch parisc-entry-fix-trace-test-in-syscall-exit-path.patch +pci-msi-destroy-sysfs-before-freeing-entries.patch +pci-msi-deal-with-devices-lying-about-their-msi-mask-capability.patch +pci-add-msi-masking-quirk-for-nvidia-ion-ahci.patch