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

From: Oliver Pinter
Date: Tue Aug 21 2007 - 17:58:59 EST


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