History

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking fixes from David Miller: 1) Fill in ethtool link parameters for all link types in cxgb4, from Hariprasad Shenai. 2) Fix probe regressions in stmmac driver, from Huacai Chen. 3) Network namespace leaks on errirs in rtnetlink, from Nicolas Dichtel. 4) Remove erroneous BUG check which can actually trigger legitimately, in xen-netfront. From Seth Forshee. 5) Validate length of IFLA_BOND_ARP_IP_TARGET netlink attributes, from Thomas Grag. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: cxgb4: Fill in supported link mode for SFP modules xen-netfront: Remove BUGs on paged skb data which crosses a page boundary sh_eth: Fix sleeping function called from invalid context stmmac: platform: Move plat_dat checking earlier sh_eth: Fix skb alloc size and alignment adjust rule. rtnetlink: release net refcnt on error in do_setlink() bond: Check length of IFLA_BOND_ARP_IP_TARGET attributes

Linus Torvalds committed 11 years ago

Commit 9044f942 parents 23c836c 4c2d5187 files · +73 −67Browse files

Unified · Split

7 files
  1. drivers/net/bonding/bond_netlink.c +6 −1
  2. drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +6 −2
  3. drivers/net/ethernet/renesas/sh_eth.c +48 −48
  4. drivers/net/ethernet/renesas/sh_eth.h +3 −2
  5. drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +9 −9
  6. drivers/net/xen-netfront.c +0 −5
  7. net/core/rtnetlink.c +1 −0
drivers/net/bonding/bond_netlink.c+6−1
@@ -225,7 +225,12 @@ static int bond_changelink(struct net_device *bond_dev, · 224 unmodified lines
225225
226226 bond_option_arp_ip_targets_clear(bond);
227227 nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) {
228− __be32 target = nla_get_be32(attr);
228+ __be32 target;
229+
230+ if (nla_len(attr) < sizeof(target))
231+ return -EINVAL;
232+
233+ target = nla_get_be32(attr);
229234
230235 bond_opt_initval(&newval, (__force u64)target);
231236 err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS,
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c+6−2
@@ -2442,9 +2442,13 @@ static unsigned int from_fw_linkcaps(unsigned int type, unsigned int caps) · 2441 unmodified lines
24422442 SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full |
24432443 SUPPORTED_10000baseKX4_Full;
24442444 else if (type == FW_PORT_TYPE_FIBER_XFI ||
2445− type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP)
2445+ type == FW_PORT_TYPE_FIBER_XAUI || type == FW_PORT_TYPE_SFP) {
24462446 v |= SUPPORTED_FIBRE;
2447− else if (type == FW_PORT_TYPE_BP40_BA)
2447+ if (caps & FW_PORT_CAP_SPEED_1G)
2448+ v |= SUPPORTED_1000baseT_Full;
2449+ if (caps & FW_PORT_CAP_SPEED_10G)
2450+ v |= SUPPORTED_10000baseT_Full;
2451+ } else if (type == FW_PORT_TYPE_BP40_BA)
24482452 v |= SUPPORTED_40000baseSR4_Full;
24492453
24502454 if (caps & FW_PORT_CAP_ANEG)
drivers/net/ethernet/renesas/sh_eth.c+48−48
@@ -917,21 +917,13 @@ static int sh_eth_reset(struct net_device *ndev) · 916 unmodified lines
917917 return ret;
918918 }
919919
920−#if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
921920 static void sh_eth_set_receive_align(struct sk_buff *skb)
922921 {
923− int reserve;
922+ uintptr_t reserve = (uintptr_t)skb->data & (SH_ETH_RX_ALIGN - 1);
924923
925− reserve = SH4_SKB_RX_ALIGN - ((u32)skb->data & (SH4_SKB_RX_ALIGN - 1));
926924 if (reserve)
927− skb_reserve(skb, reserve);
925+ skb_reserve(skb, SH_ETH_RX_ALIGN - reserve);
928926 }
929−#else
930−static void sh_eth_set_receive_align(struct sk_buff *skb)
931−{
932− skb_reserve(skb, SH2_SH3_SKB_RX_ALIGN);
933−}
934−#endif
935927
936928
937929 /* CPU <-> EDMAC endian convert */
@@ -1119,6 +1111,7 @@ static void sh_eth_ring_format(struct net_device *ndev) · 181 unmodified lines
11191111 struct sh_eth_txdesc *txdesc = NULL;
11201112 int rx_ringsize = sizeof(*rxdesc) * mdp->num_rx_ring;
11211113 int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring;
1114+ int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1;
11221115
11231116 mdp->cur_rx = 0;
11241117 mdp->cur_tx = 0;
@@ -1131,21 +1124,21 @@ static void sh_eth_ring_format(struct net_device *ndev) · 6 unmodified lines
11311124 for (i = 0; i < mdp->num_rx_ring; i++) {
11321125 /* skb */
11331126 mdp->rx_skbuff[i] = NULL;
1134− skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz);
1127+ skb = netdev_alloc_skb(ndev, skbuff_size);
11351128 mdp->rx_skbuff[i] = skb;
11361129 if (skb == NULL)
11371130 break;
1138− dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
1139− DMA_FROM_DEVICE);
11401131 sh_eth_set_receive_align(skb);
11411132
11421133 /* RX descriptor */
11431134 rxdesc = &mdp->rx_ring[i];
1135+ /* The size of the buffer is a multiple of 16 bytes. */
1136+ rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
1137+ dma_map_single(&ndev->dev, skb->data, rxdesc->buffer_length,
1138+ DMA_FROM_DEVICE);
11441139 rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4));
11451140 rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP);
11461141
1147− /* The size of the buffer is 16 byte boundary. */
1148− rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
11491142 /* Rx descriptor address set */
11501143 if (i == 0) {
11511144 sh_eth_write(ndev, mdp->rx_desc_dma, RDLAR);
@@ -1397,6 +1390,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) · 245 unmodified lines
13971390 struct sk_buff *skb;
13981391 u16 pkt_len = 0;
13991392 u32 desc_status;
1393+ int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN - 1;
14001394
14011395 rxdesc = &mdp->rx_ring[entry];
14021396 while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) {
@@ -1448,7 +1442,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) · 45 unmodified lines
14481442 if (mdp->cd->rpadir)
14491443 skb_reserve(skb, NET_IP_ALIGN);
14501444 dma_sync_single_for_cpu(&ndev->dev, rxdesc->addr,
1451− mdp->rx_buf_sz,
1445+ ALIGN(mdp->rx_buf_sz, 16),
14521446 DMA_FROM_DEVICE);
14531447 skb_put(skb, pkt_len);
14541448 skb->protocol = eth_type_trans(skb, ndev);
@@ -1468,13 +1462,13 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) · 13 unmodified lines
14681462 rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 16);
14691463
14701464 if (mdp->rx_skbuff[entry] == NULL) {
1471− skb = netdev_alloc_skb(ndev, mdp->rx_buf_sz);
1465+ skb = netdev_alloc_skb(ndev, skbuff_size);
14721466 mdp->rx_skbuff[entry] = skb;
14731467 if (skb == NULL)
14741468 break; /* Better luck next round. */
1475− dma_map_single(&ndev->dev, skb->data, mdp->rx_buf_sz,
1476− DMA_FROM_DEVICE);
14771469 sh_eth_set_receive_align(skb);
1470+ dma_map_single(&ndev->dev, skb->data,
1471+ rxdesc->buffer_length, DMA_FROM_DEVICE);
14781472
14791473 skb_checksum_none_assert(skb);
14801474 rxdesc->addr = virt_to_phys(PTR_ALIGN(skb->data, 4));
@@ -2042,6 +2036,8 @@ static int sh_eth_open(struct net_device *ndev) · 561 unmodified lines
20422036 if (ret)
20432037 goto out_free_irq;
20442038
2039+ mdp->is_opened = 1;
2040+
20452041 return ret;
20462042
20472043 out_free_irq:
@@ -2131,6 +2127,36 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) · 83 unmodified lines
21312127 return NETDEV_TX_OK;
21322128 }
21332129
2130+static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev)
2131+{
2132+ struct sh_eth_private *mdp = netdev_priv(ndev);
2133+
2134+ if (sh_eth_is_rz_fast_ether(mdp))
2135+ return &ndev->stats;
2136+
2137+ if (!mdp->is_opened)
2138+ return &ndev->stats;
2139+
2140+ ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR);
2141+ sh_eth_write(ndev, 0, TROCR); /* (write clear) */
2142+ ndev->stats.collisions += sh_eth_read(ndev, CDCR);
2143+ sh_eth_write(ndev, 0, CDCR); /* (write clear) */
2144+ ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
2145+ sh_eth_write(ndev, 0, LCCR); /* (write clear) */
2146+
2147+ if (sh_eth_is_gether(mdp)) {
2148+ ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
2149+ sh_eth_write(ndev, 0, CERCR); /* (write clear) */
2150+ ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
2151+ sh_eth_write(ndev, 0, CEECR); /* (write clear) */
2152+ } else {
2153+ ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
2154+ sh_eth_write(ndev, 0, CNDCR); /* (write clear) */
2155+ }
2156+
2157+ return &ndev->stats;
2158+}
2159+
21342160 /* device close function */
21352161 static int sh_eth_close(struct net_device *ndev)
21362162 {
@@ -2145,6 +2171,7 @@ static int sh_eth_close(struct net_device *ndev) · 8 unmodified lines
21452171 sh_eth_write(ndev, 0, EDTRR);
21462172 sh_eth_write(ndev, 0, EDRRR);
21472173
2174+ sh_eth_get_stats(ndev);
21482175 /* PHY Disconnect */
21492176 if (mdp->phydev) {
21502177 phy_stop(mdp->phydev);
@@ -2163,36 +2190,9 @@ static int sh_eth_close(struct net_device *ndev) · 12 unmodified lines
21632190
21642191 pm_runtime_put_sync(&mdp->pdev->dev);
21652192
2166− return 0;
2167−}
2168−
2169−static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev)
2170−{
2171− struct sh_eth_private *mdp = netdev_priv(ndev);
2172−
2173− if (sh_eth_is_rz_fast_ether(mdp))
2174− return &ndev->stats;
2193+ mdp->is_opened = 0;
21752194
2176− pm_runtime_get_sync(&mdp->pdev->dev);
2177−
2178− ndev->stats.tx_dropped += sh_eth_read(ndev, TROCR);
2179− sh_eth_write(ndev, 0, TROCR); /* (write clear) */
2180− ndev->stats.collisions += sh_eth_read(ndev, CDCR);
2181− sh_eth_write(ndev, 0, CDCR); /* (write clear) */
2182− ndev->stats.tx_carrier_errors += sh_eth_read(ndev, LCCR);
2183− sh_eth_write(ndev, 0, LCCR); /* (write clear) */
2184− if (sh_eth_is_gether(mdp)) {
2185− ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CERCR);
2186− sh_eth_write(ndev, 0, CERCR); /* (write clear) */
2187− ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CEECR);
2188− sh_eth_write(ndev, 0, CEECR); /* (write clear) */
2189− } else {
2190− ndev->stats.tx_carrier_errors += sh_eth_read(ndev, CNDCR);
2191− sh_eth_write(ndev, 0, CNDCR); /* (write clear) */
2192− }
2193− pm_runtime_put_sync(&mdp->pdev->dev);
2194−
2195− return &ndev->stats;
2195+ return 0;
21962196 }
21972197
21982198 /* ioctl to device function */
drivers/net/ethernet/renesas/sh_eth.h+3−2
@@ -162,9 +162,9 @@ enum { · 161 unmodified lines
162162
163163 /* Driver's parameters */
164164 #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE)
165−#define SH4_SKB_RX_ALIGN 32
165+#define SH_ETH_RX_ALIGN 32
166166 #else
167−#define SH2_SH3_SKB_RX_ALIGN 2
167+#define SH_ETH_RX_ALIGN 2
168168 #endif
169169
170170 /* Register's bits
@@ -522,6 +522,7 @@ struct sh_eth_private { · 351 unmodified lines
522522
523523 unsigned no_ether_link:1;
524524 unsigned ether_link_active_low:1;
525+ unsigned is_opened:1;
525526 };
526527
527528 static inline void sh_eth_soft_swap(char *src, int len)
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c+9−9
@@ -265,6 +265,15 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) · 264 unmodified lines
265265
266266 plat_dat = dev_get_platdata(&pdev->dev);
267267
268+ if (!plat_dat)
269+ plat_dat = devm_kzalloc(&pdev->dev,
270+ sizeof(struct plat_stmmacenet_data),
271+ GFP_KERNEL);
272+ if (!plat_dat) {
273+ pr_err("%s: ERROR: no memory", __func__);
274+ return -ENOMEM;
275+ }
276+
268277 /* Set default value for multicast hash bins */
269278 plat_dat->multicast_filter_bins = HASH_TABLE_SIZE;
270279
@@ -272,15 +281,6 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) · 1 unmodified line
272281 plat_dat->unicast_filter_entries = 1;
273282
274283 if (pdev->dev.of_node) {
275− if (!plat_dat)
276− plat_dat = devm_kzalloc(&pdev->dev,
277− sizeof(struct plat_stmmacenet_data),
278− GFP_KERNEL);
279− if (!plat_dat) {
280− pr_err("%s: ERROR: no memory", __func__);
281− return -ENOMEM;
282− }
283−
284284 ret = stmmac_probe_config_dt(pdev, plat_dat, &mac);
285285 if (ret) {
286286 pr_err("%s: main dt probe failed", __func__);
drivers/net/xen-netfront.c+0−5
@@ -496,9 +496,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue, · 495 unmodified lines
496496 len = skb_frag_size(frag);
497497 offset = frag->page_offset;
498498
499− /* Data must not cross a page boundary. */
500− BUG_ON(len + offset > PAGE_SIZE<<compound_order(page));
501−
502499 /* Skip unused frames from start of page */
503500 page += offset >> PAGE_SHIFT;
504501 offset &= ~PAGE_MASK;
@@ -506,8 +503,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct netfront_queue *queue, · 1 unmodified line
506503 while (len > 0) {
507504 unsigned long bytes;
508505
509− BUG_ON(offset >= PAGE_SIZE);
510−
511506 bytes = PAGE_SIZE - offset;
512507 if (bytes > len)
513508 bytes = len;
net/core/rtnetlink.c+1−0
@@ -1498,6 +1498,7 @@ static int do_setlink(const struct sk_buff *skb, · 1497 unmodified lines
14981498 goto errout;
14991499 }
15001500 if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) {
1501+ put_net(net);
15011502 err = -EPERM;
15021503 goto errout;
15031504 }