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 <t-kus...@iij.ad.jp> ena(4): prevent AENQ handler from use-after-free Code contributed by KUSABA Takeshi <t-kus...@iij.ad.jp> ena(4): destroy all wait_event Code contributed by KUSABA Takeshi <t-kus...@iij.ad.jp> ena(4): support RSS and delete FreeBSD-specified code Code contributed by KUSABA Takeshi <t-kus...@iij.ad.jp> ena(4) is MP-ready, always use MPSAFE Code contributed by KUSABA Takeshi <t-kus...@iij.ad.jp> ena(4): establish interrupt after setting up resources Code contributed by KUSABA Takeshi <t-kus...@iij.ad.jp> ena(4): stop management first when detaching Code contributed by KUSABA Takeshi <t-kus...@iij.ad.jp> 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 { \