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 {								\

Reply via email to