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
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to