Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: Audit drivers to identify those needing IFF_TX_SKB_SHARING cleared

After the last patch, We are left in a state in which only drivers calling
ether_setup have IFF_TX_SKB_SHARING set (we assume that drivers touching real
hardware call ether_setup for their net_devices and don't hold any state in
their skbs. There are a handful of drivers that violate this assumption of
course, and need to be fixed up. This patch identifies those drivers, and marks
them as not being able to support the safe transmission of skbs by clearning the
IFF_TX_SKB_SHARING flag in priv_flags

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Karsten Keil <isdn@linux-pingi.de>
CC: "David S. Miller" <davem@davemloft.net>
CC: Jay Vosburgh <fubar@us.ibm.com>
CC: Andy Gospodarek <andy@greyhouse.net>
CC: Patrick McHardy <kaber@trash.net>
CC: Krzysztof Halasa <khc@pm.waw.pl>
CC: "John W. Linville" <linville@tuxdriver.com>
CC: Greg Kroah-Hartman <gregkh@suse.de>
CC: Marcel Holtmann <marcel@holtmann.org>
CC: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Neil Horman and committed by
David S. Miller
550fd08c d8873315

+22 -8
+3
drivers/isdn/i4l/isdn_net.c
··· 2532 2532 2533 2533 /* Setup the generic properties */ 2534 2534 dev->flags = IFF_NOARP|IFF_POINTOPOINT; 2535 + 2536 + /* isdn prepends a header in the tx path, can't share skbs */ 2537 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 2535 2538 dev->header_ops = NULL; 2536 2539 dev->netdev_ops = &isdn_netdev_ops; 2537 2540
+4 -2
drivers/net/bonding/bond_main.c
··· 1557 1557 1558 1558 if (slave_dev->type != ARPHRD_ETHER) 1559 1559 bond_setup_by_slave(bond_dev, slave_dev); 1560 - else 1560 + else { 1561 1561 ether_setup(bond_dev); 1562 + bond_dev->priv_flags &= ~IFF_TX_SKB_SHARING; 1563 + } 1562 1564 1563 1565 netdev_bonding_change(bond_dev, 1564 1566 NETDEV_POST_TYPE_CHANGE); ··· 4332 4330 bond_dev->tx_queue_len = 0; 4333 4331 bond_dev->flags |= IFF_MASTER|IFF_MULTICAST; 4334 4332 bond_dev->priv_flags |= IFF_BONDING; 4335 - bond_dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 4333 + bond_dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING); 4336 4334 4337 4335 /* At first, we block adding VLANs. That's the only way to 4338 4336 * prevent problems that occur when adding VLANs over an
+1 -1
drivers/net/ifb.c
··· 183 183 184 184 dev->flags |= IFF_NOARP; 185 185 dev->flags &= ~IFF_MULTICAST; 186 - dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 186 + dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING); 187 187 random_ether_addr(dev->dev_addr); 188 188 } 189 189
+1 -1
drivers/net/macvlan.c
··· 572 572 { 573 573 ether_setup(dev); 574 574 575 - dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 575 + dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING); 576 576 dev->netdev_ops = &macvlan_netdev_ops; 577 577 dev->destructor = free_netdev; 578 578 dev->header_ops = &macvlan_hard_header_ops,
+1
drivers/net/tun.c
··· 528 528 dev->netdev_ops = &tap_netdev_ops; 529 529 /* Ethernet TAP Device */ 530 530 ether_setup(dev); 531 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 531 532 532 533 random_ether_addr(dev->dev_addr); 533 534
+2
drivers/net/veth.c
··· 263 263 { 264 264 ether_setup(dev); 265 265 266 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 267 + 266 268 dev->netdev_ops = &veth_netdev_ops; 267 269 dev->ethtool_ops = &veth_ethtool_ops; 268 270 dev->features |= NETIF_F_LLTX;
+3 -2
drivers/net/wan/hdlc_fr.c
··· 1074 1074 1075 1075 used = pvc_is_used(pvc); 1076 1076 1077 - if (type == ARPHRD_ETHER) 1077 + if (type == ARPHRD_ETHER) { 1078 1078 dev = alloc_netdev(0, "pvceth%d", ether_setup); 1079 - else 1079 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 1080 + } else 1080 1081 dev = alloc_netdev(0, "pvc%d", pvc_setup); 1081 1082 1082 1083 if (!dev) {
+1
drivers/net/wireless/airo.c
··· 2823 2823 dev->wireless_data = &ai->wireless_data; 2824 2824 dev->irq = irq; 2825 2825 dev->base_addr = port; 2826 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 2826 2827 2827 2828 SET_NETDEV_DEV(dev, dmdev); 2828 2829
+1
drivers/net/wireless/hostap/hostap_main.c
··· 855 855 856 856 iface = netdev_priv(dev); 857 857 ether_setup(dev); 858 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 858 859 859 860 /* kernel callbacks */ 860 861 if (iface) {
+1
drivers/staging/ath6kl/os/linux/ar6000_drv.c
··· 6179 6179 6180 6180 ether_setup(dev); 6181 6181 init_netdev(dev, ap_ifname); 6182 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 6182 6183 6183 6184 if (register_netdev(dev)) { 6184 6185 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("ar6000_create_ap_interface: register_netdev failed\n"));
+1 -1
net/8021q/vlan_dev.c
··· 695 695 ether_setup(dev); 696 696 697 697 dev->priv_flags |= IFF_802_1Q_VLAN; 698 - dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; 698 + dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | IFF_TX_SKB_SHARING); 699 699 dev->tx_queue_len = 0; 700 700 701 701 dev->netdev_ops = &vlan_netdev_ops;
+1
net/bluetooth/bnep/netdev.c
··· 231 231 dev->addr_len = ETH_ALEN; 232 232 233 233 ether_setup(dev); 234 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 234 235 dev->netdev_ops = &bnep_netdev_ops; 235 236 236 237 dev->watchdog_timeo = HZ * 2;
+1 -1
net/l2tp/l2tp_eth.c
··· 103 103 static void l2tp_eth_dev_setup(struct net_device *dev) 104 104 { 105 105 ether_setup(dev); 106 - 106 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 107 107 dev->netdev_ops = &l2tp_eth_netdev_ops; 108 108 dev->destructor = free_netdev; 109 109 }
+1
net/mac80211/iface.c
··· 698 698 static void ieee80211_if_setup(struct net_device *dev) 699 699 { 700 700 ether_setup(dev); 701 + dev->priv_flags &= ~IFF_TX_SKB_SHARING; 701 702 dev->netdev_ops = &ieee80211_dataif_ops; 702 703 dev->destructor = free_netdev; 703 704 }