diff options
38 files changed, 192 insertions, 115 deletions
diff --git a/Documentation/devicetree/bindings/net/dsa/b53.txt b/Documentation/devicetree/bindings/net/dsa/b53.txt index 8acf51a4dfa8..47a6a7fe0b86 100644 --- a/Documentation/devicetree/bindings/net/dsa/b53.txt +++ b/Documentation/devicetree/bindings/net/dsa/b53.txt | |||
| @@ -10,6 +10,7 @@ Required properties: | |||
| 10 | "brcm,bcm53128" | 10 | "brcm,bcm53128" |
| 11 | "brcm,bcm5365" | 11 | "brcm,bcm5365" |
| 12 | "brcm,bcm5395" | 12 | "brcm,bcm5395" |
| 13 | "brcm,bcm5389" | ||
| 13 | "brcm,bcm5397" | 14 | "brcm,bcm5397" |
| 14 | "brcm,bcm5398" | 15 | "brcm,bcm5398" |
| 15 | 16 | ||
diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c index 9c9a22958717..a8d2eb0ceb8d 100644 --- a/drivers/atm/zatm.c +++ b/drivers/atm/zatm.c | |||
| @@ -1151,8 +1151,8 @@ static void eprom_get_byte(struct zatm_dev *zatm_dev, unsigned char *byte, | |||
| 1151 | } | 1151 | } |
| 1152 | 1152 | ||
| 1153 | 1153 | ||
| 1154 | static unsigned char eprom_try_esi(struct atm_dev *dev, unsigned short cmd, | 1154 | static int eprom_try_esi(struct atm_dev *dev, unsigned short cmd, int offset, |
| 1155 | int offset, int swap) | 1155 | int swap) |
| 1156 | { | 1156 | { |
| 1157 | unsigned char buf[ZEPROM_SIZE]; | 1157 | unsigned char buf[ZEPROM_SIZE]; |
| 1158 | struct zatm_dev *zatm_dev; | 1158 | struct zatm_dev *zatm_dev; |
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 78616787f2a3..3da5fca77cbd 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c | |||
| @@ -1712,6 +1712,18 @@ static const struct b53_chip_data b53_switch_chips[] = { | |||
| 1712 | .duplex_reg = B53_DUPLEX_STAT_FE, | 1712 | .duplex_reg = B53_DUPLEX_STAT_FE, |
| 1713 | }, | 1713 | }, |
| 1714 | { | 1714 | { |
| 1715 | .chip_id = BCM5389_DEVICE_ID, | ||
| 1716 | .dev_name = "BCM5389", | ||
| 1717 | .vlans = 4096, | ||
| 1718 | .enabled_ports = 0x1f, | ||
| 1719 | .arl_entries = 4, | ||
| 1720 | .cpu_port = B53_CPU_PORT, | ||
| 1721 | .vta_regs = B53_VTA_REGS, | ||
| 1722 | .duplex_reg = B53_DUPLEX_STAT_GE, | ||
| 1723 | .jumbo_pm_reg = B53_JUMBO_PORT_MASK, | ||
| 1724 | .jumbo_size_reg = B53_JUMBO_MAX_SIZE, | ||
| 1725 | }, | ||
| 1726 | { | ||
| 1715 | .chip_id = BCM5395_DEVICE_ID, | 1727 | .chip_id = BCM5395_DEVICE_ID, |
| 1716 | .dev_name = "BCM5395", | 1728 | .dev_name = "BCM5395", |
| 1717 | .vlans = 4096, | 1729 | .vlans = 4096, |
| @@ -2034,6 +2046,7 @@ int b53_switch_detect(struct b53_device *dev) | |||
| 2034 | else | 2046 | else |
| 2035 | dev->chip_id = BCM5365_DEVICE_ID; | 2047 | dev->chip_id = BCM5365_DEVICE_ID; |
| 2036 | break; | 2048 | break; |
| 2049 | case BCM5389_DEVICE_ID: | ||
| 2037 | case BCM5395_DEVICE_ID: | 2050 | case BCM5395_DEVICE_ID: |
| 2038 | case BCM5397_DEVICE_ID: | 2051 | case BCM5397_DEVICE_ID: |
| 2039 | case BCM5398_DEVICE_ID: | 2052 | case BCM5398_DEVICE_ID: |
diff --git a/drivers/net/dsa/b53/b53_mdio.c b/drivers/net/dsa/b53/b53_mdio.c index fa7556f5d4fb..a533a90e3904 100644 --- a/drivers/net/dsa/b53/b53_mdio.c +++ b/drivers/net/dsa/b53/b53_mdio.c | |||
| @@ -285,6 +285,7 @@ static const struct b53_io_ops b53_mdio_ops = { | |||
| 285 | #define B53_BRCM_OUI_1 0x0143bc00 | 285 | #define B53_BRCM_OUI_1 0x0143bc00 |
| 286 | #define B53_BRCM_OUI_2 0x03625c00 | 286 | #define B53_BRCM_OUI_2 0x03625c00 |
| 287 | #define B53_BRCM_OUI_3 0x00406000 | 287 | #define B53_BRCM_OUI_3 0x00406000 |
| 288 | #define B53_BRCM_OUI_4 0x01410c00 | ||
| 288 | 289 | ||
| 289 | static int b53_mdio_probe(struct mdio_device *mdiodev) | 290 | static int b53_mdio_probe(struct mdio_device *mdiodev) |
| 290 | { | 291 | { |
| @@ -311,7 +312,8 @@ static int b53_mdio_probe(struct mdio_device *mdiodev) | |||
| 311 | */ | 312 | */ |
| 312 | if ((phy_id & 0xfffffc00) != B53_BRCM_OUI_1 && | 313 | if ((phy_id & 0xfffffc00) != B53_BRCM_OUI_1 && |
| 313 | (phy_id & 0xfffffc00) != B53_BRCM_OUI_2 && | 314 | (phy_id & 0xfffffc00) != B53_BRCM_OUI_2 && |
| 314 | (phy_id & 0xfffffc00) != B53_BRCM_OUI_3) { | 315 | (phy_id & 0xfffffc00) != B53_BRCM_OUI_3 && |
| 316 | (phy_id & 0xfffffc00) != B53_BRCM_OUI_4) { | ||
| 315 | dev_err(&mdiodev->dev, "Unsupported device: 0x%08x\n", phy_id); | 317 | dev_err(&mdiodev->dev, "Unsupported device: 0x%08x\n", phy_id); |
| 316 | return -ENODEV; | 318 | return -ENODEV; |
| 317 | } | 319 | } |
| @@ -360,6 +362,7 @@ static const struct of_device_id b53_of_match[] = { | |||
| 360 | { .compatible = "brcm,bcm53125" }, | 362 | { .compatible = "brcm,bcm53125" }, |
| 361 | { .compatible = "brcm,bcm53128" }, | 363 | { .compatible = "brcm,bcm53128" }, |
| 362 | { .compatible = "brcm,bcm5365" }, | 364 | { .compatible = "brcm,bcm5365" }, |
| 365 | { .compatible = "brcm,bcm5389" }, | ||
| 363 | { .compatible = "brcm,bcm5395" }, | 366 | { .compatible = "brcm,bcm5395" }, |
| 364 | { .compatible = "brcm,bcm5397" }, | 367 | { .compatible = "brcm,bcm5397" }, |
| 365 | { .compatible = "brcm,bcm5398" }, | 368 | { .compatible = "brcm,bcm5398" }, |
diff --git a/drivers/net/dsa/b53/b53_priv.h b/drivers/net/dsa/b53/b53_priv.h index 1187ebd79287..3b57f47d0e79 100644 --- a/drivers/net/dsa/b53/b53_priv.h +++ b/drivers/net/dsa/b53/b53_priv.h | |||
| @@ -48,6 +48,7 @@ struct b53_io_ops { | |||
| 48 | enum { | 48 | enum { |
| 49 | BCM5325_DEVICE_ID = 0x25, | 49 | BCM5325_DEVICE_ID = 0x25, |
| 50 | BCM5365_DEVICE_ID = 0x65, | 50 | BCM5365_DEVICE_ID = 0x65, |
| 51 | BCM5389_DEVICE_ID = 0x89, | ||
| 51 | BCM5395_DEVICE_ID = 0x95, | 52 | BCM5395_DEVICE_ID = 0x95, |
| 52 | BCM5397_DEVICE_ID = 0x97, | 53 | BCM5397_DEVICE_ID = 0x97, |
| 53 | BCM5398_DEVICE_ID = 0x98, | 54 | BCM5398_DEVICE_ID = 0x98, |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index c697e79e491e..8f755009ff38 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -3309,7 +3309,9 @@ void be_detect_error(struct be_adapter *adapter) | |||
| 3309 | if ((val & POST_STAGE_FAT_LOG_START) | 3309 | if ((val & POST_STAGE_FAT_LOG_START) |
| 3310 | != POST_STAGE_FAT_LOG_START && | 3310 | != POST_STAGE_FAT_LOG_START && |
| 3311 | (val & POST_STAGE_ARMFW_UE) | 3311 | (val & POST_STAGE_ARMFW_UE) |
| 3312 | != POST_STAGE_ARMFW_UE) | 3312 | != POST_STAGE_ARMFW_UE && |
| 3313 | (val & POST_STAGE_RECOVERABLE_ERR) | ||
| 3314 | != POST_STAGE_RECOVERABLE_ERR) | ||
| 3313 | return; | 3315 | return; |
| 3314 | } | 3316 | } |
| 3315 | 3317 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index afadba99f7b8..2ecd55856c50 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -9054,7 +9054,6 @@ static int parse_tc_actions(struct ixgbe_adapter *adapter, | |||
| 9054 | { | 9054 | { |
| 9055 | const struct tc_action *a; | 9055 | const struct tc_action *a; |
| 9056 | LIST_HEAD(actions); | 9056 | LIST_HEAD(actions); |
| 9057 | int err; | ||
| 9058 | 9057 | ||
| 9059 | if (!tcf_exts_has_actions(exts)) | 9058 | if (!tcf_exts_has_actions(exts)) |
| 9060 | return -EINVAL; | 9059 | return -EINVAL; |
| @@ -9075,11 +9074,11 @@ static int parse_tc_actions(struct ixgbe_adapter *adapter, | |||
| 9075 | 9074 | ||
| 9076 | if (!dev) | 9075 | if (!dev) |
| 9077 | return -EINVAL; | 9076 | return -EINVAL; |
| 9078 | err = handle_redirect_action(adapter, dev->ifindex, queue, | 9077 | return handle_redirect_action(adapter, dev->ifindex, |
| 9079 | action); | 9078 | queue, action); |
| 9080 | if (err == 0) | ||
| 9081 | return err; | ||
| 9082 | } | 9079 | } |
| 9080 | |||
| 9081 | return -EINVAL; | ||
| 9083 | } | 9082 | } |
| 9084 | 9083 | ||
| 9085 | return -EINVAL; | 9084 | return -EINVAL; |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index ca38a30fbe91..adc6ab2cf429 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
| @@ -4433,6 +4433,11 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, | |||
| 4433 | NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port"); | 4433 | NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port"); |
| 4434 | return -EINVAL; | 4434 | return -EINVAL; |
| 4435 | } | 4435 | } |
| 4436 | if (is_vlan_dev(upper_dev) && | ||
| 4437 | vlan_dev_vlan_id(upper_dev) == 1) { | ||
| 4438 | NL_SET_ERR_MSG_MOD(extack, "Creating a VLAN device with VID 1 is unsupported: VLAN 1 carries untagged traffic"); | ||
| 4439 | return -EINVAL; | ||
| 4440 | } | ||
| 4436 | break; | 4441 | break; |
| 4437 | case NETDEV_CHANGEUPPER: | 4442 | case NETDEV_CHANGEUPPER: |
| 4438 | upper_dev = info->upper_dev; | 4443 | upper_dev = info->upper_dev; |
diff --git a/drivers/net/ethernet/natsemi/sonic.c b/drivers/net/ethernet/natsemi/sonic.c index 7ed08486ae23..c805dcbebd02 100644 --- a/drivers/net/ethernet/natsemi/sonic.c +++ b/drivers/net/ethernet/natsemi/sonic.c | |||
| @@ -84,7 +84,7 @@ static int sonic_open(struct net_device *dev) | |||
| 84 | for (i = 0; i < SONIC_NUM_RRS; i++) { | 84 | for (i = 0; i < SONIC_NUM_RRS; i++) { |
| 85 | dma_addr_t laddr = dma_map_single(lp->device, skb_put(lp->rx_skb[i], SONIC_RBSIZE), | 85 | dma_addr_t laddr = dma_map_single(lp->device, skb_put(lp->rx_skb[i], SONIC_RBSIZE), |
| 86 | SONIC_RBSIZE, DMA_FROM_DEVICE); | 86 | SONIC_RBSIZE, DMA_FROM_DEVICE); |
| 87 | if (!laddr) { | 87 | if (dma_mapping_error(lp->device, laddr)) { |
| 88 | while(i > 0) { /* free any that were mapped successfully */ | 88 | while(i > 0) { /* free any that were mapped successfully */ |
| 89 | i--; | 89 | i--; |
| 90 | dma_unmap_single(lp->device, lp->rx_laddr[i], SONIC_RBSIZE, DMA_FROM_DEVICE); | 90 | dma_unmap_single(lp->device, lp->rx_laddr[i], SONIC_RBSIZE, DMA_FROM_DEVICE); |
diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c index f4c0b02ddad8..59fbf74dcada 100644 --- a/drivers/net/ethernet/socionext/netsec.c +++ b/drivers/net/ethernet/socionext/netsec.c | |||
| @@ -1674,8 +1674,8 @@ static int netsec_probe(struct platform_device *pdev) | |||
| 1674 | if (ret) | 1674 | if (ret) |
| 1675 | goto unreg_napi; | 1675 | goto unreg_napi; |
| 1676 | 1676 | ||
| 1677 | if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) | 1677 | if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40))) |
| 1678 | dev_warn(&pdev->dev, "Failed to enable 64-bit DMA\n"); | 1678 | dev_warn(&pdev->dev, "Failed to set DMA mask\n"); |
| 1679 | 1679 | ||
| 1680 | ret = register_netdev(ndev); | 1680 | ret = register_netdev(ndev); |
| 1681 | if (ret) { | 1681 | if (ret) { |
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index abceea802ea1..38828ab77eb9 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c | |||
| @@ -1873,7 +1873,7 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
| 1873 | if (IS_ERR(priv->txchan)) { | 1873 | if (IS_ERR(priv->txchan)) { |
| 1874 | dev_err(&pdev->dev, "error initializing tx dma channel\n"); | 1874 | dev_err(&pdev->dev, "error initializing tx dma channel\n"); |
| 1875 | rc = PTR_ERR(priv->txchan); | 1875 | rc = PTR_ERR(priv->txchan); |
| 1876 | goto no_cpdma_chan; | 1876 | goto err_free_dma; |
| 1877 | } | 1877 | } |
| 1878 | 1878 | ||
| 1879 | priv->rxchan = cpdma_chan_create(priv->dma, EMAC_DEF_RX_CH, | 1879 | priv->rxchan = cpdma_chan_create(priv->dma, EMAC_DEF_RX_CH, |
| @@ -1881,14 +1881,14 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
| 1881 | if (IS_ERR(priv->rxchan)) { | 1881 | if (IS_ERR(priv->rxchan)) { |
| 1882 | dev_err(&pdev->dev, "error initializing rx dma channel\n"); | 1882 | dev_err(&pdev->dev, "error initializing rx dma channel\n"); |
| 1883 | rc = PTR_ERR(priv->rxchan); | 1883 | rc = PTR_ERR(priv->rxchan); |
| 1884 | goto no_cpdma_chan; | 1884 | goto err_free_txchan; |
| 1885 | } | 1885 | } |
| 1886 | 1886 | ||
| 1887 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1887 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| 1888 | if (!res) { | 1888 | if (!res) { |
| 1889 | dev_err(&pdev->dev, "error getting irq res\n"); | 1889 | dev_err(&pdev->dev, "error getting irq res\n"); |
| 1890 | rc = -ENOENT; | 1890 | rc = -ENOENT; |
| 1891 | goto no_cpdma_chan; | 1891 | goto err_free_rxchan; |
| 1892 | } | 1892 | } |
| 1893 | ndev->irq = res->start; | 1893 | ndev->irq = res->start; |
| 1894 | 1894 | ||
| @@ -1914,7 +1914,7 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
| 1914 | pm_runtime_put_noidle(&pdev->dev); | 1914 | pm_runtime_put_noidle(&pdev->dev); |
| 1915 | dev_err(&pdev->dev, "%s: failed to get_sync(%d)\n", | 1915 | dev_err(&pdev->dev, "%s: failed to get_sync(%d)\n", |
| 1916 | __func__, rc); | 1916 | __func__, rc); |
| 1917 | goto no_cpdma_chan; | 1917 | goto err_napi_del; |
| 1918 | } | 1918 | } |
| 1919 | 1919 | ||
| 1920 | /* register the network device */ | 1920 | /* register the network device */ |
| @@ -1924,7 +1924,7 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
| 1924 | dev_err(&pdev->dev, "error in register_netdev\n"); | 1924 | dev_err(&pdev->dev, "error in register_netdev\n"); |
| 1925 | rc = -ENODEV; | 1925 | rc = -ENODEV; |
| 1926 | pm_runtime_put(&pdev->dev); | 1926 | pm_runtime_put(&pdev->dev); |
| 1927 | goto no_cpdma_chan; | 1927 | goto err_napi_del; |
| 1928 | } | 1928 | } |
| 1929 | 1929 | ||
| 1930 | 1930 | ||
| @@ -1937,11 +1937,13 @@ static int davinci_emac_probe(struct platform_device *pdev) | |||
| 1937 | 1937 | ||
| 1938 | return 0; | 1938 | return 0; |
| 1939 | 1939 | ||
| 1940 | no_cpdma_chan: | 1940 | err_napi_del: |
| 1941 | if (priv->txchan) | 1941 | netif_napi_del(&priv->napi); |
| 1942 | cpdma_chan_destroy(priv->txchan); | 1942 | err_free_rxchan: |
| 1943 | if (priv->rxchan) | 1943 | cpdma_chan_destroy(priv->rxchan); |
| 1944 | cpdma_chan_destroy(priv->rxchan); | 1944 | err_free_txchan: |
| 1945 | cpdma_chan_destroy(priv->txchan); | ||
| 1946 | err_free_dma: | ||
| 1945 | cpdma_ctlr_destroy(priv->dma); | 1947 | cpdma_ctlr_destroy(priv->dma); |
| 1946 | no_pdata: | 1948 | no_pdata: |
| 1947 | if (of_phy_is_fixed_link(np)) | 1949 | if (of_phy_is_fixed_link(np)) |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 45d807796a18..23e9eb66197f 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -1650,7 +1650,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, | |||
| 1650 | else | 1650 | else |
| 1651 | *skb_xdp = 0; | 1651 | *skb_xdp = 0; |
| 1652 | 1652 | ||
| 1653 | preempt_disable(); | 1653 | local_bh_disable(); |
| 1654 | rcu_read_lock(); | 1654 | rcu_read_lock(); |
| 1655 | xdp_prog = rcu_dereference(tun->xdp_prog); | 1655 | xdp_prog = rcu_dereference(tun->xdp_prog); |
| 1656 | if (xdp_prog && !*skb_xdp) { | 1656 | if (xdp_prog && !*skb_xdp) { |
| @@ -1675,7 +1675,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, | |||
| 1675 | if (err) | 1675 | if (err) |
| 1676 | goto err_redirect; | 1676 | goto err_redirect; |
| 1677 | rcu_read_unlock(); | 1677 | rcu_read_unlock(); |
| 1678 | preempt_enable(); | 1678 | local_bh_enable(); |
| 1679 | return NULL; | 1679 | return NULL; |
| 1680 | case XDP_TX: | 1680 | case XDP_TX: |
| 1681 | get_page(alloc_frag->page); | 1681 | get_page(alloc_frag->page); |
| @@ -1684,7 +1684,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, | |||
| 1684 | goto err_redirect; | 1684 | goto err_redirect; |
| 1685 | tun_xdp_flush(tun->dev); | 1685 | tun_xdp_flush(tun->dev); |
| 1686 | rcu_read_unlock(); | 1686 | rcu_read_unlock(); |
| 1687 | preempt_enable(); | 1687 | local_bh_enable(); |
| 1688 | return NULL; | 1688 | return NULL; |
| 1689 | case XDP_PASS: | 1689 | case XDP_PASS: |
| 1690 | delta = orig_data - xdp.data; | 1690 | delta = orig_data - xdp.data; |
| @@ -1703,7 +1703,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, | |||
| 1703 | skb = build_skb(buf, buflen); | 1703 | skb = build_skb(buf, buflen); |
| 1704 | if (!skb) { | 1704 | if (!skb) { |
| 1705 | rcu_read_unlock(); | 1705 | rcu_read_unlock(); |
| 1706 | preempt_enable(); | 1706 | local_bh_enable(); |
| 1707 | return ERR_PTR(-ENOMEM); | 1707 | return ERR_PTR(-ENOMEM); |
| 1708 | } | 1708 | } |
| 1709 | 1709 | ||
| @@ -1713,7 +1713,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, | |||
| 1713 | alloc_frag->offset += buflen; | 1713 | alloc_frag->offset += buflen; |
| 1714 | 1714 | ||
| 1715 | rcu_read_unlock(); | 1715 | rcu_read_unlock(); |
| 1716 | preempt_enable(); | 1716 | local_bh_enable(); |
| 1717 | 1717 | ||
| 1718 | return skb; | 1718 | return skb; |
| 1719 | 1719 | ||
| @@ -1721,7 +1721,7 @@ err_redirect: | |||
| 1721 | put_page(alloc_frag->page); | 1721 | put_page(alloc_frag->page); |
| 1722 | err_xdp: | 1722 | err_xdp: |
| 1723 | rcu_read_unlock(); | 1723 | rcu_read_unlock(); |
| 1724 | preempt_enable(); | 1724 | local_bh_enable(); |
| 1725 | this_cpu_inc(tun->pcpu_stats->rx_dropped); | 1725 | this_cpu_inc(tun->pcpu_stats->rx_dropped); |
| 1726 | return NULL; | 1726 | return NULL; |
| 1727 | } | 1727 | } |
| @@ -1917,16 +1917,19 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
| 1917 | struct bpf_prog *xdp_prog; | 1917 | struct bpf_prog *xdp_prog; |
| 1918 | int ret; | 1918 | int ret; |
| 1919 | 1919 | ||
| 1920 | local_bh_disable(); | ||
| 1920 | rcu_read_lock(); | 1921 | rcu_read_lock(); |
| 1921 | xdp_prog = rcu_dereference(tun->xdp_prog); | 1922 | xdp_prog = rcu_dereference(tun->xdp_prog); |
| 1922 | if (xdp_prog) { | 1923 | if (xdp_prog) { |
| 1923 | ret = do_xdp_generic(xdp_prog, skb); | 1924 | ret = do_xdp_generic(xdp_prog, skb); |
| 1924 | if (ret != XDP_PASS) { | 1925 | if (ret != XDP_PASS) { |
| 1925 | rcu_read_unlock(); | 1926 | rcu_read_unlock(); |
| 1927 | local_bh_enable(); | ||
| 1926 | return total_len; | 1928 | return total_len; |
| 1927 | } | 1929 | } |
| 1928 | } | 1930 | } |
| 1929 | rcu_read_unlock(); | 1931 | rcu_read_unlock(); |
| 1932 | local_bh_enable(); | ||
| 1930 | } | 1933 | } |
| 1931 | 1934 | ||
| 1932 | rcu_read_lock(); | 1935 | rcu_read_lock(); |
diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c index 7220cd620717..0362acd5cdca 100644 --- a/drivers/net/usb/cdc_mbim.c +++ b/drivers/net/usb/cdc_mbim.c | |||
| @@ -609,7 +609,7 @@ static const struct driver_info cdc_mbim_info_ndp_to_end = { | |||
| 609 | */ | 609 | */ |
| 610 | static const struct driver_info cdc_mbim_info_avoid_altsetting_toggle = { | 610 | static const struct driver_info cdc_mbim_info_avoid_altsetting_toggle = { |
| 611 | .description = "CDC MBIM", | 611 | .description = "CDC MBIM", |
| 612 | .flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN, | 612 | .flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN | FLAG_SEND_ZLP, |
| 613 | .bind = cdc_mbim_bind, | 613 | .bind = cdc_mbim_bind, |
| 614 | .unbind = cdc_mbim_unbind, | 614 | .unbind = cdc_mbim_unbind, |
| 615 | .manage_power = cdc_mbim_manage_power, | 615 | .manage_power = cdc_mbim_manage_power, |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 42565dd33aa6..094680871687 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -1103,6 +1103,7 @@ static const struct usb_device_id products[] = { | |||
| 1103 | {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, | 1103 | {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, |
| 1104 | {QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */ | 1104 | {QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */ |
| 1105 | {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, | 1105 | {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, |
| 1106 | {QMI_FIXED_INTF(0x0846, 0x68d3, 8)}, /* Netgear Aircard 779S */ | ||
| 1106 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ | 1107 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
| 1107 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ | 1108 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ |
| 1108 | {QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */ | 1109 | {QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */ |
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c index f8a0234d332c..5517ea4c2aa0 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | |||
| @@ -1590,14 +1590,13 @@ static void iwl_pcie_set_interrupt_capa(struct pci_dev *pdev, | |||
| 1590 | struct iwl_trans *trans) | 1590 | struct iwl_trans *trans) |
| 1591 | { | 1591 | { |
| 1592 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 1592 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 1593 | int max_irqs, num_irqs, i, ret, nr_online_cpus; | 1593 | int max_irqs, num_irqs, i, ret; |
| 1594 | u16 pci_cmd; | 1594 | u16 pci_cmd; |
| 1595 | 1595 | ||
| 1596 | if (!trans->cfg->mq_rx_supported) | 1596 | if (!trans->cfg->mq_rx_supported) |
| 1597 | goto enable_msi; | 1597 | goto enable_msi; |
| 1598 | 1598 | ||
| 1599 | nr_online_cpus = num_online_cpus(); | 1599 | max_irqs = min_t(u32, num_online_cpus() + 2, IWL_MAX_RX_HW_QUEUES); |
| 1600 | max_irqs = min_t(u32, nr_online_cpus + 2, IWL_MAX_RX_HW_QUEUES); | ||
| 1601 | for (i = 0; i < max_irqs; i++) | 1600 | for (i = 0; i < max_irqs; i++) |
| 1602 | trans_pcie->msix_entries[i].entry = i; | 1601 | trans_pcie->msix_entries[i].entry = i; |
| 1603 | 1602 | ||
| @@ -1623,16 +1622,17 @@ static void iwl_pcie_set_interrupt_capa(struct pci_dev *pdev, | |||
| 1623 | * Two interrupts less: non rx causes shared with FBQ and RSS. | 1622 | * Two interrupts less: non rx causes shared with FBQ and RSS. |
| 1624 | * More than two interrupts: we will use fewer RSS queues. | 1623 | * More than two interrupts: we will use fewer RSS queues. |
| 1625 | */ | 1624 | */ |
| 1626 | if (num_irqs <= nr_online_cpus) { | 1625 | if (num_irqs <= max_irqs - 2) { |
| 1627 | trans_pcie->trans->num_rx_queues = num_irqs + 1; | 1626 | trans_pcie->trans->num_rx_queues = num_irqs + 1; |
| 1628 | trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX | | 1627 | trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX | |
| 1629 | IWL_SHARED_IRQ_FIRST_RSS; | 1628 | IWL_SHARED_IRQ_FIRST_RSS; |
| 1630 | } else if (num_irqs == nr_online_cpus + 1) { | 1629 | } else if (num_irqs == max_irqs - 1) { |
| 1631 | trans_pcie->trans->num_rx_queues = num_irqs; | 1630 | trans_pcie->trans->num_rx_queues = num_irqs; |
| 1632 | trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX; | 1631 | trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX; |
| 1633 | } else { | 1632 | } else { |
| 1634 | trans_pcie->trans->num_rx_queues = num_irqs - 1; | 1633 | trans_pcie->trans->num_rx_queues = num_irqs - 1; |
| 1635 | } | 1634 | } |
| 1635 | WARN_ON(trans_pcie->trans->num_rx_queues > IWL_MAX_RX_HW_QUEUES); | ||
| 1636 | 1636 | ||
| 1637 | trans_pcie->alloc_vecs = num_irqs; | 1637 | trans_pcie->alloc_vecs = num_irqs; |
| 1638 | trans_pcie->msix_enabled = true; | 1638 | trans_pcie->msix_enabled = true; |
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c index a6884e73d2ab..7ddee980048b 100644 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | |||
| @@ -372,16 +372,15 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev, | |||
| 372 | 372 | ||
| 373 | /* | 373 | /* |
| 374 | * Determine IFS values | 374 | * Determine IFS values |
| 375 | * - Use TXOP_BACKOFF for probe and management frames except beacons | 375 | * - Use TXOP_BACKOFF for management frames except beacons |
| 376 | * - Use TXOP_SIFS for fragment bursts | 376 | * - Use TXOP_SIFS for fragment bursts |
| 377 | * - Use TXOP_HTTXOP for everything else | 377 | * - Use TXOP_HTTXOP for everything else |
| 378 | * | 378 | * |
| 379 | * Note: rt2800 devices won't use CTS protection (if used) | 379 | * Note: rt2800 devices won't use CTS protection (if used) |
| 380 | * for frames not transmitted with TXOP_HTTXOP | 380 | * for frames not transmitted with TXOP_HTTXOP |
| 381 | */ | 381 | */ |
| 382 | if ((ieee80211_is_mgmt(hdr->frame_control) && | 382 | if (ieee80211_is_mgmt(hdr->frame_control) && |
| 383 | !ieee80211_is_beacon(hdr->frame_control)) || | 383 | !ieee80211_is_beacon(hdr->frame_control)) |
| 384 | (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)) | ||
| 385 | txdesc->u.ht.txop = TXOP_BACKOFF; | 384 | txdesc->u.ht.txop = TXOP_BACKOFF; |
| 386 | else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)) | 385 | else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)) |
| 387 | txdesc->u.ht.txop = TXOP_SIFS; | 386 | txdesc->u.ht.txop = TXOP_SIFS; |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 986058a57917..eeaf6739215f 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
| @@ -105,7 +105,9 @@ struct vhost_net_virtqueue { | |||
| 105 | /* vhost zerocopy support fields below: */ | 105 | /* vhost zerocopy support fields below: */ |
| 106 | /* last used idx for outstanding DMA zerocopy buffers */ | 106 | /* last used idx for outstanding DMA zerocopy buffers */ |
| 107 | int upend_idx; | 107 | int upend_idx; |
| 108 | /* first used idx for DMA done zerocopy buffers */ | 108 | /* For TX, first used idx for DMA done zerocopy buffers |
| 109 | * For RX, number of batched heads | ||
| 110 | */ | ||
| 109 | int done_idx; | 111 | int done_idx; |
| 110 | /* an array of userspace buffers info */ | 112 | /* an array of userspace buffers info */ |
| 111 | struct ubuf_info *ubuf_info; | 113 | struct ubuf_info *ubuf_info; |
| @@ -626,6 +628,18 @@ static int sk_has_rx_data(struct sock *sk) | |||
| 626 | return skb_queue_empty(&sk->sk_receive_queue); | 628 | return skb_queue_empty(&sk->sk_receive_queue); |
| 627 | } | 629 | } |
| 628 | 630 | ||
| 631 | static void vhost_rx_signal_used(struct vhost_net_virtqueue *nvq) | ||
| 632 | { | ||
| 633 | struct vhost_virtqueue *vq = &nvq->vq; | ||
| 634 | struct vhost_dev *dev = vq->dev; | ||
| 635 | |||
| 636 | if (!nvq->done_idx) | ||
| 637 | return; | ||
| 638 | |||
| 639 | vhost_add_used_and_signal_n(dev, vq, vq->heads, nvq->done_idx); | ||
| 640 | nvq->done_idx = 0; | ||
| 641 | } | ||
| 642 | |||
| 629 | static int vhost_net_rx_peek_head_len(struct vhost_net *net, struct sock *sk) | 643 | static int vhost_net_rx_peek_head_len(struct vhost_net *net, struct sock *sk) |
| 630 | { | 644 | { |
| 631 | struct vhost_net_virtqueue *rvq = &net->vqs[VHOST_NET_VQ_RX]; | 645 | struct vhost_net_virtqueue *rvq = &net->vqs[VHOST_NET_VQ_RX]; |
| @@ -635,6 +649,8 @@ static int vhost_net_rx_peek_head_len(struct vhost_net *net, struct sock *sk) | |||
| 635 | int len = peek_head_len(rvq, sk); | 649 | int len = peek_head_len(rvq, sk); |
| 636 | 650 | ||
| 637 | if (!len && vq->busyloop_timeout) { | 651 | if (!len && vq->busyloop_timeout) { |
| 652 | /* Flush batched heads first */ | ||
| 653 | vhost_rx_signal_used(rvq); | ||
| 638 | /* Both tx vq and rx socket were polled here */ | 654 | /* Both tx vq and rx socket were polled here */ |
| 639 | mutex_lock_nested(&vq->mutex, 1); | 655 | mutex_lock_nested(&vq->mutex, 1); |
| 640 | vhost_disable_notify(&net->dev, vq); | 656 | vhost_disable_notify(&net->dev, vq); |
| @@ -762,7 +778,7 @@ static void handle_rx(struct vhost_net *net) | |||
| 762 | }; | 778 | }; |
| 763 | size_t total_len = 0; | 779 | size_t total_len = 0; |
| 764 | int err, mergeable; | 780 | int err, mergeable; |
| 765 | s16 headcount, nheads = 0; | 781 | s16 headcount; |
| 766 | size_t vhost_hlen, sock_hlen; | 782 | size_t vhost_hlen, sock_hlen; |
| 767 | size_t vhost_len, sock_len; | 783 | size_t vhost_len, sock_len; |
| 768 | struct socket *sock; | 784 | struct socket *sock; |
| @@ -790,8 +806,8 @@ static void handle_rx(struct vhost_net *net) | |||
| 790 | while ((sock_len = vhost_net_rx_peek_head_len(net, sock->sk))) { | 806 | while ((sock_len = vhost_net_rx_peek_head_len(net, sock->sk))) { |
| 791 | sock_len += sock_hlen; | 807 | sock_len += sock_hlen; |
| 792 | vhost_len = sock_len + vhost_hlen; | 808 | vhost_len = sock_len + vhost_hlen; |
| 793 | headcount = get_rx_bufs(vq, vq->heads + nheads, vhost_len, | 809 | headcount = get_rx_bufs(vq, vq->heads + nvq->done_idx, |
| 794 | &in, vq_log, &log, | 810 | vhost_len, &in, vq_log, &log, |
| 795 | likely(mergeable) ? UIO_MAXIOV : 1); | 811 | likely(mergeable) ? UIO_MAXIOV : 1); |
| 796 | /* On error, stop handling until the next kick. */ | 812 | /* On error, stop handling until the next kick. */ |
| 797 | if (unlikely(headcount < 0)) | 813 | if (unlikely(headcount < 0)) |
| @@ -862,12 +878,9 @@ static void handle_rx(struct vhost_net *net) | |||
| 862 | vhost_discard_vq_desc(vq, headcount); | 878 | vhost_discard_vq_desc(vq, headcount); |
| 863 | goto out; | 879 | goto out; |
| 864 | } | 880 | } |
| 865 | nheads += headcount; | 881 | nvq->done_idx += headcount; |
| 866 | if (nheads > VHOST_RX_BATCH) { | 882 | if (nvq->done_idx > VHOST_RX_BATCH) |
| 867 | vhost_add_used_and_signal_n(&net->dev, vq, vq->heads, | 883 | vhost_rx_signal_used(nvq); |
| 868 | nheads); | ||
| 869 | nheads = 0; | ||
| 870 | } | ||
| 871 | if (unlikely(vq_log)) | 884 | if (unlikely(vq_log)) |
| 872 | vhost_log_write(vq, vq_log, log, vhost_len); | 885 | vhost_log_write(vq, vq_log, log, vhost_len); |
| 873 | total_len += vhost_len; | 886 | total_len += vhost_len; |
| @@ -878,9 +891,7 @@ static void handle_rx(struct vhost_net *net) | |||
| 878 | } | 891 | } |
| 879 | vhost_net_enable_vq(net, vq); | 892 | vhost_net_enable_vq(net, vq); |
| 880 | out: | 893 | out: |
| 881 | if (nheads) | 894 | vhost_rx_signal_used(nvq); |
| 882 | vhost_add_used_and_signal_n(&net->dev, vq, vq->heads, | ||
| 883 | nheads); | ||
| 884 | mutex_unlock(&vq->mutex); | 895 | mutex_unlock(&vq->mutex); |
| 885 | } | 896 | } |
| 886 | 897 | ||
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index c5ec89732a8d..8c317737ba3f 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h | |||
| @@ -1017,6 +1017,7 @@ struct bpf_prog_info { | |||
| 1017 | __aligned_u64 map_ids; | 1017 | __aligned_u64 map_ids; |
| 1018 | char name[BPF_OBJ_NAME_LEN]; | 1018 | char name[BPF_OBJ_NAME_LEN]; |
| 1019 | __u32 ifindex; | 1019 | __u32 ifindex; |
| 1020 | __u32 :32; | ||
| 1020 | __u64 netns_dev; | 1021 | __u64 netns_dev; |
| 1021 | __u64 netns_ino; | 1022 | __u64 netns_ino; |
| 1022 | } __attribute__((aligned(8))); | 1023 | } __attribute__((aligned(8))); |
| @@ -1030,6 +1031,7 @@ struct bpf_map_info { | |||
| 1030 | __u32 map_flags; | 1031 | __u32 map_flags; |
| 1031 | char name[BPF_OBJ_NAME_LEN]; | 1032 | char name[BPF_OBJ_NAME_LEN]; |
| 1032 | __u32 ifindex; | 1033 | __u32 ifindex; |
| 1034 | __u32 :32; | ||
| 1033 | __u64 netns_dev; | 1035 | __u64 netns_dev; |
| 1034 | __u64 netns_ino; | 1036 | __u64 netns_ino; |
| 1035 | } __attribute__((aligned(8))); | 1037 | } __attribute__((aligned(8))); |
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 28a4c3490359..6ba639f6c51d 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
| @@ -1954,7 +1954,8 @@ static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt, | |||
| 1954 | int off, pad = 0; | 1954 | int off, pad = 0; |
| 1955 | unsigned int size_kern, match_size = mwt->match_size; | 1955 | unsigned int size_kern, match_size = mwt->match_size; |
| 1956 | 1956 | ||
| 1957 | strlcpy(name, mwt->u.name, sizeof(name)); | 1957 | if (strscpy(name, mwt->u.name, sizeof(name)) < 0) |
| 1958 | return -EINVAL; | ||
| 1958 | 1959 | ||
| 1959 | if (state->buf_kern_start) | 1960 | if (state->buf_kern_start) |
| 1960 | dst = state->buf_kern_start + state->buf_kern_offset; | 1961 | dst = state->buf_kern_start + state->buf_kern_offset; |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index c476f0794132..bb7e80f4ced3 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -1214,9 +1214,6 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue, | |||
| 1214 | cpumask_var_t mask; | 1214 | cpumask_var_t mask; |
| 1215 | unsigned long index; | 1215 | unsigned long index; |
| 1216 | 1216 | ||
| 1217 | if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) | ||
| 1218 | return -ENOMEM; | ||
| 1219 | |||
| 1220 | index = get_netdev_queue_index(queue); | 1217 | index = get_netdev_queue_index(queue); |
| 1221 | 1218 | ||
| 1222 | if (dev->num_tc) { | 1219 | if (dev->num_tc) { |
| @@ -1226,6 +1223,9 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue, | |||
| 1226 | return -EINVAL; | 1223 | return -EINVAL; |
| 1227 | } | 1224 | } |
| 1228 | 1225 | ||
| 1226 | if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) | ||
| 1227 | return -ENOMEM; | ||
| 1228 | |||
| 1229 | rcu_read_lock(); | 1229 | rcu_read_lock(); |
| 1230 | dev_maps = rcu_dereference(dev->xps_maps); | 1230 | dev_maps = rcu_dereference(dev->xps_maps); |
| 1231 | if (dev_maps) { | 1231 | if (dev_maps) { |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 6b0e362cc99b..38d906baf1df 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
| @@ -328,7 +328,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev) | |||
| 328 | 328 | ||
| 329 | if (tdev) { | 329 | if (tdev) { |
| 330 | hlen = tdev->hard_header_len + tdev->needed_headroom; | 330 | hlen = tdev->hard_header_len + tdev->needed_headroom; |
| 331 | mtu = tdev->mtu; | 331 | mtu = min(tdev->mtu, IP_MAX_MTU); |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | dev->needed_headroom = t_hlen + hlen; | 334 | dev->needed_headroom = t_hlen + hlen; |
| @@ -362,7 +362,7 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net, | |||
| 362 | nt = netdev_priv(dev); | 362 | nt = netdev_priv(dev); |
| 363 | t_hlen = nt->hlen + sizeof(struct iphdr); | 363 | t_hlen = nt->hlen + sizeof(struct iphdr); |
| 364 | dev->min_mtu = ETH_MIN_MTU; | 364 | dev->min_mtu = ETH_MIN_MTU; |
| 365 | dev->max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen; | 365 | dev->max_mtu = IP_MAX_MTU - dev->hard_header_len - t_hlen; |
| 366 | ip_tunnel_add(itn, nt); | 366 | ip_tunnel_add(itn, nt); |
| 367 | return nt; | 367 | return nt; |
| 368 | 368 | ||
| @@ -930,7 +930,7 @@ int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict) | |||
| 930 | { | 930 | { |
| 931 | struct ip_tunnel *tunnel = netdev_priv(dev); | 931 | struct ip_tunnel *tunnel = netdev_priv(dev); |
| 932 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); | 932 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); |
| 933 | int max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen; | 933 | int max_mtu = IP_MAX_MTU - dev->hard_header_len - t_hlen; |
| 934 | 934 | ||
| 935 | if (new_mtu < ETH_MIN_MTU) | 935 | if (new_mtu < ETH_MIN_MTU) |
| 936 | return -EINVAL; | 936 | return -EINVAL; |
| @@ -1107,7 +1107,7 @@ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], | |||
| 1107 | 1107 | ||
| 1108 | mtu = ip_tunnel_bind_dev(dev); | 1108 | mtu = ip_tunnel_bind_dev(dev); |
| 1109 | if (tb[IFLA_MTU]) { | 1109 | if (tb[IFLA_MTU]) { |
| 1110 | unsigned int max = 0xfff8 - dev->hard_header_len - nt->hlen; | 1110 | unsigned int max = IP_MAX_MTU - dev->hard_header_len - nt->hlen; |
| 1111 | 1111 | ||
| 1112 | mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, | 1112 | mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, |
| 1113 | (unsigned int)(max - sizeof(struct iphdr))); | 1113 | (unsigned int)(max - sizeof(struct iphdr))); |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index da66aaac51ce..00e138a44cbb 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -1692,8 +1692,13 @@ int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu) | |||
| 1692 | if (new_mtu < ETH_MIN_MTU) | 1692 | if (new_mtu < ETH_MIN_MTU) |
| 1693 | return -EINVAL; | 1693 | return -EINVAL; |
| 1694 | } | 1694 | } |
| 1695 | if (new_mtu > 0xFFF8 - dev->hard_header_len) | 1695 | if (tnl->parms.proto == IPPROTO_IPV6 || tnl->parms.proto == 0) { |
| 1696 | return -EINVAL; | 1696 | if (new_mtu > IP6_MAX_MTU - dev->hard_header_len) |
| 1697 | return -EINVAL; | ||
| 1698 | } else { | ||
| 1699 | if (new_mtu > IP_MAX_MTU - dev->hard_header_len) | ||
| 1700 | return -EINVAL; | ||
| 1701 | } | ||
| 1697 | dev->mtu = new_mtu; | 1702 | dev->mtu = new_mtu; |
| 1698 | return 0; | 1703 | return 0; |
| 1699 | } | 1704 | } |
| @@ -1841,7 +1846,7 @@ ip6_tnl_dev_init_gen(struct net_device *dev) | |||
| 1841 | if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) | 1846 | if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) |
| 1842 | dev->mtu -= 8; | 1847 | dev->mtu -= 8; |
| 1843 | dev->min_mtu = ETH_MIN_MTU; | 1848 | dev->min_mtu = ETH_MIN_MTU; |
| 1844 | dev->max_mtu = 0xFFF8 - dev->hard_header_len; | 1849 | dev->max_mtu = IP6_MAX_MTU - dev->hard_header_len; |
| 1845 | 1850 | ||
| 1846 | return 0; | 1851 | return 0; |
| 1847 | 1852 | ||
diff --git a/net/ipv6/seg6_iptunnel.c b/net/ipv6/seg6_iptunnel.c index 5fe139484919..bf4763fd68c2 100644 --- a/net/ipv6/seg6_iptunnel.c +++ b/net/ipv6/seg6_iptunnel.c | |||
| @@ -103,7 +103,7 @@ int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto) | |||
| 103 | hdrlen = (osrh->hdrlen + 1) << 3; | 103 | hdrlen = (osrh->hdrlen + 1) << 3; |
| 104 | tot_len = hdrlen + sizeof(*hdr); | 104 | tot_len = hdrlen + sizeof(*hdr); |
| 105 | 105 | ||
| 106 | err = skb_cow_head(skb, tot_len); | 106 | err = skb_cow_head(skb, tot_len + skb->mac_len); |
| 107 | if (unlikely(err)) | 107 | if (unlikely(err)) |
| 108 | return err; | 108 | return err; |
| 109 | 109 | ||
| @@ -161,7 +161,7 @@ int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh) | |||
| 161 | 161 | ||
| 162 | hdrlen = (osrh->hdrlen + 1) << 3; | 162 | hdrlen = (osrh->hdrlen + 1) << 3; |
| 163 | 163 | ||
| 164 | err = skb_cow_head(skb, hdrlen); | 164 | err = skb_cow_head(skb, hdrlen + skb->mac_len); |
| 165 | if (unlikely(err)) | 165 | if (unlikely(err)) |
| 166 | return err; | 166 | return err; |
| 167 | 167 | ||
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 2afce37a7177..e9400ffa7875 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -1371,7 +1371,7 @@ static void ipip6_tunnel_setup(struct net_device *dev) | |||
| 1371 | dev->hard_header_len = LL_MAX_HEADER + t_hlen; | 1371 | dev->hard_header_len = LL_MAX_HEADER + t_hlen; |
| 1372 | dev->mtu = ETH_DATA_LEN - t_hlen; | 1372 | dev->mtu = ETH_DATA_LEN - t_hlen; |
| 1373 | dev->min_mtu = IPV6_MIN_MTU; | 1373 | dev->min_mtu = IPV6_MIN_MTU; |
| 1374 | dev->max_mtu = 0xFFF8 - t_hlen; | 1374 | dev->max_mtu = IP6_MAX_MTU - t_hlen; |
| 1375 | dev->flags = IFF_NOARP; | 1375 | dev->flags = IFF_NOARP; |
| 1376 | netif_keep_dst(dev); | 1376 | netif_keep_dst(dev); |
| 1377 | dev->addr_len = 4; | 1377 | dev->addr_len = 4; |
| @@ -1583,7 +1583,8 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev, | |||
| 1583 | if (tb[IFLA_MTU]) { | 1583 | if (tb[IFLA_MTU]) { |
| 1584 | u32 mtu = nla_get_u32(tb[IFLA_MTU]); | 1584 | u32 mtu = nla_get_u32(tb[IFLA_MTU]); |
| 1585 | 1585 | ||
| 1586 | if (mtu >= IPV6_MIN_MTU && mtu <= 0xFFF8 - dev->hard_header_len) | 1586 | if (mtu >= IPV6_MIN_MTU && |
| 1587 | mtu <= IP6_MAX_MTU - dev->hard_header_len) | ||
| 1587 | dev->mtu = mtu; | 1588 | dev->mtu = mtu; |
| 1588 | } | 1589 | } |
| 1589 | 1590 | ||
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 416fe67271a9..86dba282a147 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
| @@ -126,7 +126,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
| 126 | struct flowi6 *fl6 = &fl->u.ip6; | 126 | struct flowi6 *fl6 = &fl->u.ip6; |
| 127 | int onlyproto = 0; | 127 | int onlyproto = 0; |
| 128 | const struct ipv6hdr *hdr = ipv6_hdr(skb); | 128 | const struct ipv6hdr *hdr = ipv6_hdr(skb); |
| 129 | u16 offset = sizeof(*hdr); | 129 | u32 offset = sizeof(*hdr); |
| 130 | struct ipv6_opt_hdr *exthdr; | 130 | struct ipv6_opt_hdr *exthdr; |
| 131 | const unsigned char *nh = skb_network_header(skb); | 131 | const unsigned char *nh = skb_network_header(skb); |
| 132 | u16 nhoff = IP6CB(skb)->nhoff; | 132 | u16 nhoff = IP6CB(skb)->nhoff; |
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index dc76bc346829..d3601d421571 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c | |||
| @@ -1671,7 +1671,7 @@ static struct file *kcm_clone(struct socket *osock) | |||
| 1671 | __module_get(newsock->ops->owner); | 1671 | __module_get(newsock->ops->owner); |
| 1672 | 1672 | ||
| 1673 | newsk = sk_alloc(sock_net(osock->sk), PF_KCM, GFP_KERNEL, | 1673 | newsk = sk_alloc(sock_net(osock->sk), PF_KCM, GFP_KERNEL, |
| 1674 | &kcm_proto, true); | 1674 | &kcm_proto, false); |
| 1675 | if (!newsk) { | 1675 | if (!newsk) { |
| 1676 | sock_release(newsock); | 1676 | sock_release(newsock); |
| 1677 | return ERR_PTR(-ENOMEM); | 1677 | return ERR_PTR(-ENOMEM); |
diff --git a/net/ncsi/ncsi-netlink.c b/net/ncsi/ncsi-netlink.c index 8d7e849d4825..41cede4041d3 100644 --- a/net/ncsi/ncsi-netlink.c +++ b/net/ncsi/ncsi-netlink.c | |||
| @@ -215,7 +215,7 @@ err: | |||
| 215 | static int ncsi_pkg_info_all_nl(struct sk_buff *skb, | 215 | static int ncsi_pkg_info_all_nl(struct sk_buff *skb, |
| 216 | struct netlink_callback *cb) | 216 | struct netlink_callback *cb) |
| 217 | { | 217 | { |
| 218 | struct nlattr *attrs[NCSI_ATTR_MAX]; | 218 | struct nlattr *attrs[NCSI_ATTR_MAX + 1]; |
| 219 | struct ncsi_package *np, *package; | 219 | struct ncsi_package *np, *package; |
| 220 | struct ncsi_dev_priv *ndp; | 220 | struct ncsi_dev_priv *ndp; |
| 221 | unsigned int package_id; | 221 | unsigned int package_id; |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index f36098887ad0..3ecca0616d8c 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
| @@ -2381,8 +2381,10 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) | |||
| 2381 | struct ipvs_sync_daemon_cfg cfg; | 2381 | struct ipvs_sync_daemon_cfg cfg; |
| 2382 | 2382 | ||
| 2383 | memset(&cfg, 0, sizeof(cfg)); | 2383 | memset(&cfg, 0, sizeof(cfg)); |
| 2384 | strlcpy(cfg.mcast_ifn, dm->mcast_ifn, | 2384 | ret = -EINVAL; |
| 2385 | sizeof(cfg.mcast_ifn)); | 2385 | if (strscpy(cfg.mcast_ifn, dm->mcast_ifn, |
| 2386 | sizeof(cfg.mcast_ifn)) <= 0) | ||
| 2387 | goto out_dec; | ||
| 2386 | cfg.syncid = dm->syncid; | 2388 | cfg.syncid = dm->syncid; |
| 2387 | ret = start_sync_thread(ipvs, &cfg, dm->state); | 2389 | ret = start_sync_thread(ipvs, &cfg, dm->state); |
| 2388 | } else { | 2390 | } else { |
| @@ -2420,12 +2422,19 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) | |||
| 2420 | } | 2422 | } |
| 2421 | } | 2423 | } |
| 2422 | 2424 | ||
| 2425 | if ((cmd == IP_VS_SO_SET_ADD || cmd == IP_VS_SO_SET_EDIT) && | ||
| 2426 | strnlen(usvc.sched_name, IP_VS_SCHEDNAME_MAXLEN) == | ||
| 2427 | IP_VS_SCHEDNAME_MAXLEN) { | ||
| 2428 | ret = -EINVAL; | ||
| 2429 | goto out_unlock; | ||
| 2430 | } | ||
| 2431 | |||
| 2423 | /* Check for valid protocol: TCP or UDP or SCTP, even for fwmark!=0 */ | 2432 | /* Check for valid protocol: TCP or UDP or SCTP, even for fwmark!=0 */ |
| 2424 | if (usvc.protocol != IPPROTO_TCP && usvc.protocol != IPPROTO_UDP && | 2433 | if (usvc.protocol != IPPROTO_TCP && usvc.protocol != IPPROTO_UDP && |
| 2425 | usvc.protocol != IPPROTO_SCTP) { | 2434 | usvc.protocol != IPPROTO_SCTP) { |
| 2426 | pr_err("set_ctl: invalid protocol: %d %pI4:%d %s\n", | 2435 | pr_err("set_ctl: invalid protocol: %d %pI4:%d\n", |
| 2427 | usvc.protocol, &usvc.addr.ip, | 2436 | usvc.protocol, &usvc.addr.ip, |
| 2428 | ntohs(usvc.port), usvc.sched_name); | 2437 | ntohs(usvc.port)); |
| 2429 | ret = -EFAULT; | 2438 | ret = -EFAULT; |
| 2430 | goto out_unlock; | 2439 | goto out_unlock; |
| 2431 | } | 2440 | } |
| @@ -2847,7 +2856,7 @@ static const struct nla_policy ip_vs_cmd_policy[IPVS_CMD_ATTR_MAX + 1] = { | |||
| 2847 | static const struct nla_policy ip_vs_daemon_policy[IPVS_DAEMON_ATTR_MAX + 1] = { | 2856 | static const struct nla_policy ip_vs_daemon_policy[IPVS_DAEMON_ATTR_MAX + 1] = { |
| 2848 | [IPVS_DAEMON_ATTR_STATE] = { .type = NLA_U32 }, | 2857 | [IPVS_DAEMON_ATTR_STATE] = { .type = NLA_U32 }, |
| 2849 | [IPVS_DAEMON_ATTR_MCAST_IFN] = { .type = NLA_NUL_STRING, | 2858 | [IPVS_DAEMON_ATTR_MCAST_IFN] = { .type = NLA_NUL_STRING, |
| 2850 | .len = IP_VS_IFNAME_MAXLEN }, | 2859 | .len = IP_VS_IFNAME_MAXLEN - 1 }, |
| 2851 | [IPVS_DAEMON_ATTR_SYNC_ID] = { .type = NLA_U32 }, | 2860 | [IPVS_DAEMON_ATTR_SYNC_ID] = { .type = NLA_U32 }, |
| 2852 | [IPVS_DAEMON_ATTR_SYNC_MAXLEN] = { .type = NLA_U16 }, | 2861 | [IPVS_DAEMON_ATTR_SYNC_MAXLEN] = { .type = NLA_U16 }, |
| 2853 | [IPVS_DAEMON_ATTR_MCAST_GROUP] = { .type = NLA_U32 }, | 2862 | [IPVS_DAEMON_ATTR_MCAST_GROUP] = { .type = NLA_U32 }, |
| @@ -2865,7 +2874,7 @@ static const struct nla_policy ip_vs_svc_policy[IPVS_SVC_ATTR_MAX + 1] = { | |||
| 2865 | [IPVS_SVC_ATTR_PORT] = { .type = NLA_U16 }, | 2874 | [IPVS_SVC_ATTR_PORT] = { .type = NLA_U16 }, |
| 2866 | [IPVS_SVC_ATTR_FWMARK] = { .type = NLA_U32 }, | 2875 | [IPVS_SVC_ATTR_FWMARK] = { .type = NLA_U32 }, |
| 2867 | [IPVS_SVC_ATTR_SCHED_NAME] = { .type = NLA_NUL_STRING, | 2876 | [IPVS_SVC_ATTR_SCHED_NAME] = { .type = NLA_NUL_STRING, |
| 2868 | .len = IP_VS_SCHEDNAME_MAXLEN }, | 2877 | .len = IP_VS_SCHEDNAME_MAXLEN - 1 }, |
| 2869 | [IPVS_SVC_ATTR_PE_NAME] = { .type = NLA_NUL_STRING, | 2878 | [IPVS_SVC_ATTR_PE_NAME] = { .type = NLA_NUL_STRING, |
| 2870 | .len = IP_VS_PENAME_MAXLEN }, | 2879 | .len = IP_VS_PENAME_MAXLEN }, |
| 2871 | [IPVS_SVC_ATTR_FLAGS] = { .type = NLA_BINARY, | 2880 | [IPVS_SVC_ATTR_FLAGS] = { .type = NLA_BINARY, |
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 91e80aa852d6..501e48a7965b 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c | |||
| @@ -1298,8 +1298,10 @@ static void nft_chain_stats_replace(struct nft_base_chain *chain, | |||
| 1298 | rcu_assign_pointer(chain->stats, newstats); | 1298 | rcu_assign_pointer(chain->stats, newstats); |
| 1299 | synchronize_rcu(); | 1299 | synchronize_rcu(); |
| 1300 | free_percpu(oldstats); | 1300 | free_percpu(oldstats); |
| 1301 | } else | 1301 | } else { |
| 1302 | rcu_assign_pointer(chain->stats, newstats); | 1302 | rcu_assign_pointer(chain->stats, newstats); |
| 1303 | static_branch_inc(&nft_counters_enabled); | ||
| 1304 | } | ||
| 1303 | } | 1305 | } |
| 1304 | 1306 | ||
| 1305 | static void nf_tables_chain_destroy(struct nft_ctx *ctx) | 1307 | static void nf_tables_chain_destroy(struct nft_ctx *ctx) |
| @@ -4706,7 +4708,7 @@ static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 4706 | if (idx > s_idx) | 4708 | if (idx > s_idx) |
| 4707 | memset(&cb->args[1], 0, | 4709 | memset(&cb->args[1], 0, |
| 4708 | sizeof(cb->args) - sizeof(cb->args[0])); | 4710 | sizeof(cb->args) - sizeof(cb->args[0])); |
| 4709 | if (filter && filter->table[0] && | 4711 | if (filter && filter->table && |
| 4710 | strcmp(filter->table, table->name)) | 4712 | strcmp(filter->table, table->name)) |
| 4711 | goto cont; | 4713 | goto cont; |
| 4712 | if (filter && | 4714 | if (filter && |
| @@ -5380,7 +5382,7 @@ static int nf_tables_dump_flowtable(struct sk_buff *skb, | |||
| 5380 | if (idx > s_idx) | 5382 | if (idx > s_idx) |
| 5381 | memset(&cb->args[1], 0, | 5383 | memset(&cb->args[1], 0, |
| 5382 | sizeof(cb->args) - sizeof(cb->args[0])); | 5384 | sizeof(cb->args) - sizeof(cb->args[0])); |
| 5383 | if (filter && filter->table[0] && | 5385 | if (filter && filter->table && |
| 5384 | strcmp(filter->table, table->name)) | 5386 | strcmp(filter->table, table->name)) |
| 5385 | goto cont; | 5387 | goto cont; |
| 5386 | 5388 | ||
diff --git a/net/netfilter/nf_tables_core.c b/net/netfilter/nf_tables_core.c index 942702a2776f..40e744572283 100644 --- a/net/netfilter/nf_tables_core.c +++ b/net/netfilter/nf_tables_core.c | |||
| @@ -126,15 +126,15 @@ static noinline void nft_update_chain_stats(const struct nft_chain *chain, | |||
| 126 | if (!base_chain->stats) | 126 | if (!base_chain->stats) |
| 127 | return; | 127 | return; |
| 128 | 128 | ||
| 129 | local_bh_disable(); | ||
| 129 | stats = this_cpu_ptr(rcu_dereference(base_chain->stats)); | 130 | stats = this_cpu_ptr(rcu_dereference(base_chain->stats)); |
| 130 | if (stats) { | 131 | if (stats) { |
| 131 | local_bh_disable(); | ||
| 132 | u64_stats_update_begin(&stats->syncp); | 132 | u64_stats_update_begin(&stats->syncp); |
| 133 | stats->pkts++; | 133 | stats->pkts++; |
| 134 | stats->bytes += pkt->skb->len; | 134 | stats->bytes += pkt->skb->len; |
| 135 | u64_stats_update_end(&stats->syncp); | 135 | u64_stats_update_end(&stats->syncp); |
| 136 | local_bh_enable(); | ||
| 137 | } | 136 | } |
| 137 | local_bh_enable(); | ||
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | struct nft_jumpstack { | 140 | struct nft_jumpstack { |
diff --git a/net/netfilter/nfnetlink_acct.c b/net/netfilter/nfnetlink_acct.c index 6ddf89183e7b..a0e5adf0b3b6 100644 --- a/net/netfilter/nfnetlink_acct.c +++ b/net/netfilter/nfnetlink_acct.c | |||
| @@ -115,7 +115,7 @@ static int nfnl_acct_new(struct net *net, struct sock *nfnl, | |||
| 115 | nfacct->flags = flags; | 115 | nfacct->flags = flags; |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | nla_strlcpy(nfacct->name, nla_data(tb[NFACCT_NAME]), NFACCT_NAME_MAX); | 118 | nla_strlcpy(nfacct->name, tb[NFACCT_NAME], NFACCT_NAME_MAX); |
| 119 | 119 | ||
| 120 | if (tb[NFACCT_BYTES]) { | 120 | if (tb[NFACCT_BYTES]) { |
| 121 | atomic64_set(&nfacct->bytes, | 121 | atomic64_set(&nfacct->bytes, |
diff --git a/net/netfilter/nfnetlink_cthelper.c b/net/netfilter/nfnetlink_cthelper.c index fa026b269b36..cb5b5f207777 100644 --- a/net/netfilter/nfnetlink_cthelper.c +++ b/net/netfilter/nfnetlink_cthelper.c | |||
| @@ -150,7 +150,7 @@ nfnl_cthelper_expect_policy(struct nf_conntrack_expect_policy *expect_policy, | |||
| 150 | return -EINVAL; | 150 | return -EINVAL; |
| 151 | 151 | ||
| 152 | nla_strlcpy(expect_policy->name, | 152 | nla_strlcpy(expect_policy->name, |
| 153 | nla_data(tb[NFCTH_POLICY_NAME]), NF_CT_HELPER_NAME_LEN); | 153 | tb[NFCTH_POLICY_NAME], NF_CT_HELPER_NAME_LEN); |
| 154 | expect_policy->max_expected = | 154 | expect_policy->max_expected = |
| 155 | ntohl(nla_get_be32(tb[NFCTH_POLICY_EXPECT_MAX])); | 155 | ntohl(nla_get_be32(tb[NFCTH_POLICY_EXPECT_MAX])); |
| 156 | if (expect_policy->max_expected > NF_CT_EXPECT_MAX_CNT) | 156 | if (expect_policy->max_expected > NF_CT_EXPECT_MAX_CNT) |
| @@ -235,7 +235,7 @@ nfnl_cthelper_create(const struct nlattr * const tb[], | |||
| 235 | goto err1; | 235 | goto err1; |
| 236 | 236 | ||
| 237 | nla_strlcpy(helper->name, | 237 | nla_strlcpy(helper->name, |
| 238 | nla_data(tb[NFCTH_NAME]), NF_CT_HELPER_NAME_LEN); | 238 | tb[NFCTH_NAME], NF_CT_HELPER_NAME_LEN); |
| 239 | size = ntohl(nla_get_be32(tb[NFCTH_PRIV_DATA_LEN])); | 239 | size = ntohl(nla_get_be32(tb[NFCTH_PRIV_DATA_LEN])); |
| 240 | if (size > FIELD_SIZEOF(struct nf_conn_help, data)) { | 240 | if (size > FIELD_SIZEOF(struct nf_conn_help, data)) { |
| 241 | ret = -ENOMEM; | 241 | ret = -ENOMEM; |
diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c index ea737fd789e8..5c0de704bad5 100644 --- a/net/netfilter/nft_ct.c +++ b/net/netfilter/nft_ct.c | |||
| @@ -880,22 +880,26 @@ static int nft_ct_helper_obj_dump(struct sk_buff *skb, | |||
| 880 | struct nft_object *obj, bool reset) | 880 | struct nft_object *obj, bool reset) |
| 881 | { | 881 | { |
| 882 | const struct nft_ct_helper_obj *priv = nft_obj_data(obj); | 882 | const struct nft_ct_helper_obj *priv = nft_obj_data(obj); |
| 883 | const struct nf_conntrack_helper *helper = priv->helper4; | 883 | const struct nf_conntrack_helper *helper; |
| 884 | u16 family; | 884 | u16 family; |
| 885 | 885 | ||
| 886 | if (priv->helper4 && priv->helper6) { | ||
| 887 | family = NFPROTO_INET; | ||
| 888 | helper = priv->helper4; | ||
| 889 | } else if (priv->helper6) { | ||
| 890 | family = NFPROTO_IPV6; | ||
| 891 | helper = priv->helper6; | ||
| 892 | } else { | ||
| 893 | family = NFPROTO_IPV4; | ||
| 894 | helper = priv->helper4; | ||
| 895 | } | ||
| 896 | |||
| 886 | if (nla_put_string(skb, NFTA_CT_HELPER_NAME, helper->name)) | 897 | if (nla_put_string(skb, NFTA_CT_HELPER_NAME, helper->name)) |
| 887 | return -1; | 898 | return -1; |
| 888 | 899 | ||
| 889 | if (nla_put_u8(skb, NFTA_CT_HELPER_L4PROTO, priv->l4proto)) | 900 | if (nla_put_u8(skb, NFTA_CT_HELPER_L4PROTO, priv->l4proto)) |
| 890 | return -1; | 901 | return -1; |
| 891 | 902 | ||
| 892 | if (priv->helper4 && priv->helper6) | ||
| 893 | family = NFPROTO_INET; | ||
| 894 | else if (priv->helper6) | ||
| 895 | family = NFPROTO_IPV6; | ||
| 896 | else | ||
| 897 | family = NFPROTO_IPV4; | ||
| 898 | |||
| 899 | if (nla_put_be16(skb, NFTA_CT_HELPER_L3PROTO, htons(family))) | 903 | if (nla_put_be16(skb, NFTA_CT_HELPER_L3PROTO, htons(family))) |
| 900 | return -1; | 904 | return -1; |
| 901 | 905 | ||
diff --git a/net/netfilter/nft_limit.c b/net/netfilter/nft_limit.c index a9fc298ef4c3..72f13a1144dd 100644 --- a/net/netfilter/nft_limit.c +++ b/net/netfilter/nft_limit.c | |||
| @@ -51,10 +51,13 @@ static inline bool nft_limit_eval(struct nft_limit *limit, u64 cost) | |||
| 51 | return !limit->invert; | 51 | return !limit->invert; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | /* Use same default as in iptables. */ | ||
| 55 | #define NFT_LIMIT_PKT_BURST_DEFAULT 5 | ||
| 56 | |||
| 54 | static int nft_limit_init(struct nft_limit *limit, | 57 | static int nft_limit_init(struct nft_limit *limit, |
| 55 | const struct nlattr * const tb[]) | 58 | const struct nlattr * const tb[], bool pkts) |
| 56 | { | 59 | { |
| 57 | u64 unit; | 60 | u64 unit, tokens; |
| 58 | 61 | ||
| 59 | if (tb[NFTA_LIMIT_RATE] == NULL || | 62 | if (tb[NFTA_LIMIT_RATE] == NULL || |
| 60 | tb[NFTA_LIMIT_UNIT] == NULL) | 63 | tb[NFTA_LIMIT_UNIT] == NULL) |
| @@ -68,18 +71,25 @@ static int nft_limit_init(struct nft_limit *limit, | |||
| 68 | 71 | ||
| 69 | if (tb[NFTA_LIMIT_BURST]) | 72 | if (tb[NFTA_LIMIT_BURST]) |
| 70 | limit->burst = ntohl(nla_get_be32(tb[NFTA_LIMIT_BURST])); | 73 | limit->burst = ntohl(nla_get_be32(tb[NFTA_LIMIT_BURST])); |
| 71 | else | 74 | |
| 72 | limit->burst = 0; | 75 | if (pkts && limit->burst == 0) |
| 76 | limit->burst = NFT_LIMIT_PKT_BURST_DEFAULT; | ||
| 73 | 77 | ||
| 74 | if (limit->rate + limit->burst < limit->rate) | 78 | if (limit->rate + limit->burst < limit->rate) |
| 75 | return -EOVERFLOW; | 79 | return -EOVERFLOW; |
| 76 | 80 | ||
| 77 | /* The token bucket size limits the number of tokens can be | 81 | if (pkts) { |
| 78 | * accumulated. tokens_max specifies the bucket size. | 82 | tokens = div_u64(limit->nsecs, limit->rate) * limit->burst; |
| 79 | * tokens_max = unit * (rate + burst) / rate. | 83 | } else { |
| 80 | */ | 84 | /* The token bucket size limits the number of tokens can be |
| 81 | limit->tokens = div_u64(limit->nsecs * (limit->rate + limit->burst), | 85 | * accumulated. tokens_max specifies the bucket size. |
| 82 | limit->rate); | 86 | * tokens_max = unit * (rate + burst) / rate. |
| 87 | */ | ||
| 88 | tokens = div_u64(limit->nsecs * (limit->rate + limit->burst), | ||
| 89 | limit->rate); | ||
| 90 | } | ||
| 91 | |||
| 92 | limit->tokens = tokens; | ||
| 83 | limit->tokens_max = limit->tokens; | 93 | limit->tokens_max = limit->tokens; |
| 84 | 94 | ||
| 85 | if (tb[NFTA_LIMIT_FLAGS]) { | 95 | if (tb[NFTA_LIMIT_FLAGS]) { |
| @@ -144,7 +154,7 @@ static int nft_limit_pkts_init(const struct nft_ctx *ctx, | |||
| 144 | struct nft_limit_pkts *priv = nft_expr_priv(expr); | 154 | struct nft_limit_pkts *priv = nft_expr_priv(expr); |
| 145 | int err; | 155 | int err; |
| 146 | 156 | ||
| 147 | err = nft_limit_init(&priv->limit, tb); | 157 | err = nft_limit_init(&priv->limit, tb, true); |
| 148 | if (err < 0) | 158 | if (err < 0) |
| 149 | return err; | 159 | return err; |
| 150 | 160 | ||
| @@ -185,7 +195,7 @@ static int nft_limit_bytes_init(const struct nft_ctx *ctx, | |||
| 185 | { | 195 | { |
| 186 | struct nft_limit *priv = nft_expr_priv(expr); | 196 | struct nft_limit *priv = nft_expr_priv(expr); |
| 187 | 197 | ||
| 188 | return nft_limit_init(priv, tb); | 198 | return nft_limit_init(priv, tb, false); |
| 189 | } | 199 | } |
| 190 | 200 | ||
| 191 | static int nft_limit_bytes_dump(struct sk_buff *skb, | 201 | static int nft_limit_bytes_dump(struct sk_buff *skb, |
| @@ -246,7 +256,7 @@ static int nft_limit_obj_pkts_init(const struct nft_ctx *ctx, | |||
| 246 | struct nft_limit_pkts *priv = nft_obj_data(obj); | 256 | struct nft_limit_pkts *priv = nft_obj_data(obj); |
| 247 | int err; | 257 | int err; |
| 248 | 258 | ||
| 249 | err = nft_limit_init(&priv->limit, tb); | 259 | err = nft_limit_init(&priv->limit, tb, true); |
| 250 | if (err < 0) | 260 | if (err < 0) |
| 251 | return err; | 261 | return err; |
| 252 | 262 | ||
| @@ -289,7 +299,7 @@ static int nft_limit_obj_bytes_init(const struct nft_ctx *ctx, | |||
| 289 | { | 299 | { |
| 290 | struct nft_limit *priv = nft_obj_data(obj); | 300 | struct nft_limit *priv = nft_obj_data(obj); |
| 291 | 301 | ||
| 292 | return nft_limit_init(priv, tb); | 302 | return nft_limit_init(priv, tb, false); |
| 293 | } | 303 | } |
| 294 | 304 | ||
| 295 | static int nft_limit_obj_bytes_dump(struct sk_buff *skb, | 305 | static int nft_limit_obj_bytes_dump(struct sk_buff *skb, |
diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c index 8fb91940e2e7..204af9899482 100644 --- a/net/netfilter/nft_meta.c +++ b/net/netfilter/nft_meta.c | |||
| @@ -234,7 +234,7 @@ void nft_meta_set_eval(const struct nft_expr *expr, | |||
| 234 | struct sk_buff *skb = pkt->skb; | 234 | struct sk_buff *skb = pkt->skb; |
| 235 | u32 *sreg = ®s->data[meta->sreg]; | 235 | u32 *sreg = ®s->data[meta->sreg]; |
| 236 | u32 value = *sreg; | 236 | u32 value = *sreg; |
| 237 | u8 pkt_type; | 237 | u8 value8; |
| 238 | 238 | ||
| 239 | switch (meta->key) { | 239 | switch (meta->key) { |
| 240 | case NFT_META_MARK: | 240 | case NFT_META_MARK: |
| @@ -244,15 +244,17 @@ void nft_meta_set_eval(const struct nft_expr *expr, | |||
| 244 | skb->priority = value; | 244 | skb->priority = value; |
| 245 | break; | 245 | break; |
| 246 | case NFT_META_PKTTYPE: | 246 | case NFT_META_PKTTYPE: |
| 247 | pkt_type = nft_reg_load8(sreg); | 247 | value8 = nft_reg_load8(sreg); |
| 248 | 248 | ||
| 249 | if (skb->pkt_type != pkt_type && | 249 | if (skb->pkt_type != value8 && |
| 250 | skb_pkt_type_ok(pkt_type) && | 250 | skb_pkt_type_ok(value8) && |
| 251 | skb_pkt_type_ok(skb->pkt_type)) | 251 | skb_pkt_type_ok(skb->pkt_type)) |
| 252 | skb->pkt_type = pkt_type; | 252 | skb->pkt_type = value8; |
| 253 | break; | 253 | break; |
| 254 | case NFT_META_NFTRACE: | 254 | case NFT_META_NFTRACE: |
| 255 | skb->nf_trace = !!value; | 255 | value8 = nft_reg_load8(sreg); |
| 256 | |||
| 257 | skb->nf_trace = !!value8; | ||
| 256 | break; | 258 | break; |
| 257 | default: | 259 | default: |
| 258 | WARN_ON(1); | 260 | WARN_ON(1); |
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index d964e60c730e..c79f6e71512e 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c | |||
| @@ -977,7 +977,7 @@ static int fl_change(struct net *net, struct sk_buff *in_skb, | |||
| 977 | return 0; | 977 | return 0; |
| 978 | 978 | ||
| 979 | errout_idr: | 979 | errout_idr: |
| 980 | if (fnew->handle) | 980 | if (!fold) |
| 981 | idr_remove(&head->handle_idr, fnew->handle); | 981 | idr_remove(&head->handle_idr, fnew->handle); |
| 982 | errout: | 982 | errout: |
| 983 | tcf_exts_destroy(&fnew->exts); | 983 | tcf_exts_destroy(&fnew->exts); |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 40b54cc64243..5f48251c1319 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -1658,7 +1658,6 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, | |||
| 1658 | trailer_len -= xdst_prev->u.dst.xfrm->props.trailer_len; | 1658 | trailer_len -= xdst_prev->u.dst.xfrm->props.trailer_len; |
| 1659 | } | 1659 | } |
| 1660 | 1660 | ||
| 1661 | out: | ||
| 1662 | return &xdst0->u.dst; | 1661 | return &xdst0->u.dst; |
| 1663 | 1662 | ||
| 1664 | put_states: | 1663 | put_states: |
| @@ -1667,8 +1666,8 @@ put_states: | |||
| 1667 | free_dst: | 1666 | free_dst: |
| 1668 | if (xdst0) | 1667 | if (xdst0) |
| 1669 | dst_release_immediate(&xdst0->u.dst); | 1668 | dst_release_immediate(&xdst0->u.dst); |
| 1670 | xdst0 = ERR_PTR(err); | 1669 | |
| 1671 | goto out; | 1670 | return ERR_PTR(err); |
| 1672 | } | 1671 | } |
| 1673 | 1672 | ||
| 1674 | static int xfrm_expand_policies(const struct flowi *fl, u16 family, | 1673 | static int xfrm_expand_policies(const struct flowi *fl, u16 family, |
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index c5ec89732a8d..8c317737ba3f 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h | |||
| @@ -1017,6 +1017,7 @@ struct bpf_prog_info { | |||
| 1017 | __aligned_u64 map_ids; | 1017 | __aligned_u64 map_ids; |
| 1018 | char name[BPF_OBJ_NAME_LEN]; | 1018 | char name[BPF_OBJ_NAME_LEN]; |
| 1019 | __u32 ifindex; | 1019 | __u32 ifindex; |
| 1020 | __u32 :32; | ||
| 1020 | __u64 netns_dev; | 1021 | __u64 netns_dev; |
| 1021 | __u64 netns_ino; | 1022 | __u64 netns_ino; |
| 1022 | } __attribute__((aligned(8))); | 1023 | } __attribute__((aligned(8))); |
| @@ -1030,6 +1031,7 @@ struct bpf_map_info { | |||
| 1030 | __u32 map_flags; | 1031 | __u32 map_flags; |
| 1031 | char name[BPF_OBJ_NAME_LEN]; | 1032 | char name[BPF_OBJ_NAME_LEN]; |
| 1032 | __u32 ifindex; | 1033 | __u32 ifindex; |
| 1034 | __u32 :32; | ||
| 1033 | __u64 netns_dev; | 1035 | __u64 netns_dev; |
| 1034 | __u64 netns_ino; | 1036 | __u64 netns_ino; |
| 1035 | } __attribute__((aligned(8))); | 1037 | } __attribute__((aligned(8))); |
