aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ena
diff options
context:
space:
mode:
authorMarcin Wojtas <mw@FreeBSD.org>2017-11-09 12:03:06 +0000
committerMarcin Wojtas <mw@FreeBSD.org>2017-11-09 12:03:06 +0000
commit8805021a2a73619a3190654edbd94a6d17606707 (patch)
tree06ddfa9f0c7393f74784e5ccf43453a7067026ce /sys/dev/ena
parent0052f3b5802d45950453a19d7a38df3be1f95fa8 (diff)
downloadsrc-8805021a2a73619a3190654edbd94a6d17606707.tar.gz
src-8805021a2a73619a3190654edbd94a6d17606707.zip
Allow partial MSI-x allocation in ENA driver
The situation, where part of the MSI-x was not configured properly, was not properly handled. Now, the driver reduces number of queues to reflect number of existing and properly configured MSI-x vectors. Submitted by: Michal Krawczyk <mk@semihalf.com> Reviewed by: byenduri_gmail.com Obtained from: Semihalf Sponsored by: Amazon, Inc. Differential Revision: https://reviews.freebsd.org/D12863
Notes
Notes: svn path=/head/; revision=325583
Diffstat (limited to 'sys/dev/ena')
-rw-r--r--sys/dev/ena/ena.c10
-rw-r--r--sys/dev/ena/ena.h3
2 files changed, 11 insertions, 2 deletions
diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c
index 7c4100487072..0e02efb10471 100644
--- a/sys/dev/ena/ena.c
+++ b/sys/dev/ena/ena.c
@@ -1796,7 +1796,8 @@ static int
ena_enable_msix(struct ena_adapter *adapter)
{
device_t dev = adapter->pdev;
- int i, msix_vecs, rc = 0;
+ int msix_vecs, msix_req;
+ int i, rc = 0;
/* Reserved the max msix vectors we might need */
msix_vecs = ENA_MAX_MSIX_VEC(adapter->num_queues);
@@ -1813,6 +1814,7 @@ ena_enable_msix(struct ena_adapter *adapter)
adapter->msix_entries[i].vector = i + 1;
}
+ msix_req = msix_vecs;
rc = pci_alloc_msix(dev, &msix_vecs);
if (unlikely(rc != 0)) {
device_printf(dev,
@@ -1822,6 +1824,12 @@ ena_enable_msix(struct ena_adapter *adapter)
goto err_msix_free;
}
+ if (msix_vecs != msix_req) {
+ device_printf(dev, "Enable only %d MSI-x (out of %d), reduce "
+ "the number of queues\n", msix_vecs, msix_req);
+ adapter->num_queues = msix_vecs - ENA_ADMIN_MSIX_VEC;
+ }
+
adapter->msix_vecs = msix_vecs;
adapter->msix_enabled = true;
diff --git a/sys/dev/ena/ena.h b/sys/dev/ena/ena.h
index 97a2e47363f8..f7ce5fe22530 100644
--- a/sys/dev/ena/ena.h
+++ b/sys/dev/ena/ena.h
@@ -58,7 +58,8 @@
#define ENA_DMA_BIT_MASK(x) ((1ULL << (x)) - 1ULL)
/* 1 for AENQ + ADMIN */
-#define ENA_MAX_MSIX_VEC(io_queues) (1 + (io_queues))
+#define ENA_ADMIN_MSIX_VEC 1
+#define ENA_MAX_MSIX_VEC(io_queues) (ENA_ADMIN_MSIX_VEC + (io_queues))
#define ENA_REG_BAR 0
#define ENA_MEM_BAR 2