Author: yongari
Date: Tue Dec  8 17:54:23 2009
New Revision: 200264
URL: http://svn.freebsd.org/changeset/base/200264

Log:
  Create sysctl node(dev.bge.%d.focred_collapse) instead of
  hw.bge.forced_collapse. hw.bge.forced_collapse affects all bge(4)
  controllers on system which may not desirable behavior of the
  sysctl node. Also allow the sysctl node could be modified at any
  time.
  
  Reviewed by:  bde (initial version)

Modified:
  head/sys/dev/bge/if_bge.c
  head/sys/dev/bge/if_bgereg.h

Modified: head/sys/dev/bge/if_bge.c
==============================================================================
--- head/sys/dev/bge/if_bge.c   Tue Dec  8 15:29:12 2009        (r200263)
+++ head/sys/dev/bge/if_bge.c   Tue Dec  8 17:54:23 2009        (r200264)
@@ -483,29 +483,12 @@ DRIVER_MODULE(bge, pci, bge_driver, bge_
 DRIVER_MODULE(miibus, bge, miibus_driver, miibus_devclass, 0, 0);
 
 static int bge_allow_asf = 1;
-/*
- * A common design characteristic for many Broadcom client controllers
- * is that they only support a single outstanding DMA read operation
- * on the PCIe bus. This means that it will take twice as long to fetch
- * a TX frame that is split into header and payload buffers as it does
- * to fetch a single, contiguous TX frame (2 reads vs. 1 read). For
- * these controllers, coalescing buffers to reduce the number of memory
- * reads is effective way to get maximum performance(about 940Mbps).
- * Without collapsing TX buffers the maximum TCP bulk transfer
- * performance is about 850Mbps. However forcing coalescing mbufs
- * consumes a lot of CPU cycles, so leave it off by default.
- */
-static int bge_forced_collapse = 0;
 
 TUNABLE_INT("hw.bge.allow_asf", &bge_allow_asf);
-TUNABLE_INT("hw.bge.forced_collapse", &bge_forced_collapse);
 
 SYSCTL_NODE(_hw, OID_AUTO, bge, CTLFLAG_RD, 0, "BGE driver parameters");
 SYSCTL_INT(_hw_bge, OID_AUTO, allow_asf, CTLFLAG_RD, &bge_allow_asf, 0,
        "Allow ASF mode if available");
-SYSCTL_INT(_hw_bge, OID_AUTO, forced_collapse, CTLFLAG_RD, 
&bge_forced_collapse,
-       0, "Number of fragmented TX buffers of a frame allowed before "
-       "forced collapsing");
 
 #define        SPARC64_BLADE_1500_MODEL        "SUNW,Sun-Blade-1500"
 #define        SPARC64_BLADE_1500_PATH_BGE     "/p...@1f,700000/netw...@2"
@@ -3937,17 +3920,17 @@ bge_encap(struct bge_softc *sc, struct m
        }
 
        if ((m->m_pkthdr.csum_flags & CSUM_TSO) == 0 &&
-           bge_forced_collapse > 0 && (sc->bge_flags & BGE_FLAG_PCIE) != 0 &&
-           m->m_next != NULL) {
+           sc->bge_forced_collapse > 0 &&
+           (sc->bge_flags & BGE_FLAG_PCIE) != 0 && m->m_next != NULL) {
                /*
                 * Forcedly collapse mbuf chains to overcome hardware
                 * limitation which only support a single outstanding
                 * DMA read operation.
                 */
-               if (bge_forced_collapse == 1)
+               if (sc->bge_forced_collapse == 1)
                        m = m_defrag(m, M_DONTWAIT);
                else
-                       m = m_collapse(m, M_DONTWAIT, bge_forced_collapse);
+                       m = m_collapse(m, M_DONTWAIT, sc->bge_forced_collapse);
                if (m == NULL) {
                        m_freem(*m_head);
                        *m_head = NULL;
@@ -4875,6 +4858,26 @@ bge_add_sysctls(struct bge_softc *sc)
 
 #endif
 
+       /*
+        * A common design characteristic for many Broadcom client controllers
+        * is that they only support a single outstanding DMA read operation
+        * on the PCIe bus. This means that it will take twice as long to fetch
+        * a TX frame that is split into header and payload buffers as it does
+        * to fetch a single, contiguous TX frame (2 reads vs. 1 read). For
+        * these controllers, coalescing buffers to reduce the number of memory
+        * reads is effective way to get maximum performance(about 940Mbps).
+        * Without collapsing TX buffers the maximum TCP bulk transfer
+        * performance is about 850Mbps. However forcing coalescing mbufs
+        * consumes a lot of CPU cycles, so leave it off by default.
+        */
+       SYSCTL_ADD_INT(ctx, children, OID_AUTO, "forced_collapse",
+           CTLFLAG_RW, &sc->bge_forced_collapse, 0,
+           "Number of fragmented TX buffers of a frame allowed before "
+           "forced collapsing");
+       resource_int_value(device_get_name(sc->bge_dev),
+           device_get_unit(sc->bge_dev), "forced_collapse",
+           &sc->bge_forced_collapse);
+
        if (BGE_IS_5705_PLUS(sc))
                return;
 

Modified: head/sys/dev/bge/if_bgereg.h
==============================================================================
--- head/sys/dev/bge/if_bgereg.h        Tue Dec  8 15:29:12 2009        
(r200263)
+++ head/sys/dev/bge/if_bgereg.h        Tue Dec  8 17:54:23 2009        
(r200264)
@@ -2647,6 +2647,7 @@ struct bge_softc {
        int                     bge_link;       /* link state */
        int                     bge_link_evt;   /* pending link event */
        int                     bge_timer;
+       int                     bge_forced_collapse;
        struct callout          bge_stat_ch;
        uint32_t                bge_rx_discards;
        uint32_t                bge_tx_discards;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to