From patchwork Tue Apr 19 13:17:53 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ian Campbell X-Patchwork-Id: 91970 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B5331B7018 for ; Tue, 19 Apr 2011 23:18:00 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755055Ab1DSNR4 (ORCPT ); Tue, 19 Apr 2011 09:17:56 -0400 Received: from smtp.ctxuk.citrix.com ([62.200.22.115]:33679 "EHLO SMTP.EU.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755043Ab1DSNRz (ORCPT ); Tue, 19 Apr 2011 09:17:55 -0400 X-IronPort-AV: E=Sophos;i="4.64,239,1301875200"; d="scan'208";a="5374641" Received: from lonpmailmx01.citrite.net ([10.30.224.162]) by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5; 19 Apr 2011 13:17:54 +0000 Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net (10.30.224.162) with Microsoft SMTP Server id 8.3.137.0; Tue, 19 Apr 2011 14:17:54 +0100 Subject: Re: [PATCH] net: xen-netback: convert to hw_features From: Ian Campbell To: =?UTF-8?Q?Micha=C5=82_Miros=C5=82aw?= CC: "netdev@vger.kernel.org" , "xen-devel@lists.xensource.com" In-Reply-To: <20110419115612.C4ACA13909@rere.qmqm.pl> References: <20110419115612.C4ACA13909@rere.qmqm.pl> Organization: Citrix Systems, Inc. Date: Tue, 19 Apr 2011 14:17:53 +0100 Message-ID: <1303219073.5997.191.camel@zakaz.uk.xensource.com> MIME-Version: 1.0 X-Mailer: Evolution 2.32.2 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Tue, 2011-04-19 at 12:56 +0100, Michał Mirosław wrote: > Signed-off-by: Michał Mirosław Thanks for beating me to this! However the prototype for xenvif_fix_features is wrong (needs to take a net_device not a xenvif). I fixed it with the following, I also moved the !can_sg MTU clamping into a set_features hook (like we do with netfront). Am I right that this pattern copes with changes to SG via ethtool etc better? I think it's more future proof in any case. NB: I'm having some issues with my test hardware at the moment so this is reviewed by eye and compile tested only... I'm also happy for this to be folded into the original with my "Signed-off-/Acked-by Ian Campbell " if that is preferable. Cheers, Ian. 8<----------------- net: xen-netback: correct prototype of xenvif_fix_features. Also check MTU vs NETIF_F_SG in ndo_set_features hook to allow for dynamic modification. Signed-off-by: Ian Campbell --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index fe25308..61757bd 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -165,9 +165,9 @@ static int xenvif_change_mtu(struct net_device *dev, int mtu) return 0; } -static u32 xenvif_fix_features(struct xenvif *vif, u32 features) +static u32 xenvif_fix_features(struct net_device *dev, u32 features) { - struct net_device *dev = vif->dev; + struct xenvif *vif = netdev_priv(dev); if (!vif->can_sg) features &= ~NETIF_F_SG; @@ -179,6 +179,16 @@ static u32 xenvif_fix_features(struct xenvif *vif, u32 features) return features; } +static int xenvif_set_features(struct net_device *dev, u32 features) +{ + if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN) { + netdev_info(dev, "Reducing MTU because no SG offload"); + dev->mtu = ETH_DATA_LEN; + } + + return 0; +} + static const struct xenvif_stat { char name[ETH_GSTRING_LEN]; u16 offset; @@ -237,6 +247,7 @@ static struct net_device_ops xenvif_netdev_ops = { .ndo_stop = xenvif_close, .ndo_change_mtu = xenvif_change_mtu, .ndo_fix_features = xenvif_fix_features, + .ndo_set_features = xenvif_set_features, }; struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, @@ -329,8 +340,6 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref, rtnl_lock(); if (netif_running(vif->dev)) xenvif_up(vif); - if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN) - dev_set_mtu(vif->dev, ETH_DATA_LEN); netdev_update_features(vif->dev); netif_carrier_on(vif->dev); rtnl_unlock();