From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olaf Hering Subject: [PATCH] netback: allow arbitrary mtu size until frontend connects Date: Sun, 6 Feb 2011 14:42:53 +0100 Message-ID: <20110206134253.GB9752@aepfle.de> References: <20110206134123.GA9752@aepfle.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Return-path: Content-Disposition: inline In-Reply-To: <20110206134123.GA9752@aepfle.de> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Allow arbitrary mtu size until the frontend is connected. Once the connection is established, adjust mtu by checking if the backend supports the 'feature-sg'. If the backend does support it, keep the current mtu. Otherwise set it to the default value, which is 1500. This helps the vif-bridge hotplug script to set the mtu size to 9000 while bringing up the guest. Signed-off-by: Olaf Hering --- drivers/xen/netback/common.h | 8 ++++++++ drivers/xen/netback/interface.c | 8 +++++++- drivers/xen/netback/xenbus.c | 9 +++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) --- linux-2.6.18-xen.hg.orig/drivers/xen/netback/common.h +++ linux-2.6.18-xen.hg/drivers/xen/netback/common.h @@ -82,6 +82,8 @@ typedef struct netif_st { u8 can_queue:1; /* can queue packets for receiver? */ u8 copying_receiver:1; /* copy packets to receiver? */ + u8 frontend_connected:1; /* is frontend already connected? */ + /* Allow netif_be_start_xmit() to peek ahead in the rx request ring. */ RING_IDX rx_req_cons_peek; @@ -217,4 +219,10 @@ static inline int netbk_can_sg(struct ne return netif->features & NETIF_F_SG; } +static inline int netbk_frontend_connected(struct net_device *dev) +{ + netif_t *netif = netdev_priv(dev); + return !!netif->frontend_connected; +} + #endif /* __NETIF__BACKEND__COMMON_H__ */ --- linux-2.6.18-xen.hg.orig/drivers/xen/netback/interface.c +++ linux-2.6.18-xen.hg/drivers/xen/netback/interface.c @@ -83,9 +83,13 @@ static int net_close(struct net_device * return 0; } +/* accept the max value if frontend is not yet connected */ static int netbk_change_mtu(struct net_device *dev, int mtu) { - int max = netbk_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN; + int max = 65535 - ETH_HLEN; + + if (netbk_frontend_connected(dev)) + max = netbk_can_sg(dev) ? max : ETH_DATA_LEN; if (mtu > max) return -EINVAL; @@ -359,6 +363,8 @@ err_rx: void netif_disconnect(netif_t *netif) { + netif->frontend_connected = 0; + if (netback_carrier_ok(netif)) { rtnl_lock(); netback_carrier_off(netif); --- linux-2.6.18-xen.hg.orig/drivers/xen/netback/xenbus.c +++ linux-2.6.18-xen.hg/drivers/xen/netback/xenbus.c @@ -329,6 +329,13 @@ static int xen_net_read_mac(struct xenbu return 0; } +static void xen_net_adjust_mtu(netif_t *netif) +{ + if (!netif->dev->change_mtu) + return; + netif->dev->change_mtu(netif->dev, netif->dev->mtu); +} + static void connect(struct backend_info *be) { int err; @@ -338,6 +345,8 @@ static void connect(struct backend_info if (err) return; + be->netif->frontend_connected = 1; + xen_net_adjust_mtu(be->netif); err = xen_net_read_mac(dev, be->netif->fe_dev_addr); if (err) { xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename);