kern/183139: ifconfig options on xn0 lost after xen vm migration to another server

Roger Pau Monné roger.pau at citrix.com
Tue Oct 29 09:50:02 UTC 2013


The following reply was made to PR kern/183139; it has been noted by GNATS.

From: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= <roger.pau at citrix.com>
To: Adam McDougall <mcdouga9 at egr.msu.edu>, <bug-followup at FreeBSD.org>
Cc:  
Subject: Re: kern/183139: ifconfig options on xn0 lost after xen vm migration
 to another server
Date: Tue, 29 Oct 2013 10:42:55 +0100

 On 28/10/13 22:28, Adam McDougall wrote:
 > So far, it almost works as I expect.  It seems to work as long as at
 > least one option is left (example: options=400<LRO>) but if I have none,
 > they all come back on migrate.  Thanks.
 
 Yes, the "resume" condition is not triggered if there isn't any 
 feature enabled. I've updated the patch, now it should work as expected:
 
 ---
 diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c
 index f9c72e6..52d8c11 100644
 --- a/sys/dev/xen/netfront/netfront.c
 +++ b/sys/dev/xen/netfront/netfront.c
 @@ -287,6 +287,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
 @@ -502,6 +504,7 @@ netfront_resume(device_t dev)
  {
  	struct netfront_info *info = device_get_softc(dev);
  
 +	info->xn_resume = true;
  	netif_disconnect_backend(info);
  	return (0);
  }
 @@ -2024,13 +2027,28 @@ xn_configure_features(struct netfront_info *np)
  	int err;
  
  	err = 0;
 +
 +	if (!np->xn_resume ||
 +	    ((np->xn_ifp->if_capenable & np->xn_ifp->if_capabilities)
 +	    != np->xn_ifp->if_capenable)) {
 +	    	/*
 +	    	 * Check if current enabled capabilities are available,
 +	    	 * if not switch to default capabilities.
 +	    	 */
  #if __FreeBSD_version >= 700000
 -	if ((np->xn_ifp->if_capenable & IFCAP_LRO) != 0)
 -		tcp_lro_free(&np->xn_lro);
 +		if ((np->xn_ifp->if_capenable & IFCAP_LRO) != 0)
 +			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_hwassist &= ~CSUM_TSO;
 +    		np->xn_ifp->if_capenable =
 +	    		np->xn_ifp->if_capabilities & ~(IFCAP_LRO|IFCAP_TSO4);
 +		np->xn_ifp->if_hwassist &= ~CSUM_TSO;
 +	} else {
 +		/*
 +		 * What we have currently enabled is supported by the
 +		 * new host, no need to change anything.
 +		 */
 +		return 0;
 +	}
  #if __FreeBSD_version >= 700000
  	if (xn_enable_lro && (np->xn_ifp->if_capabilities & IFCAP_LRO) != 0) {
  		err = tcp_lro_init(&np->xn_lro);
 
 


More information about the freebsd-bugs mailing list