svn commit: r308496 - stable/10/sys/dev/hyperv/netvsc
Sepherosa Ziehau
sephe at FreeBSD.org
Fri Nov 11 03:15:53 UTC 2016
Author: sephe
Date: Fri Nov 11 03:15:52 2016
New Revision: 308496
URL: https://svnweb.freebsd.org/changeset/base/308496
Log:
MFC 307840,307842
307840
hyperv/hn: Properly handle synthetic parts reattach failure.
Sponsored by: Microsoft
Differential Revision: https://reviews.freebsd.org/D8310
307842
hyperv/hn: Start link status check, if no network changes were pending.
Link status check is much more lightweight than network change detection.
Sponsored by: Microsoft
Differential Revision: https://reviews.freebsd.org/D8311
Modified:
stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Fri Nov 11 03:09:15 2016 (r308495)
+++ stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Fri Nov 11 03:15:52 2016 (r308496)
@@ -1803,19 +1803,6 @@ hn_ioctl(struct ifnet *ifp, u_long cmd,
break;
}
- /* Obtain and record requested MTU */
- ifp->if_mtu = ifr->ifr_mtu;
-
-#if __FreeBSD_version >= 1100099
- /*
- * Make sure that LRO aggregation length limit is still
- * valid, after the MTU change.
- */
- if (sc->hn_rx_ring[0].hn_lro.lro_length_lim <
- HN_LRO_LENLIM_MIN(ifp))
- hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MIN(ifp));
-#endif
-
/*
* Suspend this interface before the synthetic parts
* are ripped.
@@ -1830,13 +1817,31 @@ hn_ioctl(struct ifnet *ifp, u_long cmd,
/*
* Reattach the synthetic parts, i.e. NVS and RNDIS,
* with the new MTU setting.
- * XXX check error.
*/
- hn_synth_attach(sc, ifr->ifr_mtu);
+ error = hn_synth_attach(sc, ifr->ifr_mtu);
+ if (error) {
+ HN_UNLOCK(sc);
+ break;
+ }
+ /*
+ * Commit the requested MTU, after the synthetic parts
+ * have been successfully attached.
+ */
+ ifp->if_mtu = ifr->ifr_mtu;
+
+ /*
+ * Make sure that various parameters based on MTU are
+ * still valid, after the MTU change.
+ */
if (sc->hn_tx_ring[0].hn_chim_size > sc->hn_chim_szmax)
hn_set_chim_size(sc, sc->hn_chim_szmax);
- hn_set_tso_maxsize(sc, hn_tso_maxlen, ifr->ifr_mtu);
+ hn_set_tso_maxsize(sc, hn_tso_maxlen, ifp->if_mtu);
+#if __FreeBSD_version >= 1100099
+ if (sc->hn_rx_ring[0].hn_lro.lro_length_lim <
+ HN_LRO_LENLIM_MIN(ifp))
+ hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MIN(ifp));
+#endif
/*
* All done! Resume the interface now.
@@ -3923,12 +3928,18 @@ static void
hn_resume_mgmt(struct hn_softc *sc)
{
+ sc->hn_mgmt_taskq = sc->hn_mgmt_taskq0;
+
/*
- * Kick off network change detection, which will
- * do link status check too.
+ * Kick off network change detection, if it was pending.
+ * If no network change was pending, start link status
+ * checks, which is more lightweight than network change
+ * detection.
*/
- sc->hn_mgmt_taskq = sc->hn_mgmt_taskq0;
- hn_network_change(sc);
+ if (sc->hn_link_flags & HN_LINK_FLAG_NETCHG)
+ hn_network_change(sc);
+ else
+ hn_link_status_update(sc);
}
static void
More information about the svn-src-stable
mailing list