NVME driver allocates admin and IO vector using pci_alloc_irq_vectors().
In v4.9, if IO vector allocated using PCI_IRQ_AFFINITY,
then assignment of IO vector in vector_irq mismatches with actual assignment.
Due to which some IO INT fails to handle.
If IO vector allocated without using PCI_IRQ_AFFINITY,
then all IO INT scheduled on CPU 0 and no IO INT fails.
This problem only observed with Azure HyperV NVME,
so skipping PCI_IRQ_AFFINITY only in this case.
Change-Id: I9d511c8fb323345179643d9b3c4b2ca2c1bb00a4
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6464
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Srivatsa S. Bhat <srivatsab@vmware.com>
| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,47 @@ |
| 0 |
+NVME driver allocates admin and IO vector using pci_alloc_irq_vectors(). |
|
| 1 |
+ |
|
| 2 |
+In v4.9, if IO vector allocated using PCI_IRQ_AFFINITY, |
|
| 3 |
+then assignment of IO vector in vector_irq mismatches with actual assignment. |
|
| 4 |
+Due to which some IO INT fails to handle. |
|
| 5 |
+ |
|
| 6 |
+If IO vector allocated without using PCI_IRQ_AFFINITY, |
|
| 7 |
+then all IO INT scheduled on CPU 0 and no IO INT fails. |
|
| 8 |
+ |
|
| 9 |
+This problem only observed with Azure HyperV NVME, |
|
| 10 |
+so skipping PCI_IRQ_AFFINITY only in this case. |
|
| 11 |
+ |
|
| 12 |
+diff -Nurp linux-4.9.140_modified/drivers/nvme/host/pci.c linux-4.9.140/drivers/nvme/host/pci.c |
|
| 13 |
+--- linux-4.9.140_modified/drivers/nvme/host/pci.c 2018-11-23 17:27:41.000000000 +0530 |
|
| 14 |
+@@ -1450,8 +1450,18 @@ static int nvme_setup_io_queues(struct n |
|
| 15 |
+ * setting up the full range we need. |
|
| 16 |
+ */ |
|
| 17 |
+ pci_free_irq_vectors(pdev); |
|
| 18 |
+- nr_io_queues = pci_alloc_irq_vectors(pdev, 1, nr_io_queues, |
|
| 19 |
+- PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY); |
|
| 20 |
++ |
|
| 21 |
++ if (pdev->vendor == PCI_VENDOR_ID_MICROSOFT && |
|
| 22 |
++ pdev->device == PCI_DEVICE_ID_MICROSOFT_NVME) {
|
|
| 23 |
++ nr_io_queues = pci_alloc_irq_vectors(pdev, 1, nr_io_queues, |
|
| 24 |
++ PCI_IRQ_ALL_TYPES); |
|
| 25 |
++ dev_warn(dev->ctrl.device, "detected MicroSoft NVMe controller, " |
|
| 26 |
++ "skipping PCI_IRQ_AFFINITY from pci_alloc_irq_vectors\n"); |
|
| 27 |
++ } else {
|
|
| 28 |
++ nr_io_queues = pci_alloc_irq_vectors(pdev, 1, nr_io_queues, |
|
| 29 |
++ PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY); |
|
| 30 |
++ } |
|
| 31 |
++ |
|
| 32 |
+ if (nr_io_queues <= 0) |
|
| 33 |
+ return -EIO; |
|
| 34 |
+ dev->max_qid = nr_io_queues; |
|
| 35 |
+diff -Nurp linux-4.9.140_modified/include/linux/pci_ids.h linux-4.9.140/include/linux/pci_ids.h |
|
| 36 |
+--- linux-4.9.140_modified/include/linux/pci_ids.h 2018-11-23 17:27:41.000000000 +0530 |
|
| 37 |
+@@ -3056,4 +3056,7 @@ |
|
| 38 |
+ |
|
| 39 |
+ #define PCI_VENDOR_ID_NCUBE 0x10ff |
|
| 40 |
+ |
|
| 41 |
++#define PCI_VENDOR_ID_MICROSOFT 0x1414 |
|
| 42 |
++#define PCI_DEVICE_ID_MICROSOFT_NVME 0xb111 |
|
| 43 |
++ |
|
| 44 |
+ #endif /* _LINUX_PCI_IDS_H */ |
| ... | ... |
@@ -2,7 +2,7 @@ |
| 2 | 2 |
Summary: Kernel |
| 3 | 3 |
Name: linux |
| 4 | 4 |
Version: 4.9.140 |
| 5 |
-Release: 4%{?kat_build:.%kat_build}%{?dist}
|
|
| 5 |
+Release: 5%{?kat_build:.%kat_build}%{?dist}
|
|
| 6 | 6 |
License: GPLv2 |
| 7 | 7 |
URL: http://www.kernel.org/ |
| 8 | 8 |
Group: System Environment/Kernel |
| ... | ... |
@@ -76,6 +76,9 @@ Patch51: 0001_PCI_hv_Allocate_physically_contiguous_hypercall_params_buff |
| 76 | 76 |
Patch52: 0002_PCI_hv_Add_vPCI_version_protocol_negotiation.patch |
| 77 | 77 |
Patch53: 0003_PCI_hv_Use_vPCI_protocol_version_1.2_v4.9.patch |
| 78 | 78 |
|
| 79 |
+# NVME PCI patch |
|
| 80 |
+Patch61: 0001_nvme_io_irq_without_affinity.patch |
|
| 81 |
+ |
|
| 79 | 82 |
# Out-of-tree patches from AppArmor: |
| 80 | 83 |
Patch71: 0001-UBUNTU-SAUCE-AppArmor-basic-networking-rules.patch |
| 81 | 84 |
Patch72: 0002-apparmor-Fix-quieting-of-audit-messages-for-network-.patch |
| ... | ... |
@@ -198,6 +201,7 @@ This package contains the 'perf' performance analysis tools for Linux kernel. |
| 198 | 198 |
%patch51 -p1 |
| 199 | 199 |
%patch52 -p1 |
| 200 | 200 |
%patch53 -p1 |
| 201 |
+%patch61 -p1 |
|
| 201 | 202 |
|
| 202 | 203 |
%patch71 -p1 |
| 203 | 204 |
%patch72 -p1 |
| ... | ... |
@@ -372,6 +376,8 @@ ln -sf %{name}-%{uname_r}.cfg /boot/photon.cfg
|
| 372 | 372 |
/usr/share/doc/* |
| 373 | 373 |
|
| 374 | 374 |
%changelog |
| 375 |
+* Thu Jan 17 2019 Ajay Kaher <akaher@vmware.com> 4.9.140-5 |
|
| 376 |
+- Fix IRQ issues with NVMe on Azure. |
|
| 375 | 377 |
* Tue Jan 15 2019 Alexey Makhalov <amakhalov@vmware.com> 4.9.140-4 |
| 376 | 378 |
- .config: disable CONFIG_FANOTIFY_ACCESS_PERMISSIONS |
| 377 | 379 |
* Thu Dec 20 2018 Alexey Makhalov <amakhalov@vmware.com> 4.9.140-3 |