svn commit: r325511 - head/sys/dev/ena
Marcin Wojtas
mw at FreeBSD.org
Tue Nov 7 13:20:42 UTC 2017
Author: mw
Date: Tue Nov 7 13:20:41 2017
New Revision: 325511
URL: https://svnweb.freebsd.org/changeset/base/325511
Log:
Fix ENA driver error handling in attach and basic style fixes
The patch contains following changes:
* In conditional checks, always check for NULL or 0 instead of negating values
* Use malloc and free explicitely, instead of ENA_MEM_FREE and ENA_MEM_FREE (the
dmadev passed to macro is never used, and could be a little misleading)
* Always check for NULL after calling malloc (few checks were missing)
* Rework naming of the goto tags in ena_attach() for consistency
* Fix error handling in ena_attach() - few goto instructions were leading to the
wrong tag
* Destroy MMIO req read request if attach failed
* Remove checking for NULL after calling malloc with M_WAITOK flag
Submitted by: Michal Krawczyk <mk at semihalf.com>
Reviewed by: byenduri_gmail.com
Obtained from: Semihalf
Sponsored by: Amazon.com, Inc.
Differential Revision: https://reviews.freebsd.org/D12853
Modified:
head/sys/dev/ena/ena.c
Modified: head/sys/dev/ena/ena.c
==============================================================================
--- head/sys/dev/ena/ena.c Tue Nov 7 09:57:26 2017 (r325510)
+++ head/sys/dev/ena/ena.c Tue Nov 7 13:20:41 2017 (r325511)
@@ -91,7 +91,7 @@ static inline void ena_free_counters(counter_u64_t *,
static inline void ena_reset_counters(counter_u64_t *, int);
static void ena_init_io_rings_common(struct ena_adapter *,
struct ena_ring *, uint16_t);
-static int ena_init_io_rings(struct ena_adapter *);
+static void ena_init_io_rings(struct ena_adapter *);
static void ena_free_io_ring_resources(struct ena_adapter *, unsigned int);
static void ena_free_all_io_rings_resources(struct ena_adapter *);
static int ena_setup_tx_dma_tag(struct ena_adapter *);
@@ -420,14 +420,13 @@ ena_init_io_rings_common(struct ena_adapter *adapter,
ring->ena_dev = adapter->ena_dev;
}
-static int
+static void
ena_init_io_rings(struct ena_adapter *adapter)
{
struct ena_com_dev *ena_dev;
struct ena_ring *txr, *rxr;
struct ena_que *que;
int i;
- int rc;
ena_dev = adapter->ena_dev;
@@ -449,12 +448,6 @@ ena_init_io_rings(struct ena_adapter *adapter)
/* Allocate a buf ring */
txr->br = buf_ring_alloc(ena_buf_ring_size, M_DEVBUF,
M_WAITOK, &txr->ring_mtx);
- if (txr->br == NULL) {
- device_printf(adapter->pdev,
- "Error while setting up bufring\n");
- rc = ENOMEM;
- goto err_bufr_free;
- }
/* Alloc TX statistics. */
ena_alloc_counters((counter_u64_t *)&txr->tx_stats,
@@ -487,14 +480,6 @@ ena_init_io_rings(struct ena_adapter *adapter)
txr->que = que;
rxr->que = que;
}
-
- return 0;
-
-err_bufr_free:
- while (i--)
- ena_free_io_ring_resources(adapter, i);
-
- return (rc);
}
static void
@@ -621,12 +606,12 @@ ena_setup_tx_resources(struct ena_adapter *adapter, in
size = sizeof(struct ena_tx_buffer) * tx_ring->ring_size;
tx_ring->tx_buffer_info = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO);
- if (!tx_ring->tx_buffer_info)
+ if (tx_ring->tx_buffer_info == NULL)
goto err_tx_buffer_info;
size = sizeof(uint16_t) * tx_ring->ring_size;
tx_ring->free_tx_ids = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO);
- if (!tx_ring->free_tx_ids)
+ if (tx_ring->free_tx_ids == NULL)
goto err_tx_reqs;
/* Req id stack for TX OOO completions */
@@ -685,9 +670,9 @@ err_tx_map:
bus_dmamap_destroy(adapter->tx_buf_tag,
tx_ring->tx_buffer_info[i].map);
}
- ENA_MEM_FREE(adapter->ena_dev->dmadev, tx_ring->free_tx_ids);
+ free(tx_ring->free_tx_ids, M_DEVBUF);
err_tx_reqs:
- ENA_MEM_FREE(adapter->ena_dev->dmadev, tx_ring->tx_buffer_info);
+ free(tx_ring->tx_buffer_info, M_DEVBUF);
err_tx_buffer_info:
return (ENOMEM);
}
@@ -726,10 +711,10 @@ ena_free_tx_resources(struct ena_adapter *adapter, int
ENA_RING_MTX_UNLOCK(tx_ring);
/* And free allocated memory. */
- ENA_MEM_FREE(adapter->ena_dev->dmadev, tx_ring->tx_buffer_info);
+ free(tx_ring->tx_buffer_info, M_DEVBUF);
tx_ring->tx_buffer_info = NULL;
- ENA_MEM_FREE(adapter->ena_dev->dmadev, tx_ring->free_tx_ids);
+ free(tx_ring->free_tx_ids, M_DEVBUF);
tx_ring->free_tx_ids = NULL;
}
@@ -746,7 +731,7 @@ ena_setup_all_tx_resources(struct ena_adapter *adapter
for (i = 0; i < adapter->num_queues; i++) {
rc = ena_setup_tx_resources(adapter, i);
- if (!rc)
+ if (rc == 0)
continue;
device_printf(adapter->pdev,
@@ -805,9 +790,7 @@ ena_setup_rx_resources(struct ena_adapter *adapter, un
*/
size += sizeof(struct ena_rx_buffer);
- rx_ring->rx_buffer_info = ENA_MEM_ALLOC(adapter->ena_dev->dmadev, size);
- if (!rx_ring->rx_buffer_info)
- return (ENOMEM);
+ rx_ring->rx_buffer_info = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
/* Reset RX statistics. */
ena_reset_counters((counter_u64_t *)&rx_ring->rx_stats,
@@ -848,7 +831,7 @@ err_rx_dma:
rx_ring->rx_buffer_info[i].map);
}
- ENA_MEM_FREE(adapter->ena_dev->dmadev, rx_ring->rx_buffer_info);
+ free(rx_ring->rx_buffer_info, M_DEVBUF);
rx_ring->rx_buffer_info = NULL;
ena_trace(ENA_ALERT, "RX resource allocation fail");
return (ENOMEM);
@@ -882,7 +865,7 @@ ena_free_rx_resources(struct ena_adapter *adapter, uns
tcp_lro_free(&rx_ring->lro);
/* free allocated memory */
- ENA_MEM_FREE(adapter->ena_dev->dmadev, rx_ring->rx_buffer_info);
+ free(rx_ring->rx_buffer_info, M_DEVBUF);
rx_ring->rx_buffer_info = NULL;
return;
@@ -901,7 +884,7 @@ ena_setup_all_rx_resources(struct ena_adapter *adapter
for (i = 0; i < adapter->num_queues; i++) {
rc = ena_setup_rx_resources(adapter, i);
- if (!rc)
+ if (rc == 0)
continue;
device_printf(adapter->pdev,
@@ -949,7 +932,7 @@ ena_alloc_rx_mbuf(struct ena_adapter *adapter,
/* Get mbuf using UMA allocator */
rx_info->mbuf = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUM16BYTES);
- if (!rx_info->mbuf) {
+ if (rx_info->mbuf == NULL) {
counter_u64_add(rx_ring->rx_stats.mbuf_alloc_fail, 1);
return (ENOMEM);
}
@@ -993,7 +976,7 @@ ena_free_rx_mbuf(struct ena_adapter *adapter, struct e
struct ena_rx_buffer *rx_info)
{
- if (!rx_info->mbuf)
+ if (rx_info->mbuf == NULL)
return;
bus_dmamap_unload(adapter->rx_buf_tag, rx_info->map);
@@ -1716,14 +1699,9 @@ ena_enable_msix(struct ena_adapter *adapter)
/* Reserved the max msix vectors we might need */
msix_vecs = ENA_MAX_MSIX_VEC(adapter->num_queues);
- adapter->msix_entries = ENA_MEM_ALLOC(adapter->ena_dev->dmadev,
- msix_vecs * sizeof(struct msix_entry));
- if (!adapter->msix_entries) {
- device_printf(dev,
- "Failed to allocate msix_entries, vectors %d\n", msix_vecs);
- rc = ENOMEM;
- goto error;
- }
+ adapter->msix_entries = malloc(msix_vecs * sizeof(struct msix_entry),
+ M_DEVBUF, M_WAITOK | M_ZERO);
+
device_printf(dev, "Allocated msix_entries, vectors (cnt: %d)\n",
msix_vecs);
@@ -1737,7 +1715,7 @@ ena_enable_msix(struct ena_adapter *adapter)
if (rc != 0) {
device_printf(dev,
"Failed to enable MSIX, vectors %d rc %d\n", msix_vecs, rc);
- ENA_MEM_FREE(adapter->ena_dev->dmadev, adapter->msix_entries);
+ free(adapter->msix_entries, M_DEVBUF);
adapter->msix_entries = NULL;
rc = ENOSPC;
goto error;
@@ -2025,7 +2003,7 @@ ena_disable_msix(struct ena_adapter *adapter)
pci_release_msi(adapter->pdev);
adapter->msix_vecs = 0;
- ENA_MEM_FREE(adapter->ena_dev->dmadev, adapter->msix_entries);
+ free(adapter->msix_entries, M_DEVBUF);
adapter->msix_entries = NULL;
}
@@ -3319,7 +3297,7 @@ static void check_for_missing_tx_completions(struct en
}
budget--;
- if (!budget) {
+ if (budget == 0) {
i++;
break;
}
@@ -3502,16 +3480,12 @@ ena_attach(device_t pdev)
if (rc) {
device_printf(pdev, "PCI resource allocation failed!\n");
ena_free_pci_resources(adapter);
- goto err_pci_res;
+ return (rc);
}
/* Allocate memory for ena_dev structure */
- ena_dev = ENA_MEM_ALLOC(pdev, sizeof(struct ena_com_dev));
- if (!ena_dev) {
- device_printf(pdev, "allocating ena_dev failed\n");
- rc = ENOMEM;
- goto err_select_region;
- }
+ ena_dev = malloc(sizeof(struct ena_com_dev), M_DEVBUF,
+ M_WAITOK | M_ZERO);
adapter->ena_dev = ena_dev;
ena_dev->dmadev = pdev;
@@ -3527,7 +3501,7 @@ ena_attach(device_t pdev)
if (((struct ena_bus*)(ena_dev->bus))->reg_bar_h == 0) {
device_printf(pdev, "failed to pmap registers bar\n");
rc = ENXIO;
- goto err_dev_free;
+ goto err_bus_free;
}
ena_dev->tx_mem_queue_type = ENA_ADMIN_PLACEMENT_POLICY_HOST;
@@ -3579,25 +3553,21 @@ ena_attach(device_t pdev)
/* set up dma tags for rx and tx buffers */
rc = ena_setup_tx_dma_tag(adapter);
if (rc)
- goto dma_tx_err;
+ goto err_com_free;
rc = ena_setup_rx_dma_tag(adapter);
if (rc)
- goto dma_rx_err;
+ goto err_tx_tag_free;
/* initialize rings basic information */
device_printf(pdev, "initalize %d io queues\n", io_queue_num);
- rc = ena_init_io_rings(adapter);
- if (rc) {
- device_printf(pdev,"Error with initialization of IO rings\n");
- goto err_io_init;
- }
+ ena_init_io_rings(adapter);
/* setup network interface */
rc = ena_setup_ifnet(pdev, adapter, &get_feat_ctx);
if (rc) {
device_printf(pdev,"Error with network interface setup\n");
- goto err_com_free;
+ goto err_io_free;
}
rc = ena_enable_msix_and_set_admin_interrupts(adapter, io_queue_num);
@@ -3611,11 +3581,6 @@ ena_attach(device_t pdev)
TASK_INIT(&adapter->reset_task, 0, ena_reset_task, adapter);
adapter->reset_tq = taskqueue_create("ena_reset_enqueue",
M_WAITOK | M_ZERO, taskqueue_thread_enqueue, &adapter->reset_tq);
- if (adapter->reset_tq == NULL) {
- device_printf(adapter->pdev,
- "Unable to create reset task queue\n");
- goto err_reset_tq;
- }
taskqueue_start_threads(&adapter->reset_tq, 1, PI_NET,
"%s rstq", device_get_nameunit(adapter->pdev));
@@ -3632,29 +3597,23 @@ ena_attach(device_t pdev)
adapter->running = true;
return (0);
-err_reset_tq:
- ena_com_dev_reset(ena_dev, ENA_REGS_RESET_INIT_ERR);
- ena_free_mgmnt_irq(adapter);
- ena_disable_msix(adapter);
err_ifp_free:
if_detach(adapter->ifp);
if_free(adapter->ifp);
-err_com_free:
+err_io_free:
ena_free_all_io_rings_resources(adapter);
-err_io_init:
ena_free_rx_dma_tag(adapter);
-dma_rx_err:
+err_tx_tag_free:
ena_free_tx_dma_tag(adapter);
-dma_tx_err:
+err_com_free:
ena_com_admin_destroy(ena_dev);
ena_com_delete_host_info(ena_dev);
+ ena_com_mmio_reg_read_request_destroy(ena_dev);
err_bus_free:
free(ena_dev->bus, M_DEVBUF);
-err_dev_free:
free(ena_dev, M_DEVBUF);
-err_select_region:
ena_free_pci_resources(adapter);
-err_pci_res:
+
return (rc);
}
More information about the svn-src-all
mailing list