Module Name: src
Committed By: bouyer
Date: Sun Nov 26 11:37:03 UTC 2023
Modified Files:
src/sys/dev/pci [netbsd-10]: if_ena.c if_enavar.h
src/sys/external/bsd/ena-com [netbsd-10]: ena_com.c ena_com.h
ena_plat.h
Log Message:
Pull up following revision(s) (requested by jdolecek in ticket #460):
sys/dev/pci/if_ena.c: revision 1.35
sys/dev/pci/if_ena.c: revision 1.36
sys/dev/pci/if_ena.c: revision 1.37
sys/dev/pci/if_ena.c: revision 1.38
sys/dev/pci/if_ena.c: revision 1.39
sys/external/bsd/ena-com/ena_plat.h: revision 1.10
sys/dev/pci/if_enavar.h: revision 1.9
sys/external/bsd/ena-com/ena_com.c: revision 1.2
sys/external/bsd/ena-com/ena_com.c: revision 1.3
sys/external/bsd/ena-com/ena_com.c: revision 1.4
sys/dev/pci/if_ena.c: revision 1.40
sys/external/bsd/ena-com/ena_com.h: revision 1.2
ena(4): replace malloc(9) to kmem(9)
Code contributed by KUSABA Takeshi <[email protected]>
ena(4): prevent AENQ handler from use-after-free
Code contributed by KUSABA Takeshi <[email protected]>
ena(4): destroy all wait_event
Code contributed by KUSABA Takeshi <[email protected]>
ena(4): support RSS and delete FreeBSD-specified code
Code contributed by KUSABA Takeshi <[email protected]>
ena(4) is MP-ready, always use MPSAFE
Code contributed by KUSABA Takeshi <[email protected]>
ena(4): establish interrupt after setting up resources
Code contributed by KUSABA Takeshi <[email protected]>
ena(4): stop management first when detaching
Code contributed by KUSABA Takeshi <[email protected]>
To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.33.4.1 src/sys/dev/pci/if_ena.c
cvs rdiff -u -r1.8 -r1.8.10.1 src/sys/dev/pci/if_enavar.h
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.34.1 src/sys/external/bsd/ena-com/ena_com.c \
src/sys/external/bsd/ena-com/ena_com.h
cvs rdiff -u -r1.9 -r1.9.4.1 src/sys/external/bsd/ena-com/ena_plat.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_ena.c
diff -u src/sys/dev/pci/if_ena.c:1.33 src/sys/dev/pci/if_ena.c:1.33.4.1
--- src/sys/dev/pci/if_ena.c:1.33 Mon May 23 13:53:37 2022
+++ src/sys/dev/pci/if_ena.c Sun Nov 26 11:37:02 2023
@@ -36,15 +36,15 @@
#if 0
__FBSDID("$FreeBSD: head/sys/dev/ena/ena.c 333456 2018-05-10 09:37:54Z mw $");
#endif
-__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.33 2022/05/23 13:53:37 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.33.4.1 2023/11/26 11:37:02 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/endian.h>
#include <sys/kernel.h>
+#include <sys/kmem.h>
#include <sys/kthread.h>
-#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/module.h>
#include <sys/socket.h>
@@ -61,14 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1
#include <dev/pci/if_enavar.h>
-#ifdef NET_MPSAFE
-#define WQ_FLAGS WQ_MPSAFE
-#define CALLOUT_FLAGS CALLOUT_MPSAFE
-#else
-#define WQ_FLAGS 0
-#define CALLOUT_FLAGS 0
-#endif
-
/*********************************************************
* Function prototypes
*********************************************************/
@@ -106,6 +98,7 @@ static void ena_free_all_io_rings_resour
static int ena_get_dev_offloads(struct ena_com_dev_get_features_ctx *);
static int ena_setup_ifnet(device_t, struct ena_adapter *,
struct ena_com_dev_get_features_ctx *);
+static void ena_rss_init_default(device_t);
static inline void ena_alloc_counters_rx(struct ena_adapter *,
struct ena_stats_rx *, int);
@@ -217,8 +210,6 @@ static void ena_rx_hash_mbuf(struct ena_
struct mbuf *);
static uint64_t ena_get_counter(struct ifnet *, ift_counter);
static void ena_qflush(struct ifnet *);
-static int ena_rss_init_default(struct ena_adapter *);
-static void ena_rss_init_default_deferred(void *);
#endif
static const char ena_version[] =
@@ -693,15 +684,12 @@ ena_setup_tx_resources(struct ena_adapte
struct ena_que *que = &adapter->que[qid];
struct ena_ring *tx_ring = que->tx_ring;
int size, i, err;
-#ifdef RSS
- cpuset_t cpu_mask;
-#endif
size = sizeof(struct ena_tx_buffer) * tx_ring->ring_size;
- tx_ring->tx_buffer_info = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
+ tx_ring->tx_buffer_info = kmem_zalloc(size, KM_SLEEP);
size = sizeof(uint16_t) * tx_ring->ring_size;
- tx_ring->free_tx_ids = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
+ tx_ring->free_tx_ids = kmem_zalloc(size, KM_SLEEP);
/* Req id stack for TX OOO completions */
for (i = 0; i < tx_ring->ring_size; i++)
@@ -732,27 +720,13 @@ ena_setup_tx_resources(struct ena_adapte
/* Allocate workqueues */
int rc = workqueue_create(&tx_ring->enqueue_tq, "ena_tx_enq",
- ena_deferred_mq_start, tx_ring, 0, IPL_NET, WQ_PERCPU | WQ_FLAGS);
+ ena_deferred_mq_start, tx_ring, 0, IPL_NET, WQ_PERCPU | WQ_MPSAFE);
if (unlikely(rc != 0)) {
ena_trace(ENA_ALERT,
"Unable to create workqueue for enqueue task\n");
i = tx_ring->ring_size;
goto err_buf_info_unmap;
}
-
-#if 0
- /* RSS set cpu for thread */
-#ifdef RSS
- CPU_SETOF(que->cpu, &cpu_mask);
- taskqueue_start_threads_cpuset(&tx_ring->enqueue_tq, 1, IPL_NET,
- &cpu_mask, "%s tx_ring enq (bucket %d)",
- device_xname(adapter->pdev), que->cpu);
-#else /* RSS */
- taskqueue_start_threads(&tx_ring->enqueue_tq, 1, IPL_NET,
- "%s txeq %d", device_xname(adapter->pdev), que->cpu);
-#endif /* RSS */
-#endif
-
return (0);
err_buf_info_unmap:
@@ -760,9 +734,11 @@ err_buf_info_unmap:
bus_dmamap_destroy(adapter->sc_dmat,
tx_ring->tx_buffer_info[i].map);
}
- free(tx_ring->free_tx_ids, M_DEVBUF);
+ size = sizeof(uint16_t) * tx_ring->ring_size;
+ kmem_free(tx_ring->free_tx_ids, size);
tx_ring->free_tx_ids = NULL;
- free(tx_ring->tx_buffer_info, M_DEVBUF);
+ size = sizeof(struct ena_tx_buffer) * tx_ring->ring_size;
+ kmem_free(tx_ring->tx_buffer_info, size);
tx_ring->tx_buffer_info = NULL;
return (ENOMEM);
@@ -802,10 +778,11 @@ ena_free_tx_resources(struct ena_adapter
}
/* And free allocated memory. */
- free(tx_ring->tx_buffer_info, M_DEVBUF);
+ kmem_free(tx_ring->tx_buffer_info,
+ sizeof(struct ena_tx_buffer) * tx_ring->ring_size);
tx_ring->tx_buffer_info = NULL;
- free(tx_ring->free_tx_ids, M_DEVBUF);
+ kmem_free(tx_ring->free_tx_ids, sizeof(uint16_t) * tx_ring->ring_size);
tx_ring->free_tx_ids = NULL;
}
@@ -883,9 +860,6 @@ ena_setup_rx_resources(struct ena_adapte
struct ena_que *que = &adapter->que[qid];
struct ena_ring *rx_ring = que->rx_ring;
int size, err, i;
-#ifdef RSS
- cpuset_t cpu_mask;
-#endif
size = sizeof(struct ena_rx_buffer) * rx_ring->ring_size;
@@ -895,10 +869,10 @@ ena_setup_rx_resources(struct ena_adapte
*/
size += sizeof(struct ena_rx_buffer);
- rx_ring->rx_buffer_info = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
+ rx_ring->rx_buffer_info = kmem_zalloc(size, KM_SLEEP);
size = sizeof(uint16_t) * rx_ring->ring_size;
- rx_ring->free_rx_ids = malloc(size, M_DEVBUF, M_WAITOK);
+ rx_ring->free_rx_ids = kmem_zalloc(size, KM_SLEEP);
for (i = 0; i < rx_ring->ring_size; i++)
rx_ring->free_rx_ids[i] = i;
@@ -941,26 +915,13 @@ ena_setup_rx_resources(struct ena_adapte
/* Allocate workqueues */
int rc = workqueue_create(&rx_ring->cleanup_tq, "ena_rx_comp",
- ena_cleanup, que, 0, IPL_NET, WQ_PERCPU | WQ_FLAGS);
+ ena_cleanup, que, 0, IPL_NET, WQ_PERCPU | WQ_MPSAFE);
if (unlikely(rc != 0)) {
ena_trace(ENA_ALERT,
"Unable to create workqueue for RX completion task\n");
goto err_buf_info_unmap;
}
-#if 0
- /* RSS set cpu for thread */
-#ifdef RSS
- CPU_SETOF(que->cpu, &cpu_mask);
- taskqueue_start_threads_cpuset(&rx_ring->cmpl_tq, 1, IPL_NET, &cpu_mask,
- "%s rx_ring cmpl (bucket %d)",
- device_xname(adapter->pdev), que->cpu);
-#else
- taskqueue_start_threads(&rx_ring->cmpl_tq, 1, IPL_NET,
- "%s rx_ring cmpl %d", device_xname(adapter->pdev), que->cpu);
-#endif
-#endif
-
return (0);
err_buf_info_unmap:
@@ -969,9 +930,11 @@ err_buf_info_unmap:
rx_ring->rx_buffer_info[i].map);
}
- free(rx_ring->free_rx_ids, M_DEVBUF);
+ size = sizeof(uint16_t) * rx_ring->ring_size;
+ kmem_free(rx_ring->free_rx_ids, size);
rx_ring->free_rx_ids = NULL;
- free(rx_ring->rx_buffer_info, M_DEVBUF);
+ size = sizeof(struct ena_rx_buffer) * (rx_ring->ring_size + 1);
+ kmem_free(rx_ring->rx_buffer_info, size);
rx_ring->rx_buffer_info = NULL;
return (ENOMEM);
}
@@ -1008,10 +971,11 @@ ena_free_rx_resources(struct ena_adapter
#endif
/* free allocated memory */
- free(rx_ring->rx_buffer_info, M_DEVBUF);
+ kmem_free(rx_ring->rx_buffer_info,
+ sizeof(struct ena_rx_buffer) * (rx_ring->ring_size + 1));
rx_ring->rx_buffer_info = NULL;
- free(rx_ring->free_rx_ids, M_DEVBUF);
+ kmem_free(rx_ring->free_rx_ids, sizeof(uint16_t) * rx_ring->ring_size);
rx_ring->free_rx_ids = NULL;
}
@@ -2041,6 +2005,9 @@ ena_request_mgmnt_irq(struct ena_adapter
KASSERT(adapter->sc_intrs != NULL);
KASSERT(adapter->sc_ihs[irq_slot] == NULL);
+ pci_intr_setattr(pc, &adapter->sc_intrs[irq_slot],
+ PCI_INTR_MPSAFE, true);
+
snprintf(intr_xname, sizeof(intr_xname), "%s mgmnt",
device_xname(adapter->pdev));
intrstr = pci_intr_string(pc, adapter->sc_intrs[irq_slot],
@@ -2086,6 +2053,9 @@ ena_request_io_irq(struct ena_adapter *a
KASSERT((void *)adapter->sc_intrs[irq_slot] != NULL);
KASSERT(adapter->sc_ihs[irq_slot] == NULL);
+ pci_intr_setattr(pc, &adapter->sc_intrs[irq_slot],
+ PCI_INTR_MPSAFE, true);
+
snprintf(intr_xname, sizeof(intr_xname), "%s ioq%d",
device_xname(adapter->pdev), i);
intrstr = pci_intr_string(pc, adapter->sc_intrs[irq_slot],
@@ -2273,13 +2243,6 @@ ena_up(struct ena_adapter *adapter)
if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) {
device_printf(adapter->pdev, "device is going UP\n");
- /* setup interrupts for IO queues */
- rc = ena_request_io_irq(adapter);
- if (unlikely(rc != 0)) {
- ena_trace(ENA_ALERT, "err_req_irq");
- goto err_req_irq;
- }
-
/* allocate transmit descriptors */
rc = ena_setup_all_tx_resources(adapter);
if (unlikely(rc != 0)) {
@@ -2302,6 +2265,13 @@ ena_up(struct ena_adapter *adapter)
goto err_io_que;
}
+ /* setup interrupts for IO queues */
+ rc = ena_request_io_irq(adapter);
+ if (unlikely(rc != 0)) {
+ ena_trace(ENA_ALERT, "err_req_irq");
+ goto err_req_irq;
+ }
+
if (unlikely(ENA_FLAG_ISSET(ENA_FLAG_LINK_UP, adapter)))
if_link_state_change(adapter->ifp, LINK_STATE_UP);
@@ -2580,6 +2550,7 @@ ena_setup_ifnet(device_t pdev, struct en
if_setsoftc(ifp, adapter);
if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
+ ifp->if_extflags = IFEF_MPSAFE;
if_setinitfn(ifp, ena_init);
ifp->if_stop = ena_stop;
if_settransmitfn(ifp, ena_mq_start);
@@ -3065,24 +3036,8 @@ ena_mq_start(struct ifnet *ifp, struct m
* same bucket that the current CPU we're on is.
* It should improve performance.
*/
-#if 0
- if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
-#ifdef RSS
- if (rss_hash2bucket(m->m_pkthdr.flowid,
- M_HASHTYPE_GET(m), &i) == 0) {
- i = i % adapter->num_queues;
+ i = cpu_index(curcpu()) % adapter->num_queues;
- } else
-#endif
- {
- i = m->m_pkthdr.flowid % adapter->num_queues;
- }
- } else {
-#endif
- i = cpu_index(curcpu()) % adapter->num_queues;
-#if 0
- }
-#endif
tx_ring = &adapter->tx_ring[i];
/* Check if drbr is empty before putting packet */
@@ -3145,9 +3100,6 @@ ena_calc_io_queue_num(struct pci_attach_
/* 1 IRQ for for mgmnt and 1 IRQ for each TX/RX pair */
io_queue_num = min_t(int, io_queue_num,
pci_msix_count(pa->pa_pc, pa->pa_tag) - 1);
-#ifdef RSS
- io_queue_num = min_t(int, io_queue_num, rss_getnumbuckets());
-#endif
return (io_queue_num);
}
@@ -3191,10 +3143,10 @@ ena_calc_queue_size(struct ena_adapter *
return (queue_size);
}
-#if 0
-static int
-ena_rss_init_default(struct ena_adapter *adapter)
+static void
+ena_rss_init_default(device_t self)
{
+ struct ena_adapter *adapter = device_private(self);
struct ena_com_dev *ena_dev = adapter->ena_dev;
device_t dev = adapter->pdev;
int qid, rc, i;
@@ -3202,16 +3154,11 @@ ena_rss_init_default(struct ena_adapter
rc = ena_com_rss_init(ena_dev, ENA_RX_RSS_TABLE_LOG_SIZE);
if (unlikely(rc != 0)) {
device_printf(dev, "Cannot init indirect table\n");
- return (rc);
+ return;
}
for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) {
-#ifdef RSS
- qid = rss_get_indirection_to_bucket(i);
- qid = qid % adapter->num_queues;
-#else
qid = i % adapter->num_queues;
-#endif
rc = ena_com_indirect_table_fill_entry(ena_dev, i,
ENA_IO_RXQ_IDX(qid));
if (unlikely((rc != 0) && (rc != EOPNOTSUPP))) {
@@ -3233,44 +3180,14 @@ ena_rss_init_default(struct ena_adapter
goto err_rss_destroy;
}
- return (0);
+ adapter->rss_support = true;
+ return;
err_rss_destroy:
ena_com_rss_destroy(ena_dev);
- return (rc);
-}
-
-static void
-ena_rss_init_default_deferred(void *arg)
-{
- struct ena_adapter *adapter;
- devclass_t dc;
- int max;
- int rc;
-
- dc = devclass_find("ena");
- if (unlikely(dc == NULL)) {
- ena_trace(ENA_ALERT, "No devclass ena\n");
- return;
- }
-
- max = devclass_get_maxunit(dc);
- while (max-- >= 0) {
- adapter = devclass_get_softc(dc, max);
- if (adapter != NULL) {
- rc = ena_rss_init_default(adapter);
- adapter->rss_support = true;
- if (unlikely(rc != 0)) {
- device_printf(adapter->pdev,
- "WARNING: RSS was not properly initialized,"
- " it will affect bandwidth\n");
- adapter->rss_support = false;
- }
- }
- }
+ adapter->rss_support = false;
+ return;
}
-SYSINIT(ena_rss_init, SI_SUB_KICK_SCHEDULER, SI_ORDER_SECOND, ena_rss_init_default_deferred, NULL);
-#endif
static void
ena_config_host_info(struct ena_com_dev *ena_dev)
@@ -3811,13 +3728,11 @@ ena_attach(device_t parent, device_t sel
}
/* Allocate memory for ena_dev structure */
- ena_dev = malloc(sizeof(struct ena_com_dev), M_DEVBUF,
- M_WAITOK | M_ZERO);
+ ena_dev = kmem_zalloc(sizeof(struct ena_com_dev), KM_SLEEP);
adapter->ena_dev = ena_dev;
ena_dev->dmadev = self;
- ena_dev->bus = malloc(sizeof(struct ena_bus), M_DEVBUF,
- M_WAITOK | M_ZERO);
+ ena_dev->bus = kmem_zalloc(sizeof(struct ena_bus), KM_SLEEP);
/* Store register resources */
((struct ena_bus*)(ena_dev->bus))->reg_bar_t = adapter->sc_btag;
@@ -3901,12 +3816,12 @@ ena_attach(device_t parent, device_t sel
goto err_ifp_free;
}
- callout_init(&adapter->timer_service, CALLOUT_FLAGS);
+ callout_init(&adapter->timer_service, CALLOUT_MPSAFE);
callout_setfunc(&adapter->timer_service, ena_timer_service, adapter);
/* Initialize reset task queue */
rc = workqueue_create(&adapter->reset_tq, "ena_reset_enq",
- ena_reset_task, adapter, 0, IPL_NET, WQ_PERCPU | WQ_FLAGS);
+ ena_reset_task, adapter, 0, IPL_NET, WQ_PERCPU | WQ_MPSAFE);
if (unlikely(rc != 0)) {
ena_trace(ENA_ALERT,
"Unable to create workqueue for reset task\n");
@@ -3920,6 +3835,8 @@ ena_attach(device_t parent, device_t sel
ena_sysctl_add_nodes(adapter);
#endif
+ config_interrupts(self, ena_rss_init_default);
+
/* Tell the stack that the interface is not active */
if_setdrvflagbits(adapter->ifp, IFF_OACTIVE, IFF_RUNNING);
ena_set_stopping_flag(adapter, false);
@@ -3941,8 +3858,8 @@ err_com_free:
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);
- free(ena_dev, M_DEVBUF);
+ kmem_free(ena_dev->bus, sizeof(struct ena_bus));
+ kmem_free(ena_dev, sizeof(struct ena_com_dev));
ena_free_pci_resources(adapter);
}
@@ -3968,6 +3885,7 @@ ena_detach(device_t pdev, int flags)
return (EBUSY);
}
+ ena_com_set_admin_running_state(ena_dev, false);
ENA_CORE_MTX_LOCK(adapter);
ena_down(adapter);
ENA_CORE_MTX_UNLOCK(adapter);
@@ -3979,21 +3897,8 @@ ena_detach(device_t pdev, int flags)
workqueue_destroy(adapter->reset_tq);
adapter->reset_tq = NULL;
- if (adapter->ifp != NULL) {
- ether_ifdetach(adapter->ifp);
- if_detach(adapter->ifp);
- }
- ifmedia_fini(&adapter->media);
-
ena_free_all_io_rings_resources(adapter);
- ena_free_counters((struct evcnt *)&adapter->hw_stats,
- sizeof(struct ena_hw_stats),
- offsetof(struct ena_hw_stats, rx_packets));
- ena_free_counters((struct evcnt *)&adapter->dev_stats,
- sizeof(struct ena_stats_dev),
- offsetof(struct ena_stats_dev, wd_expired));
-
if (likely(adapter->rss_support))
ena_com_rss_destroy(ena_dev);
@@ -4027,13 +3932,26 @@ ena_detach(device_t pdev, int flags)
ena_free_pci_resources(adapter);
+ ena_free_counters((struct evcnt *)&adapter->hw_stats,
+ sizeof(struct ena_hw_stats),
+ offsetof(struct ena_hw_stats, rx_packets));
+ ena_free_counters((struct evcnt *)&adapter->dev_stats,
+ sizeof(struct ena_stats_dev),
+ offsetof(struct ena_stats_dev, wd_expired));
+
+ if (adapter->ifp != NULL) {
+ ether_ifdetach(adapter->ifp);
+ if_detach(adapter->ifp);
+ }
+ ifmedia_fini(&adapter->media);
+
mutex_destroy(&adapter->global_mtx);
if (ena_dev->bus != NULL)
- free(ena_dev->bus, M_DEVBUF);
+ kmem_free(ena_dev->bus, sizeof(struct ena_bus));
if (ena_dev != NULL)
- free(ena_dev, M_DEVBUF);
+ kmem_free(ena_dev, sizeof(struct ena_com_dev));
return 0;
}
Index: src/sys/dev/pci/if_enavar.h
diff -u src/sys/dev/pci/if_enavar.h:1.8 src/sys/dev/pci/if_enavar.h:1.8.10.1
--- src/sys/dev/pci/if_enavar.h:1.8 Mon Jul 19 21:16:33 2021
+++ src/sys/dev/pci/if_enavar.h Sun Nov 26 11:37:02 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: if_enavar.h,v 1.8 2021/07/19 21:16:33 jmcneill Exp $ */
+/* $NetBSD: if_enavar.h,v 1.8.10.1 2023/11/26 11:37:02 bouyer Exp $ */
/*-
* BSD LICENSE
@@ -388,6 +388,7 @@ struct ena_adapter {
/* RSS*/
uint8_t rss_ind_tbl[ENA_RX_RSS_TABLE_SIZE];
bool rss_support;
+ int initialized;
uint8_t mac_addr[ETHER_ADDR_LEN];
/* mdio and phy*/
Index: src/sys/external/bsd/ena-com/ena_com.c
diff -u src/sys/external/bsd/ena-com/ena_com.c:1.1.1.1 src/sys/external/bsd/ena-com/ena_com.c:1.1.1.1.34.1
--- src/sys/external/bsd/ena-com/ena_com.c:1.1.1.1 Sat May 19 08:56:06 2018
+++ src/sys/external/bsd/ena-com/ena_com.c Sun Nov 26 11:37:03 2023
@@ -857,7 +857,7 @@ static void ena_com_io_queue_free(struct
if (io_sq->bounce_buf_ctrl.base_buffer) {
size = io_sq->llq_info.desc_list_entry_size * ENA_COM_BOUNCE_BUFFER_CNTRL_CNT;
- ENA_MEM_FREE(ena_dev->dmadev, io_sq->bounce_buf_ctrl.base_buffer);
+ ENA_MEM_FREE(ena_dev->dmadev, io_sq->bounce_buf_ctrl.base_buffer, size);
io_sq->bounce_buf_ctrl.base_buffer = NULL;
}
}
@@ -1054,9 +1054,9 @@ static int ena_com_indirect_table_alloca
if (unlikely(!rss->rss_ind_tbl))
goto mem_err1;
- tbl_size = (1ULL << log_size) * sizeof(u16);
+ rss->host_rss_ind_tbl_size = (1ULL << log_size) * sizeof(u16);
rss->host_rss_ind_tbl =
- ENA_MEM_ALLOC(ena_dev->dmadev, tbl_size);
+ ENA_MEM_ALLOC(ena_dev->dmadev, rss->host_rss_ind_tbl_size);
if (unlikely(!rss->host_rss_ind_tbl))
goto mem_err2;
@@ -1094,7 +1094,8 @@ static void ena_com_indirect_table_destr
rss->rss_ind_tbl = NULL;
if (rss->host_rss_ind_tbl)
- ENA_MEM_FREE(ena_dev->dmadev, rss->host_rss_ind_tbl);
+ ENA_MEM_FREE(ena_dev->dmadev, rss->host_rss_ind_tbl,
+ rss->host_rss_ind_tbl_size);
rss->host_rss_ind_tbl = NULL;
}
@@ -1391,6 +1392,12 @@ void ena_com_wait_for_abort_completion(s
struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
unsigned long flags;
+ /*
+ * XXX: workaround for missing synchronization mechanism of AENQ handler
+ * Wait 20ms for safety though it have not panicked actually.
+ */
+ ENA_MSLEEP(20);
+
ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
while (ATOMIC32_READ(&admin_queue->outstanding_cmds) != 0) {
ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
@@ -1577,13 +1584,22 @@ void ena_com_admin_destroy(struct ena_co
struct ena_com_admin_sq *sq = &admin_queue->sq;
struct ena_com_aenq *aenq = &ena_dev->aenq;
u16 size;
-
- ENA_WAIT_EVENT_DESTROY(admin_queue->comp_ctx->wait_event);
+ int i;
ENA_SPINLOCK_DESTROY(admin_queue->q_lock);
- if (admin_queue->comp_ctx)
- ENA_MEM_FREE(ena_dev->dmadev, admin_queue->comp_ctx);
+ if (admin_queue->comp_ctx) {
+ size_t s;
+
+ for (i = 0; i < admin_queue->q_depth; i++) {
+ struct ena_comp_ctx *comp_ctx = get_comp_ctxt(admin_queue, i, false);
+ if (comp_ctx != NULL)
+ ENA_WAIT_EVENT_DESTROY(comp_ctx->wait_event);
+ }
+
+ s = admin_queue->q_depth * sizeof(struct ena_comp_ctx);
+ ENA_MEM_FREE(ena_dev->dmadev, admin_queue->comp_ctx, s);
+ }
admin_queue->comp_ctx = NULL;
size = ADMIN_SQ_SIZE(admin_queue->q_depth);
if (sq->entries)
@@ -2810,8 +2826,11 @@ int ena_com_update_nonadaptive_moderatio
void ena_com_destroy_interrupt_moderation(struct ena_com_dev *ena_dev)
{
+ size_t size;
+
+ size = sizeof(struct ena_intr_moder_entry) * ENA_INTR_MAX_NUM_OF_LEVELS;
if (ena_dev->intr_moder_tbl)
- ENA_MEM_FREE(ena_dev->dmadev, ena_dev->intr_moder_tbl);
+ ENA_MEM_FREE(ena_dev->dmadev, ena_dev->intr_moder_tbl, size);
ena_dev->intr_moder_tbl = NULL;
}
Index: src/sys/external/bsd/ena-com/ena_com.h
diff -u src/sys/external/bsd/ena-com/ena_com.h:1.1.1.1 src/sys/external/bsd/ena-com/ena_com.h:1.1.1.1.34.1
--- src/sys/external/bsd/ena-com/ena_com.h:1.1.1.1 Sat May 19 08:56:06 2018
+++ src/sys/external/bsd/ena-com/ena_com.h Sun Nov 26 11:37:03 2023
@@ -306,6 +306,7 @@ struct ena_com_mmio_read {
struct ena_rss {
/* Indirect table */
u16 *host_rss_ind_tbl;
+ size_t host_rss_ind_tbl_size;
struct ena_admin_rss_ind_table_entry *rss_ind_tbl;
dma_addr_t rss_ind_tbl_dma_addr;
ena_mem_handle_t rss_ind_tbl_mem_handle;
Index: src/sys/external/bsd/ena-com/ena_plat.h
diff -u src/sys/external/bsd/ena-com/ena_plat.h:1.9 src/sys/external/bsd/ena-com/ena_plat.h:1.9.4.1
--- src/sys/external/bsd/ena-com/ena_plat.h:1.9 Sat Apr 9 23:44:54 2022
+++ src/sys/external/bsd/ena-com/ena_plat.h Sun Nov 26 11:37:03 2023
@@ -38,7 +38,7 @@
#if 0
__FBSDID("$FreeBSD: head/sys/contrib/ena-com/ena_plat.h 333453 2018-05-10 09:25:51Z mw $");
#endif
-__KERNEL_RCSID(0, "$NetBSD: ena_plat.h,v 1.9 2022/04/09 23:44:54 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ena_plat.h,v 1.9.4.1 2023/11/26 11:37:03 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -47,8 +47,8 @@ __KERNEL_RCSID(0, "$NetBSD: ena_plat.h,v
#include <sys/condvar.h>
#include <sys/endian.h>
#include <sys/kernel.h>
+#include <sys/kmem.h>
#include <sys/kthread.h>
-#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/module.h>
#include <sys/proc.h>
@@ -292,9 +292,9 @@ int ena_dma_alloc(device_t dmadev, bus_s
*to = *from; \
} while (0)
-#define ENA_MEM_ALLOC(dmadev, size) malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO)
+#define ENA_MEM_ALLOC(dmadev, size) kmem_zalloc(size, KM_NOSLEEP)
#define ENA_MEM_ALLOC_NODE(dmadev, size, virt, node, dev_node) (virt = NULL)
-#define ENA_MEM_FREE(dmadev, ptr) free(ptr, M_DEVBUF)
+#define ENA_MEM_FREE(dmadev, ptr, size) kmem_free(ptr, size)
#define ENA_MEM_ALLOC_COHERENT_NODE(dmadev, size, virt, phys, handle, node, \
dev_node) \
do { \