FreeBSD Bugzilla – Attachment 171249 Details for
Bug 207446
Hang bringing up vtnet(4) on >8 cpu GCE VMs
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Fix vtnet hang with max_virtqueue_pairs > VTNET_MAX_QUEUE_PAIRS
virtio-net-mq.patch (text/plain), 4.89 KB, created by
Steven Hartland
on 2016-06-10 01:05:23 UTC
(
hide
)
Description:
Fix vtnet hang with max_virtqueue_pairs > VTNET_MAX_QUEUE_PAIRS
Filename:
MIME Type:
Creator:
Steven Hartland
Created:
2016-06-10 01:05:23 UTC
Size:
4.89 KB
patch
obsolete
>--- sys/dev/virtio/network/if_vtnet.c.orig 2016-06-09 23:48:39.716749078 +0000 >+++ sys/dev/virtio/network/if_vtnet.c 2016-06-10 00:58:23.874459590 +0000 >@@ -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; > >@@ -591,7 +605,6 @@ static void > vtnet_setup_features(struct vtnet_softc *sc) > { > device_t dev; >- int max_pairs, max; > > dev = sc->vtnet_dev; > >@@ -640,32 +653,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 >@@ -2991,13 +3003,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, >@@ -3853,6 +3863,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"); >--- sys/dev/virtio/network/if_vtnetvar.h.orig 2016-06-09 23:16:25.752882832 +0000 >+++ sys/dev/virtio/network/if_vtnetvar.h 2016-06-10 00:15:04.566638798 +0000 >@@ -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;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 207446
:
167336
|
167464
| 171249