Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757976AbXHUV66 (ORCPT ); Tue, 21 Aug 2007 17:58:58 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754320AbXHUV6p (ORCPT ); Tue, 21 Aug 2007 17:58:45 -0400 Received: from nz-out-0506.google.com ([64.233.162.229]:36855 "EHLO nz-out-0506.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756099AbXHUV6n (ORCPT ); Tue, 21 Aug 2007 17:58:43 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=hMCQS7bEMmrgVa+7ZKDyk8QdHV0moSUBDT9k6KoXSpQYMwXVAwniNLqxFH5LBOM6m+sKErQhwhuSBL1JK34KlyLq3aIVQcC2EdBdM8HEMsff4Nomd9XR4JfcFKzI3Y1u+isbrNI0ge+3ERI8HBms44vR2q05TpErBGqP08Uh80g= Message-ID: <6101e8c40708211458y99dd660q2bf97165c7550aa3@mail.gmail.com> Date: Tue, 21 Aug 2007 23:58:41 +0200 From: "Oliver Pinter" To: linux-kernel@vger.kernel.org Subject: Re: patch net-share-correct-feature-code-between-bridging-and-bonding.patch queued to -stable tree Cc: herbert@gondor.apana.org.au, davem@davemloft.net, gregkh@suse.de, stable-commits@vger.kernel.org In-Reply-To: <20070821212119.478E814540CF@imap.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <20070821062255.GA21799@gondor.apana.org.au> <20070821212119.478E814540CF@imap.suse.de> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8900 Lines: 259 Hi Greg! this patches are queue for 2.6.22.5-rc2 or for 2.6.22.6-rc1? thaks, Oliver On 8/21/07, gregkh@suse.de wrote: > > This is a note to let you know that we have just queued up the patch titled > > Subject: NET: Share correct feature code between bridging and bonding > > to the 2.6.22-stable tree. Its filename is > > net-share-correct-feature-code-between-bridging-and-bonding.patch > > A git repo of this tree can be found at > > http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary > > > From herbert@gondor.apana.org.au Tue Aug 21 14:12:37 2007 > From: Herbert Xu > Date: Tue, 21 Aug 2007 14:22:55 +0800 > Subject: NET: Share correct feature code between bridging and bonding > To: David Miller > Cc: netdev@vger.kernel.org, stable@kernel.org > Message-ID: <20070821062255.GA21799@gondor.apana.org.au> > Content-Disposition: inline > > [NET]: Share correct feature code between bridging and bonding > > http://bugzilla.kernel.org/show_bug.cgi?id=8797 shows that the > bonding driver may produce bogus combinations of the checksum > flags and SG/TSO. > > For example, if you bond devices with NETIF_F_HW_CSUM and > NETIF_F_IP_CSUM you'll end up with a bonding device that > has neither flag set. If both have TSO then this produces > an illegal combination. > > The bridge device on the other hand has the correct code to > deal with this. > > In fact, the same code can be used for both. So this patch > moves that logic into net/core/dev.c and uses it for both > bonding and bridging. > > In the process I've made small adjustments such as only > setting GSO_ROBUST if at least one constituent device > supports it. > > Signed-off-by: Herbert Xu > Acked-by: David S. Miller > Signed-off-by: Greg Kroah-Hartman > > --- a/drivers/net/bonding/bond_main.c > +++ b/drivers/net/bonding/bond_main.c > @@ -1233,43 +1233,31 @@ int bond_sethwaddr(struct net_device *bond_dev, > struct net_device *slave_dev) > return 0; > } > > -#define BOND_INTERSECT_FEATURES \ > - (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_TSO | NETIF_F_UFO) > +#define BOND_VLAN_FEATURES \ > + (NETIF_F_VLAN_CHALLENGED | NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX | \ > + NETIF_F_HW_VLAN_FILTER) > > /* > * Compute the common dev->feature set available to all slaves. Some > - * feature bits are managed elsewhere, so preserve feature bits set on > - * master device that are not part of the examined set. > + * feature bits are managed elsewhere, so preserve those feature bits > + * on the master device. > */ > static int bond_compute_features(struct bonding *bond) > { > - unsigned long features = BOND_INTERSECT_FEATURES; > struct slave *slave; > struct net_device *bond_dev = bond->dev; > + unsigned long features = bond_dev->features & ~BOND_VLAN_FEATURES; > unsigned short max_hard_header_len = ETH_HLEN; > int i; > > bond_for_each_slave(bond, slave, i) { > - features &= (slave->dev->features & BOND_INTERSECT_FEATURES); > + features = netdev_compute_features(features, > + slave->dev->features); > if (slave->dev->hard_header_len > max_hard_header_len) > max_hard_header_len = slave->dev->hard_header_len; > } > > - if ((features & NETIF_F_SG) && > - !(features & NETIF_F_ALL_CSUM)) > - features &= ~NETIF_F_SG; > - > - /* > - * features will include NETIF_F_TSO (NETIF_F_UFO) iff all > - * slave devices support NETIF_F_TSO (NETIF_F_UFO), which > - * implies that all slaves also support scatter-gather > - * (NETIF_F_SG), which implies that features also includes > - * NETIF_F_SG. So no need to check whether we have an > - * illegal combination of NETIF_F_{TSO,UFO} and > - * !NETIF_F_SG > - */ > - > - features |= (bond_dev->features & ~BOND_INTERSECT_FEATURES); > + features |= (bond_dev->features & BOND_VLAN_FEATURES); > bond_dev->features = features; > bond_dev->hard_header_len = max_hard_header_len; > > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index 3a70f55..ab210be 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -1032,6 +1032,8 @@ extern void dev_seq_stop(struct seq_file *seq, void > *v); > > extern void linkwatch_run_queue(void); > > +extern int netdev_compute_features(unsigned long all, unsigned long one); > + > static inline int net_gso_ok(int features, int gso_type) > { > int feature = gso_type << NETIF_F_GSO_SHIFT; > diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c > index 5e1892d..c326602 100644 > --- a/net/bridge/br_device.c > +++ b/net/bridge/br_device.c > @@ -179,5 +179,6 @@ void br_dev_setup(struct net_device *dev) > dev->priv_flags = IFF_EBRIDGE; > > dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | > - NETIF_F_TSO | NETIF_F_NO_CSUM | NETIF_F_GSO_ROBUST; > + NETIF_F_GSO_SOFTWARE | NETIF_F_NO_CSUM | > + NETIF_F_GSO_ROBUST | NETIF_F_LLTX; > } > diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c > index 849deaf..fefd7c1 100644 > --- a/net/bridge/br_if.c > +++ b/net/bridge/br_if.c > @@ -360,35 +360,15 @@ int br_min_mtu(const struct net_bridge *br) > void br_features_recompute(struct net_bridge *br) > { > struct net_bridge_port *p; > - unsigned long features, checksum; > + unsigned long features; > > - checksum = br->feature_mask & NETIF_F_ALL_CSUM ? NETIF_F_NO_CSUM : 0; > - features = br->feature_mask & ~NETIF_F_ALL_CSUM; > + features = br->feature_mask; > > list_for_each_entry(p, &br->port_list, list) { > - unsigned long feature = p->dev->features; > - > - if (checksum & NETIF_F_NO_CSUM && !(feature & NETIF_F_NO_CSUM)) > - checksum ^= NETIF_F_NO_CSUM | NETIF_F_HW_CSUM; > - if (checksum & NETIF_F_HW_CSUM && !(feature & NETIF_F_HW_CSUM)) > - checksum ^= NETIF_F_HW_CSUM | NETIF_F_IP_CSUM; > - if (!(feature & NETIF_F_IP_CSUM)) > - checksum = 0; > - > - if (feature & NETIF_F_GSO) > - feature |= NETIF_F_GSO_SOFTWARE; > - feature |= NETIF_F_GSO; > - > - features &= feature; > + features = netdev_compute_features(features, p->dev->features); > } > > - if (!(checksum & NETIF_F_ALL_CSUM)) > - features &= ~NETIF_F_SG; > - if (!(features & NETIF_F_SG)) > - features &= ~NETIF_F_GSO_MASK; > - > - br->dev->features = features | checksum | NETIF_F_LLTX | > - NETIF_F_GSO_ROBUST; > + br->dev->features = features; > } > > /* called with RTNL */ > diff --git a/net/core/dev.c b/net/core/dev.c > index ee051bb..1561f61 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -3635,6 +3635,44 @@ static int __init netdev_dma_register(void) > static int __init netdev_dma_register(void) { return -ENODEV; } > #endif /* CONFIG_NET_DMA */ > > +/** > + * netdev_compute_feature - compute conjunction of two feature sets > + * @all: first feature set > + * @one: second feature set > + * > + * Computes a new feature set after adding a device with feature set > + * @one to the master device with current feature set @all. Returns > + * the new feature set. > + */ > +int netdev_compute_features(unsigned long all, unsigned long one) > +{ > + /* if device needs checksumming, downgrade to hw checksumming */ > + if (all & NETIF_F_NO_CSUM && !(one & NETIF_F_NO_CSUM)) > + all ^= NETIF_F_NO_CSUM | NETIF_F_HW_CSUM; > + > + /* if device can't do all checksum, downgrade to ipv4 */ > + if (all & NETIF_F_HW_CSUM && !(one & NETIF_F_HW_CSUM)) > + all ^= NETIF_F_HW_CSUM | NETIF_F_IP_CSUM; > + > + if (one & NETIF_F_GSO) > + one |= NETIF_F_GSO_SOFTWARE; > + one |= NETIF_F_GSO; > + > + /* If even one device supports robust GSO, enable it for all. */ > + if (one & NETIF_F_GSO_ROBUST) > + all |= NETIF_F_GSO_ROBUST; > + > + all &= one | NETIF_F_LLTX; > + > + if (!(all & NETIF_F_ALL_CSUM)) > + all &= ~NETIF_F_SG; > + if (!(all & NETIF_F_SG)) > + all &= ~NETIF_F_GSO_MASK; > + > + return all; > +} > +EXPORT_SYMBOL(netdev_compute_features); > + > /* > * Initialize the DEV module. At boot time this walks the device list and > * unhooks any devices that fail to initialise (normally hardware not > > _______________________________________________ > stable mailing list > stable@linux.kernel.org > http://linux.kernel.org/mailman/listinfo/stable > > > > Patches currently in stable-queue which might be from > herbert@gondor.apana.org.au are > > queue-2.6.22/net-share-correct-feature-code-between-bridging-and-bonding.patch > - > To unsubscribe from this list: send the line "unsubscribe stable-commits" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Thanks, Oliver - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/