Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Various ena(4) bug fixes, from KUSABA Takeshi <t-kusaba@...



details:   https://anonhg.NetBSD.org/src/rev/d6c61a7ddfce
branches:  trunk
changeset: 1022453:d6c61a7ddfce
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Mon Jul 19 21:16:33 2021 +0000

description:
Various ena(4) bug fixes, from KUSABA Takeshi <t-kusaba%iij.ad.jp@localhost>:

[PATCH 01/32] include device_xname for evcnt group.
[PATCH 02/32] fix improper NULL check.
[PATCH 03/32] add tx drop counter
[PATCH 04/32] remove unimplemented m_getjcl
[PATCH 05/32] make ENA_MEM_{ALLOC,FREE}_COHERENT symmetric.
[PATCH 06/32] disestablish the correct interrupt.
[PATCH 07/32] fix null check target.
[PATCH 08/32] use if_initialize() and if_register() instead of
[PATCH 09/32] free all pci-related resource.
[PATCH 10/32] no need to call if_free(), but to call if_detach
[PATCH 11/32] add some locking assertions.
[PATCH 12/32] use bus_size_t for bus_dma instead of uint32_t.
[PATCH 13/32] no need to pass interlock, ena_timer_service does not
[PATCH 14/32] enable ena(4) to down I/F
[PATCH 15/32] destroy I/O queues before disestablishing msix
[PATCH 16/32] count input/output packet stats.
[PATCH 17/32] fix missing #ifdef LRO, NetBSD does not support LRO
[PATCH 18/32] MP-ify TX, allocate mbuf queue to each TX ring.
[PATCH 19/32] down the interface first when to detach, to prevent
[PATCH 20/32] default link speed should be unknown.
[PATCH 21/32] protect ena_adapter members only by "global_mtx".
[PATCH 22/32] lower global_mtx interrupt level
[PATCH 23/32] reorder function declaration
[PATCH 24/32] add locking notes and some marking.
[PATCH 25/32] process RX in workqueue context, as same as FreeBSD
[PATCH 26/32] count rx_drops correctly.
[PATCH 27/32] no need to lock when attach/detach, down/up
[PATCH 28/32] fix memory leak.
[PATCH 29/32] add "stopping" flag to ena_ring.
[PATCH 30/32] make the flags atomic.
[PATCH 31/32] do not schedule timer when device is down.
[PATCH 32/32] no need to start timer if I/F is down.

diffstat:

 sys/dev/pci/if_ena.c                |  693 ++++++++++++++++++++---------------
 sys/dev/pci/if_enavar.h             |   70 +++-
 sys/external/bsd/ena-com/ena_plat.h |    6 +-
 3 files changed, 465 insertions(+), 304 deletions(-)

diffs (truncated from 1606 to 300 lines):

diff -r 001ddcdc7df8 -r d6c61a7ddfce sys/dev/pci/if_ena.c
--- a/sys/dev/pci/if_ena.c      Mon Jul 19 21:04:39 2021 +0000
+++ b/sys/dev/pci/if_ena.c      Mon Jul 19 21:16:33 2021 +0000
@@ -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.28 2021/07/01 17:22:10 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.29 2021/07/19 21:16:33 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -72,112 +72,154 @@
 /*********************************************************
  *  Function prototypes
  *********************************************************/
+/* cfattach interface functions */
 static int     ena_probe(device_t, cfdata_t, void *);
-static int     ena_intr_msix_mgmnt(void *);
+static void    ena_attach(device_t, device_t, void *);
+static int     ena_detach(device_t, int);
+
+/* ifnet interface functions */
+static int     ena_init(struct ifnet *);
+static void    ena_stop(struct ifnet *, int);
+static int     ena_ioctl(struct ifnet *, u_long, void *);
+static int     ena_media_change(struct ifnet *);
+static void    ena_media_status(struct ifnet *, struct ifmediareq *);
+static int     ena_mq_start(struct ifnet *, struct mbuf *);
+
+/* attach or detach */
+static int     ena_calc_io_queue_num(struct pci_attach_args *,
+                   struct ena_adapter *,
+                   struct ena_com_dev_get_features_ctx *);
+static int     ena_calc_queue_size(struct ena_adapter *, uint16_t *,
+                   uint16_t *, struct ena_com_dev_get_features_ctx *);
+
 static int     ena_allocate_pci_resources(struct pci_attach_args *,
                    struct ena_adapter *);
 static void    ena_free_pci_resources(struct ena_adapter *);
-static int     ena_change_mtu(struct ifnet *, int);
+static void    ena_free_irqs(struct ena_adapter*);
+
 static void    ena_init_io_rings_common(struct ena_adapter *,
-    struct ena_ring *, uint16_t);
+                                            struct ena_ring *, uint16_t);
 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_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 inline void     ena_alloc_counters_rx(struct ena_adapter *,
+                           struct ena_stats_rx *, int);
+static inline void     ena_alloc_counters_tx(struct ena_adapter *,
+                           struct ena_stats_tx *, int);
+static inline void     ena_alloc_counters_dev(struct ena_adapter *,
+                           struct ena_stats_dev *, int);
+static inline void     ena_alloc_counters_hwstats(struct ena_adapter *,
+                           struct ena_hw_stats *, int);
+static inline void     ena_free_counters(struct evcnt *, int, int);
+
+/* attach or detach or ena_reset_task() */
+static void    ena_reset_task(struct work *, void *);
+
+static void    ena_free_mgmnt_irq(struct ena_adapter *);
+static void    ena_disable_msix(struct ena_adapter *);
+static void    ena_config_host_info(struct ena_com_dev *);
+static int     ena_device_init(struct ena_adapter *, device_t,
+                   struct ena_com_dev_get_features_ctx *, int *);
+static int     ena_enable_msix_and_set_admin_interrupts(struct ena_adapter *,
+                   int);
+static int     ena_enable_msix(struct ena_adapter *);
+static int     ena_request_mgmnt_irq(struct ena_adapter *);
+
+/* I/F up or down */
+static int     ena_up_complete(struct ena_adapter *);
+static int     ena_up(struct ena_adapter *);
+static void    ena_down(struct ena_adapter *);
+static void    ena_set_stopping_flag(struct ena_adapter *, bool);
+
+static int     ena_setup_rx_resources(struct ena_adapter *, unsigned int);
+static int     ena_setup_all_rx_resources(struct ena_adapter *);
+static void    ena_free_rx_resources(struct ena_adapter *, unsigned int);
+static void    ena_free_all_rx_resources(struct ena_adapter *);
+static void    ena_free_rx_mbuf(struct ena_adapter *, struct ena_ring *,
+                   struct ena_rx_buffer *);
+static void    ena_free_rx_bufs(struct ena_adapter *, unsigned int);
+static void    ena_free_all_rx_bufs(struct ena_adapter *);
+
+static int     ena_setup_tx_resources(struct ena_adapter *, int);
+static int     ena_setup_all_tx_resources(struct ena_adapter *);
+static void    ena_free_tx_resources(struct ena_adapter *, int);
+static void    ena_free_all_tx_resources(struct ena_adapter *);
+static void    ena_free_tx_bufs(struct ena_adapter *, unsigned int);
+static void    ena_free_all_tx_bufs(struct ena_adapter *);
+
+static int     ena_request_io_irq(struct ena_adapter *);
+static void    ena_free_io_irq(struct ena_adapter *);
+static int     ena_create_io_queues(struct ena_adapter *);
+static void    ena_destroy_all_tx_queues(struct ena_adapter *);
+static void    ena_destroy_all_rx_queues(struct ena_adapter *);
+static void    ena_destroy_all_io_queues(struct ena_adapter *);
+
+static void    ena_update_hwassist(struct ena_adapter *);
+static int     ena_rss_configure(struct ena_adapter *);
+static void    ena_unmask_all_io_irqs(struct ena_adapter *);
+static inline void     ena_reset_counters(struct evcnt *, int, int);
+
+/* other hardware interrupt, workqueue, softint context */
+static int     ena_intr_msix_mgmnt(void *);
+static void    ena_update_on_link_change(void *,
+                   struct ena_admin_aenq_entry *);
+static void    ena_keep_alive_wd(void *,
+                   struct ena_admin_aenq_entry *);
+static void    unimplemented_aenq_handler(void *,
+                   struct ena_admin_aenq_entry *);
+
+static int     ena_handle_msix(void *);
+static void    ena_cleanup(struct work *, void *);
+static inline int      validate_rx_req_id(struct ena_ring *, uint16_t);
+static inline int      ena_alloc_rx_mbuf(struct ena_adapter *,
+                           struct ena_ring *, struct ena_rx_buffer *);
+static int     ena_refill_rx_bufs(struct ena_ring *, uint32_t);
+static void    ena_refill_all_rx_bufs(struct ena_adapter *);
+static int     ena_rx_cleanup(struct ena_ring *);
+static struct mbuf*    ena_rx_mbuf(struct ena_ring *,
+                           struct ena_com_rx_buf_info *,
+                           struct ena_com_rx_ctx *, uint16_t *);
+static inline void     ena_rx_checksum(struct ena_ring *,
+                           struct ena_com_rx_ctx *, struct mbuf *);
+
+static int     ena_check_and_collapse_mbuf(struct ena_ring *tx_ring,
+                   struct mbuf **mbuf);
+static int     ena_xmit_mbuf(struct ena_ring *, struct mbuf **);
+static void    ena_start_xmit(struct ena_ring *);
+static void    ena_deferred_mq_start(struct work *, void *);
+static int     ena_tx_cleanup(struct ena_ring *);
+static void    ena_tx_csum(struct ena_com_tx_ctx *, struct mbuf *);
+static inline int      validate_tx_req_id(struct ena_ring *, uint16_t);
+
+/* other */
+static int     ena_change_mtu(struct ifnet *, int);
+
+static void    ena_timer_service(void *);
+static void    check_for_missing_keep_alive(struct ena_adapter *);
+static void    check_for_admin_com_state(struct ena_adapter *);
+static int     check_missing_comp_in_queue(struct ena_adapter *, struct ena_ring*);
+static void    check_for_missing_tx_completions(struct ena_adapter *);
+static void    check_for_empty_rx_ring(struct ena_adapter *);
+static void    ena_update_host_info(struct ena_admin_host_info *,
+                   struct ifnet *);
+
 #if 0
 static int     ena_setup_tx_dma_tag(struct ena_adapter *);
 static int     ena_free_tx_dma_tag(struct ena_adapter *);
 static int     ena_setup_rx_dma_tag(struct ena_adapter *);
 static int     ena_free_rx_dma_tag(struct ena_adapter *);
-#endif
-static int     ena_setup_tx_resources(struct ena_adapter *, int);
-static void    ena_free_tx_resources(struct ena_adapter *, int);
-static int     ena_setup_all_tx_resources(struct ena_adapter *);
-static void    ena_free_all_tx_resources(struct ena_adapter *);
-static inline int validate_rx_req_id(struct ena_ring *, uint16_t);
-static int     ena_setup_rx_resources(struct ena_adapter *, unsigned int);
-static void    ena_free_rx_resources(struct ena_adapter *, unsigned int);
-static int     ena_setup_all_rx_resources(struct ena_adapter *);
-static void    ena_free_all_rx_resources(struct ena_adapter *);
-static inline int ena_alloc_rx_mbuf(struct ena_adapter *, struct ena_ring *,
-    struct ena_rx_buffer *);
-static void    ena_free_rx_mbuf(struct ena_adapter *, struct ena_ring *,
-    struct ena_rx_buffer *);
-static int     ena_refill_rx_bufs(struct ena_ring *, uint32_t);
-static void    ena_free_rx_bufs(struct ena_adapter *, unsigned int);
-static void    ena_refill_all_rx_bufs(struct ena_adapter *);
-static void    ena_free_all_rx_bufs(struct ena_adapter *);
-static void    ena_free_tx_bufs(struct ena_adapter *, unsigned int);
-static void    ena_free_all_tx_bufs(struct ena_adapter *);
-static void    ena_destroy_all_tx_queues(struct ena_adapter *);
-static void    ena_destroy_all_rx_queues(struct ena_adapter *);
-static void    ena_destroy_all_io_queues(struct ena_adapter *);
-static int     ena_create_io_queues(struct ena_adapter *);
-static int     ena_tx_cleanup(struct ena_ring *);
-static void    ena_deferred_rx_cleanup(struct work *, void *);
-static int     ena_rx_cleanup(struct ena_ring *);
-static inline int validate_tx_req_id(struct ena_ring *, uint16_t);
-#if 0
 static void    ena_rx_hash_mbuf(struct ena_ring *, struct ena_com_rx_ctx *,
     struct mbuf *);
-#endif
-static struct mbuf* ena_rx_mbuf(struct ena_ring *, struct ena_com_rx_buf_info *,
-    struct ena_com_rx_ctx *, uint16_t *);
-static inline void ena_rx_checksum(struct ena_ring *, struct ena_com_rx_ctx *,
-    struct mbuf *);
-static int     ena_handle_msix(void *);
-static int     ena_enable_msix(struct ena_adapter *);
-static int     ena_request_mgmnt_irq(struct ena_adapter *);
-static int     ena_request_io_irq(struct ena_adapter *);
-static void    ena_free_mgmnt_irq(struct ena_adapter *);
-static void    ena_free_io_irq(struct ena_adapter *);
-static void    ena_free_irqs(struct ena_adapter*);
-static void    ena_disable_msix(struct ena_adapter *);
-static void    ena_unmask_all_io_irqs(struct ena_adapter *);
-static int     ena_rss_configure(struct ena_adapter *);
-static int     ena_up_complete(struct ena_adapter *);
-static int     ena_up(struct ena_adapter *);
-static void    ena_down(struct ena_adapter *);
-#if 0
 static uint64_t        ena_get_counter(struct ifnet *, ift_counter);
-#endif
-static int     ena_media_change(struct ifnet *);
-static void    ena_media_status(struct ifnet *, struct ifmediareq *);
-static int     ena_init(struct ifnet *);
-static int     ena_ioctl(struct ifnet *, u_long, void *);
-static int     ena_get_dev_offloads(struct ena_com_dev_get_features_ctx *);
-static void    ena_update_host_info(struct ena_admin_host_info *, struct ifnet *);
-static void    ena_update_hwassist(struct ena_adapter *);
-static int     ena_setup_ifnet(device_t, struct ena_adapter *,
-    struct ena_com_dev_get_features_ctx *);
-static void    ena_tx_csum(struct ena_com_tx_ctx *, struct mbuf *);
-static int     ena_check_and_collapse_mbuf(struct ena_ring *tx_ring,
-    struct mbuf **mbuf);
-static int     ena_xmit_mbuf(struct ena_ring *, struct mbuf **);
-static void    ena_start_xmit(struct ena_ring *);
-static int     ena_mq_start(struct ifnet *, struct mbuf *);
-static void    ena_deferred_mq_start(struct work *, void *);
-#if 0
 static void    ena_qflush(struct ifnet *);
-#endif
-static int     ena_calc_io_queue_num(struct pci_attach_args *,
-    struct ena_adapter *, struct ena_com_dev_get_features_ctx *);
-static int     ena_calc_queue_size(struct ena_adapter *, uint16_t *,
-    uint16_t *, struct ena_com_dev_get_features_ctx *);
-#if 0
 static int     ena_rss_init_default(struct ena_adapter *);
 static void    ena_rss_init_default_deferred(void *);
 #endif
-static void    ena_config_host_info(struct ena_com_dev *);
-static void    ena_attach(device_t, device_t, void *);
-static int     ena_detach(device_t, int);
-static int     ena_device_init(struct ena_adapter *, device_t,
-    struct ena_com_dev_get_features_ctx *, int *);
-static int     ena_enable_msix_and_set_admin_interrupts(struct ena_adapter *,
-    int);
-static void ena_update_on_link_change(void *, struct ena_admin_aenq_entry *);
-static void    unimplemented_aenq_handler(void *,
-    struct ena_admin_aenq_entry *);
-static void    ena_timer_service(void *);
 
 static const char ena_version[] =
     DEVICE_NAME DRV_MODULE_NAME " v" DRV_MODULE_VERSION;
@@ -223,9 +265,8 @@
     ena_mem_handle_t *dma , int mapflags)
 {
        struct ena_adapter *adapter = device_private(dmadev);
-       uint32_t maxsize;
-       bus_dma_segment_t seg;
-       int error, nsegs;
+       bus_size_t maxsize;
+       int error;
 
        maxsize = ((size - 1) / PAGE_SIZE + 1) * PAGE_SIZE;
 
@@ -245,7 +286,7 @@
                 goto fail_create;
        }
 
-       error = bus_dmamem_alloc(dma->tag, maxsize, 8, 0, &seg, 1, &nsegs,
+       error = bus_dmamem_alloc(dma->tag, maxsize, 8, 0, &dma->seg, 1, &dma->nseg,
            BUS_DMA_ALLOCNOW);
        if (error) {
                ena_trace(ENA_ALERT, "bus_dmamem_alloc(%ju) failed: %d\n",
@@ -253,7 +294,7 @@
                goto fail_alloc;
        }
 
-       error = bus_dmamem_map(dma->tag, &seg, nsegs, maxsize,
+       error = bus_dmamem_map(dma->tag, &dma->seg, dma->nseg, maxsize,
            &dma->vaddr, BUS_DMA_COHERENT);
        if (error) {
                ena_trace(ENA_ALERT, "bus_dmamem_map(%ju) failed: %d\n",
@@ -275,7 +316,7 @@
 fail_load:
        bus_dmamem_unmap(dma->tag, dma->vaddr, maxsize);
 fail_map:
-       bus_dmamem_free(dma->tag, &seg, nsegs);
+       bus_dmamem_free(dma->tag, &dma->seg, dma->nseg);
 fail_alloc:
        bus_dmamap_destroy(adapter->sc_dmat, dma->map);
 fail_create:
@@ -287,8 +328,6 @@
     struct ena_adapter *adapter)
 {
        pcireg_t memtype, reg;
-       bus_addr_t memaddr;
-       bus_size_t mapsize;
        int flags, error;
        int msixoff;



Home | Main Index | Thread Index | Old Index