diff options
author | Marcin Wojtas <mw@FreeBSD.org> | 2017-11-09 12:03:06 +0000 |
---|---|---|
committer | Marcin Wojtas <mw@FreeBSD.org> | 2017-11-09 12:03:06 +0000 |
commit | 8805021a2a73619a3190654edbd94a6d17606707 (patch) | |
tree | 06ddfa9f0c7393f74784e5ccf43453a7067026ce /sys/dev/ena | |
parent | 0052f3b5802d45950453a19d7a38df3be1f95fa8 (diff) | |
download | src-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.c | 10 | ||||
-rw-r--r-- | sys/dev/ena/ena.h | 3 |
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 |