Module Name: src Committed By: jdolecek Date: Sun Nov 5 18:17:41 UTC 2023
Modified Files: src/sys/dev/pci: if_ena.c if_enavar.h Log Message: ena(4): support RSS and delete FreeBSD-specified code Code contributed by KUSABA Takeshi <t-kus...@iij.ad.jp> To generate a diff of this commit: cvs rdiff -u -r1.35 -r1.36 src/sys/dev/pci/if_ena.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/pci/if_enavar.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.35 src/sys/dev/pci/if_ena.c:1.36 --- src/sys/dev/pci/if_ena.c:1.35 Sun Nov 5 18:15:02 2023 +++ src/sys/dev/pci/if_ena.c Sun Nov 5 18:17:41 2023 @@ -36,7 +36,7 @@ #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.35 2023/11/05 18:15:02 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.36 2023/11/05 18:17:41 jdolecek Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -106,6 +106,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 +218,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,9 +692,6 @@ 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 = kmem_zalloc(size, KM_SLEEP); @@ -739,20 +735,6 @@ ena_setup_tx_resources(struct ena_adapte 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: @@ -886,9 +868,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; @@ -951,19 +930,6 @@ ena_setup_rx_resources(struct ena_adapte 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: @@ -3071,24 +3037,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 */ @@ -3151,9 +3101,6 @@ ena_calc_io_queue_num(struct pci_attach_ /* 1 IRQ 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); } @@ -3197,10 +3144,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; @@ -3208,16 +3155,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))) { @@ -3239,44 +3181,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) @@ -3924,6 +3836,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); 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.9 --- 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 5 18:17:41 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.9 2023/11/05 18:17:41 jdolecek 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*/