veth_disable_xdp_range(dev, 0, dev->real_num_rx_queues, true);
                                return err;
                        }
-
-                       if (!veth_gro_requested(dev)) {
-                               /* user-space did not require GRO, but adding XDP
-                                * is supposed to get GRO working
-                                */
-                               dev->features |= NETIF_F_GRO;
-                               netdev_features_change(dev);
-                       }
                }
        }
 
        for (i = 0; i < dev->real_num_rx_queues; i++)
                rcu_assign_pointer(priv->rq[i].xdp_prog, NULL);
 
-       if (!netif_running(dev) || !veth_gro_requested(dev)) {
+       if (!netif_running(dev) || !veth_gro_requested(dev))
                veth_napi_del(dev);
 
-               /* if user-space did not require GRO, since adding XDP
-                * enabled it, clear it now
-                */
-               if (!veth_gro_requested(dev) && netif_running(dev)) {
-                       dev->features &= ~NETIF_F_GRO;
-                       netdev_features_change(dev);
-               }
-       }
-
        veth_disable_xdp_range(dev, 0, dev->real_num_rx_queues, false);
 }
 
                }
 
                if (!old_prog) {
+                       if (!veth_gro_requested(dev)) {
+                               /* user-space did not require GRO, but adding
+                                * XDP is supposed to get GRO working
+                                */
+                               dev->features |= NETIF_F_GRO;
+                               netdev_features_change(dev);
+                       }
+
                        peer->hw_features &= ~NETIF_F_GSO_SOFTWARE;
                        peer->max_mtu = max_mtu;
                }
                        if (dev->flags & IFF_UP)
                                veth_disable_xdp(dev);
 
+                       /* if user-space did not require GRO, since adding XDP
+                        * enabled it, clear it now
+                        */
+                       if (!veth_gro_requested(dev)) {
+                               dev->features &= ~NETIF_F_GRO;
+                               netdev_features_change(dev);
+                       }
+
                        if (peer) {
                                peer->hw_features |= NETIF_F_GSO_SOFTWARE;
                                peer->max_mtu = ETH_MAX_MTU;