svn commit: r285089 - head/sys/dev/xen/netfront
Roger Pau Monné
royger at FreeBSD.org
Fri Jul 3 12:09:06 UTC 2015
Author: royger
Date: Fri Jul 3 12:09:05 2015
New Revision: 285089
URL: https://svnweb.freebsd.org/changeset/base/285089
Log:
netfront: preserve configuration across migrations
Try to preserve the xn configuration when migrating. This is not always
possible since the backend might not have the same set of options
available, in which case we will try to preserve as many as possible.
MFC after: 2 weeks
PR: 183139
Reported by: mcdouga9 at egr.msu.edu
Sponsored by: Citrix Systems R&D
Modified:
head/sys/dev/xen/netfront/netfront.c
Modified: head/sys/dev/xen/netfront/netfront.c
==============================================================================
--- head/sys/dev/xen/netfront/netfront.c Fri Jul 3 11:16:20 2015 (r285088)
+++ head/sys/dev/xen/netfront/netfront.c Fri Jul 3 12:09:05 2015 (r285089)
@@ -285,6 +285,8 @@ struct netfront_info {
multicall_entry_t rx_mcl[NET_RX_RING_SIZE+1];
mmu_update_t rx_mmu[NET_RX_RING_SIZE];
struct ifmedia sc_media;
+
+ bool xn_resume;
};
#define rx_mbufs xn_cdata.xn_rx_chain
@@ -500,6 +502,7 @@ netfront_resume(device_t dev)
{
struct netfront_info *info = device_get_softc(dev);
+ info->xn_resume = true;
netif_disconnect_backend(info);
return (0);
}
@@ -1982,18 +1985,33 @@ xn_query_features(struct netfront_info *
static int
xn_configure_features(struct netfront_info *np)
{
- int err;
+ int err, cap_enabled;
err = 0;
+
+ if (np->xn_resume &&
+ ((np->xn_ifp->if_capenable & np->xn_ifp->if_capabilities)
+ == np->xn_ifp->if_capenable)) {
+ /* Current options are available, no need to do anything. */
+ return (0);
+ }
+
+ /* Try to preserve as many options as possible. */
+ if (np->xn_resume)
+ cap_enabled = np->xn_ifp->if_capenable;
+ else
+ cap_enabled = UINT_MAX;
+
#if __FreeBSD_version >= 700000 && (defined(INET) || defined(INET6))
- if ((np->xn_ifp->if_capenable & IFCAP_LRO) != 0)
+ if ((np->xn_ifp->if_capenable & IFCAP_LRO) == (cap_enabled & IFCAP_LRO))
tcp_lro_free(&np->xn_lro);
#endif
np->xn_ifp->if_capenable =
- np->xn_ifp->if_capabilities & ~(IFCAP_LRO|IFCAP_TSO4);
+ np->xn_ifp->if_capabilities & ~(IFCAP_LRO|IFCAP_TSO4) & cap_enabled;
np->xn_ifp->if_hwassist &= ~CSUM_TSO;
#if __FreeBSD_version >= 700000 && (defined(INET) || defined(INET6))
- if (xn_enable_lro && (np->xn_ifp->if_capabilities & IFCAP_LRO) != 0) {
+ if (xn_enable_lro && (np->xn_ifp->if_capabilities & IFCAP_LRO) ==
+ (cap_enabled & IFCAP_LRO)) {
err = tcp_lro_init(&np->xn_lro);
if (err) {
device_printf(np->xbdev, "LRO initialization failed\n");
@@ -2002,7 +2020,8 @@ xn_configure_features(struct netfront_in
np->xn_ifp->if_capenable |= IFCAP_LRO;
}
}
- if ((np->xn_ifp->if_capabilities & IFCAP_TSO4) != 0) {
+ if ((np->xn_ifp->if_capabilities & IFCAP_TSO4) ==
+ (cap_enabled & IFCAP_TSO4)) {
np->xn_ifp->if_capenable |= IFCAP_TSO4;
np->xn_ifp->if_hwassist |= CSUM_TSO;
}
More information about the svn-src-head
mailing list