Skip to content

Commit

Permalink
netfront: preserve configuration across migrations
Browse files Browse the repository at this point in the history
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:  [email protected]
Sponsored by: Citrix Systems R&D
  • Loading branch information
Roger Pau Monné authored and Roger Pau Monné committed Jul 3, 2015
1 parent 49557d2 commit 6a8e969
Showing 1 changed file with 24 additions and 5 deletions.
29 changes: 24 additions & 5 deletions sys/dev/xen/netfront/netfront.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -1982,18 +1985,33 @@ xn_query_features(struct netfront_info *np)
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");
Expand All @@ -2002,7 +2020,8 @@ xn_configure_features(struct netfront_info *np)
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;
}
Expand Down

0 comments on commit 6a8e969

Please sign in to comment.