Re: patch net-share-correct-feature-code-between-bridging-and-bonding.patch queued to -stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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, [email protected] <[email protected]> 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 [email protected]  Tue Aug 21 14:12:37 2007
> From: Herbert Xu <[email protected]>
> Date: Tue, 21 Aug 2007 14:22:55 +0800
> Subject: NET: Share correct feature code between bridging and bonding
> To: David Miller <[email protected]>
> Cc: [email protected], [email protected]
> Message-ID: <[email protected]>
> 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 <[email protected]>
> Acked-by: David S. Miller <[email protected]>
> Signed-off-by: Greg Kroah-Hartman <[email protected]>
>
> --- 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
> [email protected]
> http://linux.kernel.org/mailman/listinfo/stable
>
>
>
> Patches currently in stable-queue which might be from
> [email protected] 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 [email protected]
> 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux