Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/pci/ixgbe Don't free and reallocate bus_dmamem when ...



details:   https://anonhg.NetBSD.org/src/rev/ad6109c000a3
branches:  trunk
changeset: 831997:ad6109c000a3
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Wed Apr 25 08:46:19 2018 +0000

description:
Don't free and reallocate bus_dmamem when it's not required. Currently,
the watchdog timer is completely broken and never fire (it's from FreeBSD
(pre iflib)). If the problem is fixed and watchdog fired, ixgbe_init() always
calls ixgbe_jcl_reinit() and it causes panic. The reason is that
ixgbe_local_timer1(it includes watchdog function) is softint and
xgbe_jcl_reinit() calls bus_dmamem*() functions. bus_dmamem*() can't be called
from interrupt context.

 One of the way to prevent panic is use worqueue for the timer, but it's
not a small change. (I'll do it in future).

 Another way is not reallocate dmamem if it's not required. If both the MTU
(rx_mbuf_sz in reality) and the number of RX descriptors are not changed, it's
not required to call bus_dmamem_{unmap,free}(). Even if we use workque, this
change save time of ixgbe_init().

 I have a code to fix broken watchdog timer but it sometime causes watchdog
timeout, so I don't commit it yet.

diffstat:

 sys/dev/pci/ixgbe/ix_txrx.c      |   4 ++--
 sys/dev/pci/ixgbe/ixgbe.h        |   5 ++++-
 sys/dev/pci/ixgbe/ixgbe_netbsd.c |  25 +++++++++++++++++++++----
 sys/dev/pci/ixgbe/ixgbe_netbsd.h |   3 +--
 sys/dev/pci/ixgbe/ixgbe_osdep.h  |   4 +++-
 5 files changed, 31 insertions(+), 10 deletions(-)

diffs (135 lines):

diff -r 6c6ec204fa09 -r ad6109c000a3 sys/dev/pci/ixgbe/ix_txrx.c
--- a/sys/dev/pci/ixgbe/ix_txrx.c       Wed Apr 25 08:29:45 2018 +0000
+++ b/sys/dev/pci/ixgbe/ix_txrx.c       Wed Apr 25 08:46:19 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ix_txrx.c,v 1.40 2018/04/17 08:38:05 msaitoh Exp $ */
+/* $NetBSD: ix_txrx.c,v 1.41 2018/04/25 08:46:19 msaitoh Exp $ */
 
 /******************************************************************************
 
@@ -1607,7 +1607,7 @@
         * or size of jumbo mbufs may have changed.
         * Assume all of rxr->ptag are the same.
         */
-       ixgbe_jcl_reinit(&adapter->jcl_head, rxr->ptag->dt_dmat,
+       ixgbe_jcl_reinit(adapter, rxr->ptag->dt_dmat,
            (2 * adapter->num_rx_desc) * adapter->num_queues,
            adapter->rx_mbuf_sz);
 
diff -r 6c6ec204fa09 -r ad6109c000a3 sys/dev/pci/ixgbe/ixgbe.h
--- a/sys/dev/pci/ixgbe/ixgbe.h Wed Apr 25 08:29:45 2018 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe.h Wed Apr 25 08:46:19 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe.h,v 1.45 2018/04/19 21:50:09 christos Exp $ */
+/* $NetBSD: ixgbe.h,v 1.46 2018/04/25 08:46:19 msaitoh Exp $ */
 
 /******************************************************************************
   SPDX-License-Identifier: BSD-3-Clause
@@ -751,6 +751,9 @@
 
 const struct sysctlnode *ixgbe_sysctl_instance(struct adapter *);
 
+/* For NetBSD */
+void ixgbe_jcl_reinit(struct adapter *, bus_dma_tag_t, int, size_t);
+
 #include "ixgbe_bypass.h"
 #include "ixgbe_fdir.h"
 #include "ixgbe_rss.h"
diff -r 6c6ec204fa09 -r ad6109c000a3 sys/dev/pci/ixgbe/ixgbe_netbsd.c
--- a/sys/dev/pci/ixgbe/ixgbe_netbsd.c  Wed Apr 25 08:29:45 2018 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe_netbsd.c  Wed Apr 25 08:46:19 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_netbsd.c,v 1.6 2017/06/01 02:45:11 chs Exp $ */
+/* $NetBSD: ixgbe_netbsd.c,v 1.7 2018/04/25 08:46:19 msaitoh Exp $ */
 /*
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -40,7 +40,7 @@
 #include <sys/workqueue.h>
 #include <dev/pci/pcivar.h>
 
-#include "ixgbe_netbsd.h"
+#include "ixgbe.h"
 
 void
 ixgbe_dma_tag_destroy(ixgbe_dma_tag_t *dt)
@@ -162,11 +162,12 @@
 }
 
 void
-ixgbe_jcl_reinit(ixgbe_extmem_head_t *eh, bus_dma_tag_t dmat, int nbuf,
+ixgbe_jcl_reinit(struct adapter *adapter, bus_dma_tag_t dmat, int nbuf,
     size_t size)
 {
+       ixgbe_extmem_head_t *eh = &adapter->jcl_head;
+       ixgbe_extmem_t *em;
        int i;
-       ixgbe_extmem_t *em;
 
        if (!eh->eh_initialized) {
                TAILQ_INIT(&eh->eh_freelist);
@@ -174,6 +175,18 @@
                eh->eh_initialized = true;
        }
 
+       /*
+        *  Check previous parameters. If it's not required to reinit, just
+        * return.
+        *
+        *  Note that the num_rx_desc is currently fixed value. It's never
+        * changed after device is attached.
+        */
+       if ((adapter->osdep.last_rx_mbuf_sz == adapter->rx_mbuf_sz)
+           && (adapter->osdep.last_num_rx_desc == adapter->num_rx_desc))
+               return;
+
+       /* Free all dmamem */
        while ((em = ixgbe_getext(eh, 0)) != NULL) {
                KASSERT(em->em_vaddr != NULL);
                bus_dmamem_unmap(dmat, em->em_vaddr, em->em_size);
@@ -190,6 +203,10 @@
                }
                ixgbe_putext(em);
        }
+
+       /* Keep current parameters */
+       adapter->osdep.last_rx_mbuf_sz = adapter->rx_mbuf_sz;
+       adapter->osdep.last_num_rx_desc = adapter->num_rx_desc;
 }
 
 static void
diff -r 6c6ec204fa09 -r ad6109c000a3 sys/dev/pci/ixgbe/ixgbe_netbsd.h
--- a/sys/dev/pci/ixgbe/ixgbe_netbsd.h  Wed Apr 25 08:29:45 2018 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe_netbsd.h  Wed Apr 25 08:46:19 2018 +0000
@@ -1,4 +1,4 @@
-/*$NetBSD: ixgbe_netbsd.h,v 1.7 2017/02/08 04:32:43 msaitoh Exp $*/
+/*$NetBSD: ixgbe_netbsd.h,v 1.8 2018/04/25 08:46:19 msaitoh Exp $*/
 /*
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -93,7 +93,6 @@
 void ixgbe_dmamap_sync(ixgbe_dma_tag_t *, bus_dmamap_t, int);
 void ixgbe_dmamap_unload(ixgbe_dma_tag_t *, bus_dmamap_t);
 
-void ixgbe_jcl_reinit(ixgbe_extmem_head_t *, bus_dma_tag_t, int, size_t);
 struct mbuf *ixgbe_getjcl(ixgbe_extmem_head_t *, int, int, int, size_t);
 void ixgbe_pci_enable_busmaster(pci_chipset_tag_t, pcitag_t);
 
diff -r 6c6ec204fa09 -r ad6109c000a3 sys/dev/pci/ixgbe/ixgbe_osdep.h
--- a/sys/dev/pci/ixgbe/ixgbe_osdep.h   Wed Apr 25 08:29:45 2018 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe_osdep.h   Wed Apr 25 08:46:19 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_osdep.h,v 1.21 2018/04/04 08:13:07 msaitoh Exp $ */
+/* $NetBSD: ixgbe_osdep.h,v 1.22 2018/04/25 08:46:19 msaitoh Exp $ */
 
 /******************************************************************************
   SPDX-License-Identifier: BSD-3-Clause
@@ -207,6 +207,8 @@
        bus_space_handle_t mem_bus_space_handle;
        bus_size_t         mem_size;
        bus_dma_tag_t      dmat;
+       u16                last_rx_mbuf_sz;
+       u32                last_num_rx_desc;
        pci_intr_handle_t  *intrs;
        int                nintrs;
        void               *ihs[IXG_MAX_NINTR];



Home | Main Index | Thread Index | Old Index