Author: smh
Date: Sun Aug 14 00:40:17 2016
New Revision: 304067
URL: https://svnweb.freebsd.org/changeset/base/304067

Log:
  MFC r303971:
  
  Fix vtnet hang with max_virtqueue_pairs > VTNET_MAX_QUEUE_PAIRS
  
  Sponsored by: Multiplay

Modified:
  stable/11/sys/dev/virtio/network/if_vtnet.c
  stable/11/sys/dev/virtio/network/if_vtnetvar.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- stable/11/sys/dev/virtio/network/if_vtnet.c Sun Aug 14 00:24:00 2016        
(r304066)
+++ stable/11/sys/dev/virtio/network/if_vtnet.c Sun Aug 14 00:40:17 2016        
(r304067)
@@ -230,18 +230,32 @@ static void       vtnet_disable_interrupts(str
 static int     vtnet_tunable_int(struct vtnet_softc *, const char *, int);
 
 /* Tunables. */
+static SYSCTL_NODE(_hw, OID_AUTO, vtnet, CTLFLAG_RD, 0, "VNET driver 
parameters");
 static int vtnet_csum_disable = 0;
 TUNABLE_INT("hw.vtnet.csum_disable", &vtnet_csum_disable);
+SYSCTL_INT(_hw_vtnet, OID_AUTO, csum_disable, CTLFLAG_RDTUN,
+    &vtnet_csum_disable, 0, "Disables receive and send checksum offload");
 static int vtnet_tso_disable = 0;
 TUNABLE_INT("hw.vtnet.tso_disable", &vtnet_tso_disable);
+SYSCTL_INT(_hw_vtnet, OID_AUTO, tso_disable, CTLFLAG_RDTUN, &vtnet_tso_disable,
+    0, "Disables TCP Segmentation Offload");
 static int vtnet_lro_disable = 0;
 TUNABLE_INT("hw.vtnet.lro_disable", &vtnet_lro_disable);
+SYSCTL_INT(_hw_vtnet, OID_AUTO, lro_disable, CTLFLAG_RDTUN, &vtnet_lro_disable,
+    0, "Disables TCP Large Receive Offload");
 static int vtnet_mq_disable = 0;
 TUNABLE_INT("hw.vtnet.mq_disable", &vtnet_mq_disable);
-static int vtnet_mq_max_pairs = 0;
+SYSCTL_INT(_hw_vtnet, OID_AUTO, mq_disable, CTLFLAG_RDTUN, &vtnet_mq_disable,
+    0, "Disables Multi Queue support");
+static int vtnet_mq_max_pairs = VTNET_MAX_QUEUE_PAIRS;
 TUNABLE_INT("hw.vtnet.mq_max_pairs", &vtnet_mq_max_pairs);
+SYSCTL_INT(_hw_vtnet, OID_AUTO, mq_max_pairs, CTLFLAG_RDTUN,
+    &vtnet_mq_max_pairs, 0, "Sets the maximum number of Multi Queue pairs");
 static int vtnet_rx_process_limit = 512;
 TUNABLE_INT("hw.vtnet.rx_process_limit", &vtnet_rx_process_limit);
+SYSCTL_INT(_hw_vtnet, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
+    &vtnet_rx_process_limit, 0,
+    "Limits the number RX segments processed in a single pass");
 
 static uma_zone_t vtnet_tx_header_zone;
 
@@ -597,7 +611,6 @@ static void
 vtnet_setup_features(struct vtnet_softc *sc)
 {
        device_t dev;
-       int max_pairs, max;
 
        dev = sc->vtnet_dev;
 
@@ -646,32 +659,31 @@ vtnet_setup_features(struct vtnet_softc 
 
        if (virtio_with_feature(dev, VIRTIO_NET_F_MQ) &&
            sc->vtnet_flags & VTNET_FLAG_CTRL_VQ) {
-               max_pairs = virtio_read_dev_config_2(dev,
+               sc->vtnet_max_vq_pairs = virtio_read_dev_config_2(dev,
                    offsetof(struct virtio_net_config, max_virtqueue_pairs));
-               if (max_pairs < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN ||
-                   max_pairs > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX)
-                       max_pairs = 1;
        } else
-               max_pairs = 1;
+               sc->vtnet_max_vq_pairs = 1;
 
-       if (max_pairs > 1) {
+       if (sc->vtnet_max_vq_pairs > 1) {
                /*
-                * Limit the maximum number of queue pairs to the number of
-                * CPUs or the configured maximum. The actual number of
-                * queues that get used may be less.
+                * Limit the maximum number of queue pairs to the lower of
+                * the number of CPUs and the configured maximum.
+                * The actual number of queues that get used may be less.
                 */
+               int max;
+
                max = vtnet_tunable_int(sc, "mq_max_pairs", vtnet_mq_max_pairs);
-               if (max > 0 && max_pairs > max)
-                       max_pairs = max;
-               if (max_pairs > mp_ncpus)
-                       max_pairs = mp_ncpus;
-               if (max_pairs > VTNET_MAX_QUEUE_PAIRS)
-                       max_pairs = VTNET_MAX_QUEUE_PAIRS;
-               if (max_pairs > 1)
-                       sc->vtnet_flags |= VTNET_FLAG_MULTIQ;
+               if (max > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN) {
+                       if (max > mp_ncpus)
+                               max = mp_ncpus;
+                       if (max > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX)
+                               max = VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX;
+                       if (max > 1) {
+                               sc->vtnet_requested_vq_pairs = max;
+                               sc->vtnet_flags |= VTNET_FLAG_MULTIQ;
+                       }
+               }
        }
-
-       sc->vtnet_max_vq_pairs = max_pairs;
 }
 
 static int
@@ -2982,13 +2994,11 @@ vtnet_set_active_vq_pairs(struct vtnet_s
        dev = sc->vtnet_dev;
 
        if ((sc->vtnet_flags & VTNET_FLAG_MULTIQ) == 0) {
-               MPASS(sc->vtnet_max_vq_pairs == 1);
                sc->vtnet_act_vq_pairs = 1;
                return;
        }
 
-       /* BMV: Just use the maximum configured for now. */
-       npairs = sc->vtnet_max_vq_pairs;
+       npairs = sc->vtnet_requested_vq_pairs;
 
        if (vtnet_ctrl_mq_cmd(sc, npairs) != 0) {
                device_printf(dev,
@@ -3852,6 +3862,9 @@ vtnet_setup_sysctl(struct vtnet_softc *s
        SYSCTL_ADD_INT(ctx, child, OID_AUTO, "max_vq_pairs",
            CTLFLAG_RD, &sc->vtnet_max_vq_pairs, 0,
            "Maximum number of supported virtqueue pairs");
+       SYSCTL_ADD_INT(ctx, child, OID_AUTO, "requested_vq_pairs",
+           CTLFLAG_RD, &sc->vtnet_requested_vq_pairs, 0,
+           "Requested number of virtqueue pairs");
        SYSCTL_ADD_INT(ctx, child, OID_AUTO, "act_vq_pairs",
            CTLFLAG_RD, &sc->vtnet_act_vq_pairs, 0,
            "Number of active virtqueue pairs");

Modified: stable/11/sys/dev/virtio/network/if_vtnetvar.h
==============================================================================
--- stable/11/sys/dev/virtio/network/if_vtnetvar.h      Sun Aug 14 00:24:00 
2016        (r304066)
+++ stable/11/sys/dev/virtio/network/if_vtnetvar.h      Sun Aug 14 00:40:17 
2016        (r304067)
@@ -155,6 +155,7 @@ struct vtnet_softc {
        int                      vtnet_if_flags;
        int                      vtnet_act_vq_pairs;
        int                      vtnet_max_vq_pairs;
+       int                      vtnet_requested_vq_pairs;
 
        struct virtqueue        *vtnet_ctrl_vq;
        struct vtnet_mac_filter *vtnet_mac_filter;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to