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

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

Pull networking fixes from David Miller:

1) Fix AF_XDP cq entry leak, from Ilya Maximets.

2) Fix handling of PHY power-down on RTL8411B, from Heiner Kallweit.

3) Add some new PCI IDs to iwlwifi, from Ihab Zhaika.

4) Fix handling of neigh timers wrt. entries added by userspace, from
Lorenzo Bianconi.

5) Various cases of missing of_node_put(), from Nishka Dasgupta.

6) The new NET_ACT_CT needs to depend upon NF_NAT, from Yue Haibing.

7) Various RDS layer fixes, from Gerd Rausch.

8) Fix some more fallout from TCQ_F_CAN_BYPASS generalization, from
Cong Wang.

9) Fix FIB source validation checks over loopback, also from Cong Wang.

10) Use promisc for unsupported number of filters, from Justin Chen.

11) Missing sibling route unlink on failure in ipv6, from Ido Schimmel.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (90 commits)
tcp: fix tcp_set_congestion_control() use from bpf hook
ag71xx: fix return value check in ag71xx_probe()
ag71xx: fix error return code in ag71xx_probe()
usb: qmi_wwan: add D-Link DWM-222 A2 device ID
bnxt_en: Fix VNIC accounting when enabling aRFS on 57500 chips.
net: dsa: sja1105: Fix missing unlock on error in sk_buff()
gve: replace kfree with kvfree
selftests/bpf: fix test_xdp_noinline on s390
selftests/bpf: fix "valid read map access into a read-only array 1" on s390
net/mlx5: Replace kfree with kvfree
MAINTAINERS: update netsec driver
ipv6: Unlink sibling route in case of failure
liquidio: Replace vmalloc + memset with vzalloc
udp: Fix typo in net/ipv4/udp.c
net: bcmgenet: use promisc for unsupported filters
ipv6: rt6_check should return NULL if 'from' is NULL
tipc: initialize 'validated' field of received packets
selftests: add a test case for rp_filter
fib: relax source validation check for loopback packets
mlxsw: spectrum: Do not process learned records with a dummy FID
...

+964 -399
+13 -3
Documentation/networking/bonding.txt
··· 706 706 unsolicited IPv6 Neighbor Advertisements) to be issued after a 707 707 failover event. As soon as the link is up on the new slave 708 708 (possibly immediately) a peer notification is sent on the 709 - bonding device and each VLAN sub-device. This is repeated at 710 - each link monitor interval (arp_interval or miimon, whichever 711 - is active) if the number is greater than 1. 709 + bonding device and each VLAN sub-device. This is repeated at 710 + the rate specified by peer_notif_delay if the number is 711 + greater than 1. 712 712 713 713 The valid range is 0 - 255; the default value is 1. These options 714 714 affect only the active-backup mode. These options were added for ··· 726 726 727 727 The valid range is 0 - 65535; the default value is 1. This option 728 728 has effect only in balance-rr mode. 729 + 730 + peer_notif_delay 731 + 732 + Specify the delay, in milliseconds, between each peer 733 + notification (gratuitous ARP and unsolicited IPv6 Neighbor 734 + Advertisement) when they are issued after a failover event. 735 + This delay should be a multiple of the link monitor interval 736 + (arp_interval or miimon, whichever is active). The default 737 + value is 0 which means to match the value of the link monitor 738 + interval. 729 739 730 740 primary 731 741
+2 -1
MAINTAINERS
··· 3108 3108 F: arch/riscv/net/ 3109 3109 3110 3110 BPF JIT for S390 3111 + M: Ilya Leoshkevich <iii@linux.ibm.com> 3111 3112 M: Heiko Carstens <heiko.carstens@de.ibm.com> 3112 3113 M: Vasily Gorbik <gor@linux.ibm.com> 3113 - M: Christian Borntraeger <borntraeger@de.ibm.com> 3114 3114 L: netdev@vger.kernel.org 3115 3115 L: bpf@vger.kernel.org 3116 3116 S: Maintained ··· 14873 14873 14874 14874 SOCIONEXT (SNI) NETSEC NETWORK DRIVER 14875 14875 M: Jassi Brar <jaswinder.singh@linaro.org> 14876 + M: Ilias Apalodimas <ilias.apalodimas@linaro.org> 14876 14877 L: netdev@vger.kernel.org 14877 14878 S: Maintained 14878 14879 F: drivers/net/ethernet/socionext/netsec.c
-1
drivers/atm/idt77252.c
··· 1379 1379 printk("%s: can't allocate TSQ.\n", card->name); 1380 1380 return -1; 1381 1381 } 1382 - memset(card->tsq.base, 0, TSQSIZE); 1383 1382 1384 1383 card->tsq.last = card->tsq.base + TSQ_NUM_ENTRIES - 1; 1385 1384 card->tsq.next = card->tsq.last;
+3
drivers/isdn/hardware/mISDN/hfcsusb.c
··· 1955 1955 1956 1956 /* get endpoint base */ 1957 1957 idx = ((ep_addr & 0x7f) - 1) * 2; 1958 + if (idx > 15) 1959 + return -EIO; 1960 + 1958 1961 if (ep_addr & 0x80) 1959 1962 idx++; 1960 1963 attr = ep->desc.bmAttributes;
+1 -1
drivers/net/caif/caif_hsi.c
··· 1455 1455 rtnl_lock(); 1456 1456 list_for_each_safe(list_node, n, &cfhsi_list) { 1457 1457 cfhsi = list_entry(list_node, struct cfhsi, list); 1458 - unregister_netdev(cfhsi->ndev); 1458 + unregister_netdevice(cfhsi->ndev); 1459 1459 } 1460 1460 rtnl_unlock(); 1461 1461 }
+6 -3
drivers/net/ethernet/atheros/ag71xx.c
··· 35 35 #include <linux/regmap.h> 36 36 #include <linux/reset.h> 37 37 #include <linux/clk.h> 38 + #include <linux/io.h> 38 39 39 40 /* For our NAPI weight bigger does *NOT* mean better - it means more 40 41 * D-cache misses and lots more wasted cycles than we'll ever ··· 1725 1724 ag->stop_desc = dmam_alloc_coherent(&pdev->dev, 1726 1725 sizeof(struct ag71xx_desc), 1727 1726 &ag->stop_desc_dma, GFP_KERNEL); 1728 - if (!ag->stop_desc) 1727 + if (!ag->stop_desc) { 1728 + err = -ENOMEM; 1729 1729 goto err_free; 1730 + } 1730 1731 1731 1732 ag->stop_desc->data = 0; 1732 1733 ag->stop_desc->ctrl = 0; 1733 1734 ag->stop_desc->next = (u32)ag->stop_desc_dma; 1734 1735 1735 1736 mac_addr = of_get_mac_address(np); 1736 - if (mac_addr) 1737 + if (!IS_ERR(mac_addr)) 1737 1738 memcpy(ndev->dev_addr, mac_addr, ETH_ALEN); 1738 - if (!mac_addr || !is_valid_ether_addr(ndev->dev_addr)) { 1739 + if (IS_ERR(mac_addr) || !is_valid_ether_addr(ndev->dev_addr)) { 1739 1740 netif_err(ag, probe, ndev, "invalid MAC address, using random address\n"); 1740 1741 eth_random_addr(ndev->dev_addr); 1741 1742 }
-2
drivers/net/ethernet/atheros/atlx/atl1.c
··· 1060 1060 goto err_nomem; 1061 1061 } 1062 1062 1063 - memset(ring_header->desc, 0, ring_header->size); 1064 - 1065 1063 /* init TPD ring */ 1066 1064 tpd_ring->dma = ring_header->dma; 1067 1065 offset = (tpd_ring->dma & 0x7) ? (8 - (ring_header->dma & 0x7)) : 0;
-1
drivers/net/ethernet/atheros/atlx/atl2.c
··· 291 291 &adapter->ring_dma); 292 292 if (!adapter->ring_vir_addr) 293 293 return -ENOMEM; 294 - memset(adapter->ring_vir_addr, 0, adapter->ring_size); 295 294 296 295 /* Init TXD Ring */ 297 296 adapter->txd_dma = adapter->ring_dma ;
+5 -4
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 2677 2677 mapping = txr->tx_push_mapping + 2678 2678 sizeof(struct tx_push_bd); 2679 2679 txr->data_mapping = cpu_to_le64(mapping); 2680 - 2681 - memset(txr->tx_push, 0, sizeof(struct tx_push_bd)); 2682 2680 } 2683 2681 qidx = bp->tc_to_qidx[j]; 2684 2682 ring->queue_id = bp->q_info[qidx].queue_id; ··· 3075 3077 int num_vnics = 1; 3076 3078 3077 3079 #ifdef CONFIG_RFS_ACCEL 3078 - if (bp->flags & BNXT_FLAG_RFS) 3080 + if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) 3079 3081 num_vnics += bp->rx_nr_rings; 3080 3082 #endif 3081 3083 ··· 7186 7188 #ifdef CONFIG_RFS_ACCEL 7187 7189 int i, rc = 0; 7188 7190 7191 + if (bp->flags & BNXT_FLAG_CHIP_P5) 7192 + return 0; 7193 + 7189 7194 for (i = 0; i < bp->rx_nr_rings; i++) { 7190 7195 struct bnxt_vnic_info *vnic; 7191 7196 u16 vnic_id = i + 1; ··· 9648 9647 return -ENOMEM; 9649 9648 9650 9649 vnics = 1; 9651 - if (bp->flags & BNXT_FLAG_RFS) 9650 + if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) 9652 9651 vnics += rx_rings; 9653 9652 9654 9653 if (bp->flags & BNXT_FLAG_AGG_RINGS)
+26 -31
drivers/net/ethernet/broadcom/genet/bcmgenet.c
··· 3083 3083 netif_tx_wake_all_queues(dev); 3084 3084 } 3085 3085 3086 - #define MAX_MC_COUNT 16 3086 + #define MAX_MDF_FILTER 17 3087 3087 3088 3088 static inline void bcmgenet_set_mdf_addr(struct bcmgenet_priv *priv, 3089 3089 unsigned char *addr, 3090 - int *i, 3091 - int *mc) 3090 + int *i) 3092 3091 { 3093 - u32 reg; 3094 - 3095 3092 bcmgenet_umac_writel(priv, addr[0] << 8 | addr[1], 3096 3093 UMAC_MDF_ADDR + (*i * 4)); 3097 3094 bcmgenet_umac_writel(priv, addr[2] << 24 | addr[3] << 16 | 3098 3095 addr[4] << 8 | addr[5], 3099 3096 UMAC_MDF_ADDR + ((*i + 1) * 4)); 3100 - reg = bcmgenet_umac_readl(priv, UMAC_MDF_CTRL); 3101 - reg |= (1 << (MAX_MC_COUNT - *mc)); 3102 - bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); 3103 3097 *i += 2; 3104 - (*mc)++; 3105 3098 } 3106 3099 3107 3100 static void bcmgenet_set_rx_mode(struct net_device *dev) 3108 3101 { 3109 3102 struct bcmgenet_priv *priv = netdev_priv(dev); 3110 3103 struct netdev_hw_addr *ha; 3111 - int i, mc; 3104 + int i, nfilter; 3112 3105 u32 reg; 3113 3106 3114 3107 netif_dbg(priv, hw, dev, "%s: %08X\n", __func__, dev->flags); 3115 3108 3116 - /* Promiscuous mode */ 3109 + /* Number of filters needed */ 3110 + nfilter = netdev_uc_count(dev) + netdev_mc_count(dev) + 2; 3111 + 3112 + /* 3113 + * Turn on promicuous mode for three scenarios 3114 + * 1. IFF_PROMISC flag is set 3115 + * 2. IFF_ALLMULTI flag is set 3116 + * 3. The number of filters needed exceeds the number filters 3117 + * supported by the hardware. 3118 + */ 3117 3119 reg = bcmgenet_umac_readl(priv, UMAC_CMD); 3118 - if (dev->flags & IFF_PROMISC) { 3120 + if ((dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) || 3121 + (nfilter > MAX_MDF_FILTER)) { 3119 3122 reg |= CMD_PROMISC; 3120 3123 bcmgenet_umac_writel(priv, reg, UMAC_CMD); 3121 3124 bcmgenet_umac_writel(priv, 0, UMAC_MDF_CTRL); ··· 3128 3125 bcmgenet_umac_writel(priv, reg, UMAC_CMD); 3129 3126 } 3130 3127 3131 - /* UniMac doesn't support ALLMULTI */ 3132 - if (dev->flags & IFF_ALLMULTI) { 3133 - netdev_warn(dev, "ALLMULTI is not supported\n"); 3134 - return; 3135 - } 3136 - 3137 3128 /* update MDF filter */ 3138 3129 i = 0; 3139 - mc = 0; 3140 3130 /* Broadcast */ 3141 - bcmgenet_set_mdf_addr(priv, dev->broadcast, &i, &mc); 3131 + bcmgenet_set_mdf_addr(priv, dev->broadcast, &i); 3142 3132 /* my own address.*/ 3143 - bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i, &mc); 3144 - /* Unicast list*/ 3145 - if (netdev_uc_count(dev) > (MAX_MC_COUNT - mc)) 3146 - return; 3133 + bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i); 3147 3134 3148 - if (!netdev_uc_empty(dev)) 3149 - netdev_for_each_uc_addr(ha, dev) 3150 - bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); 3135 + /* Unicast */ 3136 + netdev_for_each_uc_addr(ha, dev) 3137 + bcmgenet_set_mdf_addr(priv, ha->addr, &i); 3138 + 3151 3139 /* Multicast */ 3152 - if (netdev_mc_empty(dev) || netdev_mc_count(dev) >= (MAX_MC_COUNT - mc)) 3153 - return; 3154 - 3155 3140 netdev_for_each_mc_addr(ha, dev) 3156 - bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); 3141 + bcmgenet_set_mdf_addr(priv, ha->addr, &i); 3142 + 3143 + /* Enable filters */ 3144 + reg = GENMASK(MAX_MDF_FILTER - 1, MAX_MDF_FILTER - nfilter); 3145 + bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); 3157 3146 } 3158 3147 3159 3148 /* Set the hardware MAC address. */
+2 -4
drivers/net/ethernet/cavium/liquidio/request_manager.c
··· 218 218 return 0; 219 219 } 220 220 oct->instr_queue[iq_no] = 221 - vmalloc_node(sizeof(struct octeon_instr_queue), numa_node); 221 + vzalloc_node(sizeof(struct octeon_instr_queue), numa_node); 222 222 if (!oct->instr_queue[iq_no]) 223 223 oct->instr_queue[iq_no] = 224 - vmalloc(sizeof(struct octeon_instr_queue)); 224 + vzalloc(sizeof(struct octeon_instr_queue)); 225 225 if (!oct->instr_queue[iq_no]) 226 226 return 1; 227 227 228 - memset(oct->instr_queue[iq_no], 0, 229 - sizeof(struct octeon_instr_queue)); 230 228 231 229 oct->instr_queue[iq_no]->q_index = q_index; 232 230 oct->instr_queue[iq_no]->app_ctx = app_ctx;
-1
drivers/net/ethernet/chelsio/cxgb4/sched.c
··· 207 207 goto out_err; 208 208 209 209 /* Bind queue to specified class */ 210 - memset(qe, 0, sizeof(*qe)); 211 210 qe->cntxt_id = qid; 212 211 memcpy(&qe->param, p, sizeof(qe->param)); 213 212
+5 -1
drivers/net/ethernet/emulex/benet/be_main.c
··· 4697 4697 struct net_device *netdev = adapter->netdev; 4698 4698 int status; 4699 4699 4700 - if (netif_running(netdev)) 4700 + if (netif_running(netdev)) { 4701 + /* device cannot transmit now, avoid dev_watchdog timeouts */ 4702 + netif_carrier_off(netdev); 4703 + 4701 4704 be_close(netdev); 4705 + } 4702 4706 4703 4707 be_cancel_worker(adapter); 4704 4708
-2
drivers/net/ethernet/freescale/fec_main.c
··· 3144 3144 return -ENOMEM; 3145 3145 } 3146 3146 3147 - memset(cbd_base, 0, bd_size); 3148 - 3149 3147 /* Get the Ethernet address */ 3150 3148 fec_get_mac(ndev); 3151 3149 /* make sure MAC we just acquired is programmed into the hw */
+11 -12
drivers/net/ethernet/google/gve/gve_main.c
··· 232 232 abort_with_msix_enabled: 233 233 pci_disable_msix(priv->pdev); 234 234 abort_with_msix_vectors: 235 - kfree(priv->msix_vectors); 235 + kvfree(priv->msix_vectors); 236 236 priv->msix_vectors = NULL; 237 237 return err; 238 238 } ··· 256 256 priv->ntfy_blocks = NULL; 257 257 free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); 258 258 pci_disable_msix(priv->pdev); 259 - kfree(priv->msix_vectors); 259 + kvfree(priv->msix_vectors); 260 260 priv->msix_vectors = NULL; 261 261 } 262 262 ··· 445 445 return 0; 446 446 447 447 free_rx: 448 - kfree(priv->rx); 448 + kvfree(priv->rx); 449 449 priv->rx = NULL; 450 450 free_tx_queue: 451 451 gve_tx_free_rings(priv); 452 452 free_tx: 453 - kfree(priv->tx); 453 + kvfree(priv->tx); 454 454 priv->tx = NULL; 455 455 return err; 456 456 } ··· 500 500 gve_remove_napi(priv, ntfy_idx); 501 501 } 502 502 gve_tx_free_rings(priv); 503 - kfree(priv->tx); 503 + kvfree(priv->tx); 504 504 priv->tx = NULL; 505 505 } 506 506 if (priv->rx) { ··· 509 509 gve_remove_napi(priv, ntfy_idx); 510 510 } 511 511 gve_rx_free_rings(priv); 512 - kfree(priv->rx); 512 + kvfree(priv->rx); 513 513 priv->rx = NULL; 514 514 } 515 515 } ··· 592 592 gve_free_page(&priv->pdev->dev, qpl->pages[i], 593 593 qpl->page_buses[i], gve_qpl_dma_dir(priv, id)); 594 594 595 - kfree(qpl->page_buses); 595 + kvfree(qpl->page_buses); 596 596 free_pages: 597 - kfree(qpl->pages); 597 + kvfree(qpl->pages); 598 598 priv->num_registered_pages -= qpl->num_entries; 599 599 } 600 600 ··· 635 635 free_qpls: 636 636 for (j = 0; j <= i; j++) 637 637 gve_free_queue_page_list(priv, j); 638 - kfree(priv->qpls); 638 + kvfree(priv->qpls); 639 639 return err; 640 640 } 641 641 ··· 644 644 int num_qpls = gve_num_tx_qpls(priv) + gve_num_rx_qpls(priv); 645 645 int i; 646 646 647 - kfree(priv->qpl_cfg.qpl_id_map); 647 + kvfree(priv->qpl_cfg.qpl_id_map); 648 648 649 649 for (i = 0; i < num_qpls; i++) 650 650 gve_free_queue_page_list(priv, i); 651 651 652 - kfree(priv->qpls); 652 + kvfree(priv->qpls); 653 653 } 654 654 655 655 /* Use this to schedule a reset when the device is capable of continuing ··· 1192 1192 pci_disable_device(pdev); 1193 1193 return -ENXIO; 1194 1194 } 1195 - EXPORT_SYMBOL(gve_probe); 1196 1195 1197 1196 static void gve_remove(struct pci_dev *pdev) 1198 1197 {
+2 -2
drivers/net/ethernet/google/gve/gve_rx.c
··· 35 35 36 36 gve_unassign_qpl(priv, rx->data.qpl->id); 37 37 rx->data.qpl = NULL; 38 - kfree(rx->data.page_info); 38 + kvfree(rx->data.page_info); 39 39 40 40 slots = rx->data.mask + 1; 41 41 bytes = sizeof(*rx->data.data_ring) * slots; ··· 168 168 rx->q_resources, rx->q_resources_bus); 169 169 rx->q_resources = NULL; 170 170 abort_filled: 171 - kfree(rx->data.page_info); 171 + kvfree(rx->data.page_info); 172 172 abort_with_slots: 173 173 bytes = sizeof(*rx->data.data_ring) * slots; 174 174 dma_free_coherent(hdev, bytes, rx->data.data_ring, rx->data.data_bus);
-5
drivers/net/ethernet/jme.c
··· 582 582 if (unlikely(!(txring->bufinf))) 583 583 goto err_free_txring; 584 584 585 - /* 586 - * Initialize Transmit Descriptors 587 - */ 588 - memset(txring->alloc, 0, TX_RING_ALLOC_SIZE(jme->tx_ring_size)); 589 - 590 585 return 0; 591 586 592 587 err_free_txring:
-2
drivers/net/ethernet/marvell/skge.c
··· 2558 2558 goto free_pci_mem; 2559 2559 } 2560 2560 2561 - memset(skge->mem, 0, skge->mem_size); 2562 - 2563 2561 err = skge_ring_alloc(&skge->rx_ring, skge->mem, skge->dma); 2564 2562 if (err) 2565 2563 goto free_pci_mem;
+7
drivers/net/ethernet/marvell/sky2.c
··· 4917 4917 DMI_MATCH(DMI_PRODUCT_NAME, "P-79"), 4918 4918 }, 4919 4919 }, 4920 + { 4921 + .ident = "ASUS P5W DH Deluxe", 4922 + .matches = { 4923 + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTEK COMPUTER INC"), 4924 + DMI_MATCH(DMI_PRODUCT_NAME, "P5W DH Deluxe"), 4925 + }, 4926 + }, 4920 4927 {} 4921 4928 }; 4922 4929
+3 -1
drivers/net/ethernet/mediatek/mtk_eth_soc.c
··· 2548 2548 continue; 2549 2549 2550 2550 err = mtk_add_mac(eth, mac_np); 2551 - if (err) 2551 + if (err) { 2552 + of_node_put(mac_np); 2552 2553 goto err_deinit_hw; 2554 + } 2553 2555 } 2554 2556 2555 2557 if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) {
-2
drivers/net/ethernet/mellanox/mlx4/eq.c
··· 1013 1013 1014 1014 dma_list[i] = t; 1015 1015 eq->page_list[i].map = t; 1016 - 1017 - memset(eq->page_list[i].buf, 0, PAGE_SIZE); 1018 1016 } 1019 1017 1020 1018 eq->eqn = mlx4_bitmap_alloc(&priv->eq_table.bitmap);
+7 -6
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
··· 1499 1499 *match_level = MLX5_MATCH_NONE; 1500 1500 1501 1501 if (dissector->used_keys & 1502 - ~(BIT(FLOW_DISSECTOR_KEY_CONTROL) | 1502 + ~(BIT(FLOW_DISSECTOR_KEY_META) | 1503 + BIT(FLOW_DISSECTOR_KEY_CONTROL) | 1503 1504 BIT(FLOW_DISSECTOR_KEY_BASIC) | 1504 1505 BIT(FLOW_DISSECTOR_KEY_ETH_ADDRS) | 1505 1506 BIT(FLOW_DISSECTOR_KEY_VLAN) | ··· 1523 1522 return -EOPNOTSUPP; 1524 1523 } 1525 1524 1526 - if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) || 1527 - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) || 1528 - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_KEYID) || 1529 - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS) || 1530 - flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_OPTS)) { 1525 + if (mlx5e_get_tc_tun(filter_dev)) { 1531 1526 if (parse_tunnel_attr(priv, spec, f, filter_dev, tunnel_match_level)) 1532 1527 return -EOPNOTSUPP; 1533 1528 ··· 2644 2647 family = ip_tunnel_info_af(tun_info); 2645 2648 key.ip_tun_key = &tun_info->key; 2646 2649 key.tc_tunnel = mlx5e_get_tc_tun(mirred_dev); 2650 + if (!key.tc_tunnel) { 2651 + NL_SET_ERR_MSG_MOD(extack, "Unsupported tunnel"); 2652 + return -EOPNOTSUPP; 2653 + } 2647 2654 2648 2655 hash_key = hash_encap_info(&key); 2649 2656
-1
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
··· 2450 2450 MLX5_SET(query_vport_counter_in, in, vport_number, vport->vport); 2451 2451 MLX5_SET(query_vport_counter_in, in, other_vport, 1); 2452 2452 2453 - memset(out, 0, outlen); 2454 2453 err = mlx5_cmd_exec(esw->dev, in, sizeof(in), out, outlen); 2455 2454 if (err) 2456 2455 goto free_out;
-3
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
··· 1134 1134 } 1135 1135 1136 1136 /* create send-to-vport group */ 1137 - memset(flow_group_in, 0, inlen); 1138 1137 MLX5_SET(create_flow_group_in, flow_group_in, match_criteria_enable, 1139 1138 MLX5_MATCH_MISC_PARAMETERS); 1140 1139 ··· 1292 1293 return -ENOMEM; 1293 1294 1294 1295 /* create vport rx group */ 1295 - memset(flow_group_in, 0, inlen); 1296 - 1297 1296 esw_set_flow_group_source_port(esw, flow_group_in); 1298 1297 1299 1298 MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 0);
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/health.c
··· 597 597 err = devlink_fmsg_arr_pair_nest_end(fmsg); 598 598 599 599 free_data: 600 - kfree(cr_data); 600 + kvfree(cr_data); 601 601 return err; 602 602 } 603 603
-1
drivers/net/ethernet/mellanox/mlxsw/pci.c
··· 847 847 &mem_item->mapaddr); 848 848 if (!mem_item->buf) 849 849 return -ENOMEM; 850 - memset(mem_item->buf, 0, mem_item->size); 851 850 852 851 q->elem_info = kcalloc(q->count, sizeof(*q->elem_info), GFP_KERNEL); 853 852 if (!q->elem_info) {
+1
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
··· 830 830 struct tc_prio_qopt_offload *p); 831 831 832 832 /* spectrum_fid.c */ 833 + bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index); 833 834 bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid); 834 835 struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp, 835 836 u16 fid_index);
+8 -8
drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c
··· 408 408 have_dscp = mlxsw_sp_port_dcb_app_prio_dscp_map(mlxsw_sp_port, 409 409 &prio_map); 410 410 411 - if (!have_dscp) { 412 - err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, 413 - MLXSW_REG_QPTS_TRUST_STATE_PCP); 414 - if (err) 415 - netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n"); 416 - return err; 417 - } 418 - 419 411 mlxsw_sp_port_dcb_app_dscp_prio_map(mlxsw_sp_port, default_prio, 420 412 &dscp_map); 421 413 err = mlxsw_sp_port_dcb_app_update_qpdpm(mlxsw_sp_port, ··· 421 429 &prio_map); 422 430 if (err) { 423 431 netdev_err(mlxsw_sp_port->dev, "Couldn't configure DSCP rewrite map\n"); 432 + return err; 433 + } 434 + 435 + if (!have_dscp) { 436 + err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, 437 + MLXSW_REG_QPTS_TRUST_STATE_PCP); 438 + if (err) 439 + netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n"); 424 440 return err; 425 441 } 426 442
+10
drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c
··· 126 126 [MLXSW_SP_FLOOD_TYPE_MC] = mlxsw_sp_sfgc_mc_packet_types, 127 127 }; 128 128 129 + bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index) 130 + { 131 + enum mlxsw_sp_fid_type fid_type = MLXSW_SP_FID_TYPE_DUMMY; 132 + struct mlxsw_sp_fid_family *fid_family; 133 + 134 + fid_family = mlxsw_sp->fid_core->fid_family_arr[fid_type]; 135 + 136 + return fid_family->start_index == fid_index; 137 + } 138 + 129 139 bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid) 130 140 { 131 141 return fid->fid_family->lag_vid_valid;
+6
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
··· 2468 2468 goto just_remove; 2469 2469 } 2470 2470 2471 + if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid)) 2472 + goto just_remove; 2473 + 2471 2474 mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid); 2472 2475 if (!mlxsw_sp_port_vlan) { 2473 2476 netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n"); ··· 2529 2526 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Cannot find port representor for LAG\n"); 2530 2527 goto just_remove; 2531 2528 } 2529 + 2530 + if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid)) 2531 + goto just_remove; 2532 2532 2533 2533 mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid); 2534 2534 if (!mlxsw_sp_port_vlan) {
+4 -1
drivers/net/ethernet/mscc/ocelot_board.c
··· 291 291 continue; 292 292 293 293 err = ocelot_probe_port(ocelot, port, regs, phy); 294 - if (err) 294 + if (err) { 295 + of_node_put(portnp); 295 296 return err; 297 + } 296 298 297 299 phy_mode = of_get_phy_mode(portnp); 298 300 if (phy_mode < 0) ··· 320 318 dev_err(ocelot->dev, 321 319 "invalid phy mode for port%d, (Q)SGMII only\n", 322 320 port); 321 + of_node_put(portnp); 323 322 return -EINVAL; 324 323 } 325 324
-1
drivers/net/ethernet/neterion/s2io.c
··· 747 747 return -ENOMEM; 748 748 } 749 749 mem_allocated += size; 750 - memset(tmp_v_addr, 0, size); 751 750 752 751 size = sizeof(struct rxd_info) * 753 752 rxd_count[nic->rxd_mode];
-3
drivers/net/ethernet/qlogic/netxen/netxen_nic_ctx.c
··· 442 442 goto out_free_rq; 443 443 } 444 444 445 - memset(rq_addr, 0, rq_size); 446 445 prq = rq_addr; 447 446 448 - memset(rsp_addr, 0, rsp_size); 449 447 prsp = rsp_addr; 450 448 451 449 prq->host_rsp_dma_addr = cpu_to_le64(rsp_phys_addr); ··· 753 755 return -ENOMEM; 754 756 } 755 757 756 - memset(addr, 0, sizeof(struct netxen_ring_ctx)); 757 758 recv_ctx->hwctx = addr; 758 759 recv_ctx->hwctx->ctx_id = cpu_to_le32(port); 759 760 recv_ctx->hwctx->cmd_consumer_offset =
+137
drivers/net/ethernet/realtek/r8169_main.c
··· 4667 4667 /* disable aspm and clock request before access ephy */ 4668 4668 rtl_hw_aspm_clkreq_enable(tp, false); 4669 4669 rtl_ephy_init(tp, e_info_8411_2); 4670 + 4671 + /* The following Realtek-provided magic fixes an issue with the RX unit 4672 + * getting confused after the PHY having been powered-down. 4673 + */ 4674 + r8168_mac_ocp_write(tp, 0xFC28, 0x0000); 4675 + r8168_mac_ocp_write(tp, 0xFC2A, 0x0000); 4676 + r8168_mac_ocp_write(tp, 0xFC2C, 0x0000); 4677 + r8168_mac_ocp_write(tp, 0xFC2E, 0x0000); 4678 + r8168_mac_ocp_write(tp, 0xFC30, 0x0000); 4679 + r8168_mac_ocp_write(tp, 0xFC32, 0x0000); 4680 + r8168_mac_ocp_write(tp, 0xFC34, 0x0000); 4681 + r8168_mac_ocp_write(tp, 0xFC36, 0x0000); 4682 + mdelay(3); 4683 + r8168_mac_ocp_write(tp, 0xFC26, 0x0000); 4684 + 4685 + r8168_mac_ocp_write(tp, 0xF800, 0xE008); 4686 + r8168_mac_ocp_write(tp, 0xF802, 0xE00A); 4687 + r8168_mac_ocp_write(tp, 0xF804, 0xE00C); 4688 + r8168_mac_ocp_write(tp, 0xF806, 0xE00E); 4689 + r8168_mac_ocp_write(tp, 0xF808, 0xE027); 4690 + r8168_mac_ocp_write(tp, 0xF80A, 0xE04F); 4691 + r8168_mac_ocp_write(tp, 0xF80C, 0xE05E); 4692 + r8168_mac_ocp_write(tp, 0xF80E, 0xE065); 4693 + r8168_mac_ocp_write(tp, 0xF810, 0xC602); 4694 + r8168_mac_ocp_write(tp, 0xF812, 0xBE00); 4695 + r8168_mac_ocp_write(tp, 0xF814, 0x0000); 4696 + r8168_mac_ocp_write(tp, 0xF816, 0xC502); 4697 + r8168_mac_ocp_write(tp, 0xF818, 0xBD00); 4698 + r8168_mac_ocp_write(tp, 0xF81A, 0x074C); 4699 + r8168_mac_ocp_write(tp, 0xF81C, 0xC302); 4700 + r8168_mac_ocp_write(tp, 0xF81E, 0xBB00); 4701 + r8168_mac_ocp_write(tp, 0xF820, 0x080A); 4702 + r8168_mac_ocp_write(tp, 0xF822, 0x6420); 4703 + r8168_mac_ocp_write(tp, 0xF824, 0x48C2); 4704 + r8168_mac_ocp_write(tp, 0xF826, 0x8C20); 4705 + r8168_mac_ocp_write(tp, 0xF828, 0xC516); 4706 + r8168_mac_ocp_write(tp, 0xF82A, 0x64A4); 4707 + r8168_mac_ocp_write(tp, 0xF82C, 0x49C0); 4708 + r8168_mac_ocp_write(tp, 0xF82E, 0xF009); 4709 + r8168_mac_ocp_write(tp, 0xF830, 0x74A2); 4710 + r8168_mac_ocp_write(tp, 0xF832, 0x8CA5); 4711 + r8168_mac_ocp_write(tp, 0xF834, 0x74A0); 4712 + r8168_mac_ocp_write(tp, 0xF836, 0xC50E); 4713 + r8168_mac_ocp_write(tp, 0xF838, 0x9CA2); 4714 + r8168_mac_ocp_write(tp, 0xF83A, 0x1C11); 4715 + r8168_mac_ocp_write(tp, 0xF83C, 0x9CA0); 4716 + r8168_mac_ocp_write(tp, 0xF83E, 0xE006); 4717 + r8168_mac_ocp_write(tp, 0xF840, 0x74F8); 4718 + r8168_mac_ocp_write(tp, 0xF842, 0x48C4); 4719 + r8168_mac_ocp_write(tp, 0xF844, 0x8CF8); 4720 + r8168_mac_ocp_write(tp, 0xF846, 0xC404); 4721 + r8168_mac_ocp_write(tp, 0xF848, 0xBC00); 4722 + r8168_mac_ocp_write(tp, 0xF84A, 0xC403); 4723 + r8168_mac_ocp_write(tp, 0xF84C, 0xBC00); 4724 + r8168_mac_ocp_write(tp, 0xF84E, 0x0BF2); 4725 + r8168_mac_ocp_write(tp, 0xF850, 0x0C0A); 4726 + r8168_mac_ocp_write(tp, 0xF852, 0xE434); 4727 + r8168_mac_ocp_write(tp, 0xF854, 0xD3C0); 4728 + r8168_mac_ocp_write(tp, 0xF856, 0x49D9); 4729 + r8168_mac_ocp_write(tp, 0xF858, 0xF01F); 4730 + r8168_mac_ocp_write(tp, 0xF85A, 0xC526); 4731 + r8168_mac_ocp_write(tp, 0xF85C, 0x64A5); 4732 + r8168_mac_ocp_write(tp, 0xF85E, 0x1400); 4733 + r8168_mac_ocp_write(tp, 0xF860, 0xF007); 4734 + r8168_mac_ocp_write(tp, 0xF862, 0x0C01); 4735 + r8168_mac_ocp_write(tp, 0xF864, 0x8CA5); 4736 + r8168_mac_ocp_write(tp, 0xF866, 0x1C15); 4737 + r8168_mac_ocp_write(tp, 0xF868, 0xC51B); 4738 + r8168_mac_ocp_write(tp, 0xF86A, 0x9CA0); 4739 + r8168_mac_ocp_write(tp, 0xF86C, 0xE013); 4740 + r8168_mac_ocp_write(tp, 0xF86E, 0xC519); 4741 + r8168_mac_ocp_write(tp, 0xF870, 0x74A0); 4742 + r8168_mac_ocp_write(tp, 0xF872, 0x48C4); 4743 + r8168_mac_ocp_write(tp, 0xF874, 0x8CA0); 4744 + r8168_mac_ocp_write(tp, 0xF876, 0xC516); 4745 + r8168_mac_ocp_write(tp, 0xF878, 0x74A4); 4746 + r8168_mac_ocp_write(tp, 0xF87A, 0x48C8); 4747 + r8168_mac_ocp_write(tp, 0xF87C, 0x48CA); 4748 + r8168_mac_ocp_write(tp, 0xF87E, 0x9CA4); 4749 + r8168_mac_ocp_write(tp, 0xF880, 0xC512); 4750 + r8168_mac_ocp_write(tp, 0xF882, 0x1B00); 4751 + r8168_mac_ocp_write(tp, 0xF884, 0x9BA0); 4752 + r8168_mac_ocp_write(tp, 0xF886, 0x1B1C); 4753 + r8168_mac_ocp_write(tp, 0xF888, 0x483F); 4754 + r8168_mac_ocp_write(tp, 0xF88A, 0x9BA2); 4755 + r8168_mac_ocp_write(tp, 0xF88C, 0x1B04); 4756 + r8168_mac_ocp_write(tp, 0xF88E, 0xC508); 4757 + r8168_mac_ocp_write(tp, 0xF890, 0x9BA0); 4758 + r8168_mac_ocp_write(tp, 0xF892, 0xC505); 4759 + r8168_mac_ocp_write(tp, 0xF894, 0xBD00); 4760 + r8168_mac_ocp_write(tp, 0xF896, 0xC502); 4761 + r8168_mac_ocp_write(tp, 0xF898, 0xBD00); 4762 + r8168_mac_ocp_write(tp, 0xF89A, 0x0300); 4763 + r8168_mac_ocp_write(tp, 0xF89C, 0x051E); 4764 + r8168_mac_ocp_write(tp, 0xF89E, 0xE434); 4765 + r8168_mac_ocp_write(tp, 0xF8A0, 0xE018); 4766 + r8168_mac_ocp_write(tp, 0xF8A2, 0xE092); 4767 + r8168_mac_ocp_write(tp, 0xF8A4, 0xDE20); 4768 + r8168_mac_ocp_write(tp, 0xF8A6, 0xD3C0); 4769 + r8168_mac_ocp_write(tp, 0xF8A8, 0xC50F); 4770 + r8168_mac_ocp_write(tp, 0xF8AA, 0x76A4); 4771 + r8168_mac_ocp_write(tp, 0xF8AC, 0x49E3); 4772 + r8168_mac_ocp_write(tp, 0xF8AE, 0xF007); 4773 + r8168_mac_ocp_write(tp, 0xF8B0, 0x49C0); 4774 + r8168_mac_ocp_write(tp, 0xF8B2, 0xF103); 4775 + r8168_mac_ocp_write(tp, 0xF8B4, 0xC607); 4776 + r8168_mac_ocp_write(tp, 0xF8B6, 0xBE00); 4777 + r8168_mac_ocp_write(tp, 0xF8B8, 0xC606); 4778 + r8168_mac_ocp_write(tp, 0xF8BA, 0xBE00); 4779 + r8168_mac_ocp_write(tp, 0xF8BC, 0xC602); 4780 + r8168_mac_ocp_write(tp, 0xF8BE, 0xBE00); 4781 + r8168_mac_ocp_write(tp, 0xF8C0, 0x0C4C); 4782 + r8168_mac_ocp_write(tp, 0xF8C2, 0x0C28); 4783 + r8168_mac_ocp_write(tp, 0xF8C4, 0x0C2C); 4784 + r8168_mac_ocp_write(tp, 0xF8C6, 0xDC00); 4785 + r8168_mac_ocp_write(tp, 0xF8C8, 0xC707); 4786 + r8168_mac_ocp_write(tp, 0xF8CA, 0x1D00); 4787 + r8168_mac_ocp_write(tp, 0xF8CC, 0x8DE2); 4788 + r8168_mac_ocp_write(tp, 0xF8CE, 0x48C1); 4789 + r8168_mac_ocp_write(tp, 0xF8D0, 0xC502); 4790 + r8168_mac_ocp_write(tp, 0xF8D2, 0xBD00); 4791 + r8168_mac_ocp_write(tp, 0xF8D4, 0x00AA); 4792 + r8168_mac_ocp_write(tp, 0xF8D6, 0xE0C0); 4793 + r8168_mac_ocp_write(tp, 0xF8D8, 0xC502); 4794 + r8168_mac_ocp_write(tp, 0xF8DA, 0xBD00); 4795 + r8168_mac_ocp_write(tp, 0xF8DC, 0x0132); 4796 + 4797 + r8168_mac_ocp_write(tp, 0xFC26, 0x8000); 4798 + 4799 + r8168_mac_ocp_write(tp, 0xFC2A, 0x0743); 4800 + r8168_mac_ocp_write(tp, 0xFC2C, 0x0801); 4801 + r8168_mac_ocp_write(tp, 0xFC2E, 0x0BE9); 4802 + r8168_mac_ocp_write(tp, 0xFC30, 0x02FD); 4803 + r8168_mac_ocp_write(tp, 0xFC32, 0x0C25); 4804 + r8168_mac_ocp_write(tp, 0xFC34, 0x00A9); 4805 + r8168_mac_ocp_write(tp, 0xFC36, 0x012D); 4806 + 4670 4807 rtl_hw_aspm_clkreq_enable(tp, true); 4671 4808 } 4672 4809
+3 -3
drivers/net/ethernet/sis/sis900.c
··· 262 262 /* check to see if we have sane EEPROM */ 263 263 signature = (u16) read_eeprom(ioaddr, EEPROMSignature); 264 264 if (signature == 0xffff || signature == 0x0000) { 265 - printk (KERN_WARNING "%s: Error EERPOM read %x\n", 265 + printk (KERN_WARNING "%s: Error EEPROM read %x\n", 266 266 pci_name(pci_dev), signature); 267 267 return 0; 268 268 } ··· 359 359 * 360 360 * SiS962 or SiS963 model, use EEPROM to store MAC address. And EEPROM 361 361 * is shared by 362 - * LAN and 1394. When access EEPROM, send EEREQ signal to hardware first 362 + * LAN and 1394. When accessing EEPROM, send EEREQ signal to hardware first 363 363 * and wait for EEGNT. If EEGNT is ON, EEPROM is permitted to be accessed 364 - * by LAN, otherwise is not. After MAC address is read from EEPROM, send 364 + * by LAN, otherwise it is not. After MAC address is read from EEPROM, send 365 365 * EEDONE signal to refuse EEPROM access by LAN. 366 366 * The EEPROM map of SiS962 or SiS963 is different to SiS900. 367 367 * The signature field in SiS962 or SiS963 spec is meaningless.
+18 -8
drivers/net/ethernet/ti/cpsw.c
··· 2570 2570 ret = PTR_ERR(slave_data->ifphy); 2571 2571 dev_err(&pdev->dev, 2572 2572 "%d: Error retrieving port phy: %d\n", i, ret); 2573 - return ret; 2573 + goto err_node_put; 2574 2574 } 2575 2575 2576 2576 slave_data->slave_node = slave_node; ··· 2589 2589 if (ret) { 2590 2590 if (ret != -EPROBE_DEFER) 2591 2591 dev_err(&pdev->dev, "failed to register fixed-link phy: %d\n", ret); 2592 - return ret; 2592 + goto err_node_put; 2593 2593 } 2594 2594 slave_data->phy_node = of_node_get(slave_node); 2595 2595 } else if (parp) { ··· 2607 2607 of_node_put(mdio_node); 2608 2608 if (!mdio) { 2609 2609 dev_err(&pdev->dev, "Missing mdio platform device\n"); 2610 - return -EINVAL; 2610 + ret = -EINVAL; 2611 + goto err_node_put; 2611 2612 } 2612 2613 snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), 2613 2614 PHY_ID_FMT, mdio->name, phyid); ··· 2623 2622 if (slave_data->phy_if < 0) { 2624 2623 dev_err(&pdev->dev, "Missing or malformed slave[%d] phy-mode property\n", 2625 2624 i); 2626 - return slave_data->phy_if; 2625 + ret = slave_data->phy_if; 2626 + goto err_node_put; 2627 2627 } 2628 2628 2629 2629 no_phy_slave: ··· 2635 2633 ret = ti_cm_get_macid(&pdev->dev, i, 2636 2634 slave_data->mac_addr); 2637 2635 if (ret) 2638 - return ret; 2636 + goto err_node_put; 2639 2637 } 2640 2638 if (data->dual_emac) { 2641 2639 if (of_property_read_u32(slave_node, "dual_emac_res_vlan", ··· 2650 2648 } 2651 2649 2652 2650 i++; 2653 - if (i == data->slaves) 2654 - break; 2651 + if (i == data->slaves) { 2652 + ret = 0; 2653 + goto err_node_put; 2654 + } 2655 2655 } 2656 2656 2657 2657 return 0; 2658 + 2659 + err_node_put: 2660 + of_node_put(slave_node); 2661 + return ret; 2658 2662 } 2659 2663 2660 2664 static void cpsw_remove_dt(struct platform_device *pdev) ··· 2683 2675 of_node_put(slave_data->phy_node); 2684 2676 2685 2677 i++; 2686 - if (i == data->slaves) 2678 + if (i == data->slaves) { 2679 + of_node_put(slave_node); 2687 2680 break; 2681 + } 2688 2682 } 2689 2683 2690 2684 of_platform_depopulate(&pdev->dev);
-1
drivers/net/ethernet/ti/tlan.c
··· 855 855 dev->name); 856 856 return -ENOMEM; 857 857 } 858 - memset(priv->dma_storage, 0, dma_size); 859 858 priv->rx_list = (struct tlan_list *) 860 859 ALIGN((unsigned long)priv->dma_storage, 8); 861 860 priv->rx_list_dma = ALIGN(priv->dma_storage_dma, 8);
-2
drivers/net/hippi/rrunner.c
··· 1196 1196 goto error; 1197 1197 } 1198 1198 rrpriv->rx_ctrl_dma = dma_addr; 1199 - memset(rrpriv->rx_ctrl, 0, 256*sizeof(struct ring_ctrl)); 1200 1199 1201 1200 rrpriv->info = pci_alloc_consistent(pdev, sizeof(struct rr_info), 1202 1201 &dma_addr); ··· 1204 1205 goto error; 1205 1206 } 1206 1207 rrpriv->info_dma = dma_addr; 1207 - memset(rrpriv->info, 0, sizeof(struct rr_info)); 1208 1208 wmb(); 1209 1209 1210 1210 spin_lock_irqsave(&rrpriv->lock, flags);
+1
drivers/net/usb/qmi_wwan.c
··· 1292 1292 {QMI_FIXED_INTF(0x2001, 0x7e16, 3)}, /* D-Link DWM-221 */ 1293 1293 {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ 1294 1294 {QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */ 1295 + {QMI_FIXED_INTF(0x2001, 0x7e3d, 4)}, /* D-Link DWM-222 A2 */ 1295 1296 {QMI_FIXED_INTF(0x2020, 0x2031, 4)}, /* Olicard 600 */ 1296 1297 {QMI_FIXED_INTF(0x2020, 0x2033, 4)}, /* BroadMobi BM806U */ 1297 1298 {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */
-1
drivers/net/vmxnet3/vmxnet3_drv.c
··· 3430 3430 err = -ENOMEM; 3431 3431 goto err_ver; 3432 3432 } 3433 - memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf)); 3434 3433 adapter->coal_conf->coalMode = VMXNET3_COALESCE_DISABLED; 3435 3434 adapter->default_coal_mode = true; 3436 3435 }
+2
drivers/net/wireless/ath/ath10k/mac.c
··· 7541 7541 &vht_nss, 7542 7542 true); 7543 7543 update_bitrate_mask = false; 7544 + } else { 7545 + vht_pfr = 0; 7544 7546 } 7545 7547 7546 7548 mutex_lock(&ar->conf_mutex);
+53
drivers/net/wireless/intel/iwlwifi/cfg/22000.c
··· 80 80 #define IWL_22000_QU_B_HR_B_FW_PRE "iwlwifi-Qu-b0-hr-b0-" 81 81 #define IWL_22000_HR_B_FW_PRE "iwlwifi-QuQnj-b0-hr-b0-" 82 82 #define IWL_22000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-" 83 + #define IWL_QU_C_HR_B_FW_PRE "iwlwifi-Qu-c0-hr-b0-" 83 84 #define IWL_QU_B_JF_B_FW_PRE "iwlwifi-Qu-b0-jf-b0-" 85 + #define IWL_QU_C_JF_B_FW_PRE "iwlwifi-Qu-c0-jf-b0-" 84 86 #define IWL_QUZ_A_HR_B_FW_PRE "iwlwifi-QuZ-a0-hr-b0-" 85 87 #define IWL_QUZ_A_JF_B_FW_PRE "iwlwifi-QuZ-a0-jf-b0-" 86 88 #define IWL_QNJ_B_JF_B_FW_PRE "iwlwifi-QuQnj-b0-jf-b0-" ··· 111 109 IWL_QUZ_A_HR_B_FW_PRE __stringify(api) ".ucode" 112 110 #define IWL_QUZ_A_JF_B_MODULE_FIRMWARE(api) \ 113 111 IWL_QUZ_A_JF_B_FW_PRE __stringify(api) ".ucode" 112 + #define IWL_QU_C_HR_B_MODULE_FIRMWARE(api) \ 113 + IWL_QU_C_HR_B_FW_PRE __stringify(api) ".ucode" 114 114 #define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \ 115 115 IWL_QU_B_JF_B_FW_PRE __stringify(api) ".ucode" 116 116 #define IWL_QNJ_B_JF_B_MODULE_FIRMWARE(api) \ ··· 260 256 .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, 261 257 }; 262 258 259 + const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0 = { 260 + .name = "Intel(R) Wi-Fi 6 AX101", 261 + .fw_name_pre = IWL_QU_C_HR_B_FW_PRE, 262 + IWL_DEVICE_22500, 263 + /* 264 + * This device doesn't support receiving BlockAck with a large bitmap 265 + * so we need to restrict the size of transmitted aggregation to the 266 + * HT size; mac80211 would otherwise pick the HE max (256) by default. 267 + */ 268 + .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, 269 + }; 270 + 271 + const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0 = { 272 + .name = "Intel(R) Wi-Fi 6 AX201 160MHz", 273 + .fw_name_pre = IWL_QU_C_HR_B_FW_PRE, 274 + IWL_DEVICE_22500, 275 + /* 276 + * This device doesn't support receiving BlockAck with a large bitmap 277 + * so we need to restrict the size of transmitted aggregation to the 278 + * HT size; mac80211 would otherwise pick the HE max (256) by default. 279 + */ 280 + .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, 281 + }; 282 + 263 283 const struct iwl_cfg iwl_ax101_cfg_quz_hr = { 264 284 .name = "Intel(R) Wi-Fi 6 AX101", 265 285 .fw_name_pre = IWL_QUZ_A_HR_B_FW_PRE, ··· 397 369 const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0 = { 398 370 .name = "Intel(R) Wireless-AC 9560 160MHz", 399 371 .fw_name_pre = IWL_QU_B_JF_B_FW_PRE, 372 + IWL_DEVICE_22500, 373 + }; 374 + 375 + const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0 = { 376 + .name = "Intel(R) Wireless-AC 9461", 377 + .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, 378 + IWL_DEVICE_22500, 379 + }; 380 + 381 + const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0 = { 382 + .name = "Intel(R) Wireless-AC 9462", 383 + .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, 384 + IWL_DEVICE_22500, 385 + }; 386 + 387 + const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0 = { 388 + .name = "Intel(R) Wireless-AC 9560", 389 + .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, 390 + IWL_DEVICE_22500, 391 + }; 392 + 393 + const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0 = { 394 + .name = "Intel(R) Wireless-AC 9560 160MHz", 395 + .fw_name_pre = IWL_QU_C_JF_B_FW_PRE, 400 396 IWL_DEVICE_22500, 401 397 }; 402 398 ··· 642 590 MODULE_FIRMWARE(IWL_22000_HR_B_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); 643 591 MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); 644 592 MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); 593 + MODULE_FIRMWARE(IWL_QU_C_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); 645 594 MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); 646 595 MODULE_FIRMWARE(IWL_QUZ_A_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); 647 596 MODULE_FIRMWARE(IWL_QUZ_A_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX));
+7
drivers/net/wireless/intel/iwlwifi/iwl-config.h
··· 565 565 extern const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb; 566 566 extern const struct iwl_cfg iwl22000_2ac_cfg_jf; 567 567 extern const struct iwl_cfg iwl_ax101_cfg_qu_hr; 568 + extern const struct iwl_cfg iwl_ax101_cfg_qu_c0_hr_b0; 568 569 extern const struct iwl_cfg iwl_ax101_cfg_quz_hr; 569 570 extern const struct iwl_cfg iwl22000_2ax_cfg_hr; 570 571 extern const struct iwl_cfg iwl_ax200_cfg_cc; 571 572 extern const struct iwl_cfg iwl_ax201_cfg_qu_hr; 573 + extern const struct iwl_cfg iwl_ax201_cfg_qu_hr; 574 + extern const struct iwl_cfg iwl_ax201_cfg_qu_c0_hr_b0; 572 575 extern const struct iwl_cfg iwl_ax201_cfg_quz_hr; 573 576 extern const struct iwl_cfg iwl_ax1650i_cfg_quz_hr; 574 577 extern const struct iwl_cfg iwl_ax1650s_cfg_quz_hr; ··· 583 580 extern const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0; 584 581 extern const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0; 585 582 extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_b0_jf_b0; 583 + extern const struct iwl_cfg iwl9461_2ac_cfg_qu_c0_jf_b0; 584 + extern const struct iwl_cfg iwl9462_2ac_cfg_qu_c0_jf_b0; 585 + extern const struct iwl_cfg iwl9560_2ac_cfg_qu_c0_jf_b0; 586 + extern const struct iwl_cfg iwl9560_2ac_160_cfg_qu_c0_jf_b0; 586 587 extern const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0; 587 588 extern const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0; 588 589 extern const struct iwl_cfg iwl22000_2ax_cfg_jf;
+2
drivers/net/wireless/intel/iwlwifi/iwl-csr.h
··· 328 328 #define CSR_HW_REV_TYPE_NONE (0x00001F0) 329 329 #define CSR_HW_REV_TYPE_QNJ (0x0000360) 330 330 #define CSR_HW_REV_TYPE_QNJ_B0 (0x0000364) 331 + #define CSR_HW_REV_TYPE_QU_B0 (0x0000334) 332 + #define CSR_HW_REV_TYPE_QU_C0 (0x0000338) 331 333 #define CSR_HW_REV_TYPE_QUZ (0x0000354) 332 334 #define CSR_HW_REV_TYPE_HR_CDB (0x0000340) 333 335 #define CSR_HW_REV_TYPE_SO (0x0000370)
+23
drivers/net/wireless/intel/iwlwifi/pcie/drv.c
··· 604 604 {IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)}, 605 605 {IWL_PCI_DEVICE(0x2526, 0x4234, iwl9560_2ac_cfg_soc)}, 606 606 {IWL_PCI_DEVICE(0x2526, 0x42A4, iwl9462_2ac_cfg_soc)}, 607 + {IWL_PCI_DEVICE(0x2526, 0x6014, iwl9260_2ac_160_cfg)}, 607 608 {IWL_PCI_DEVICE(0x2526, 0x8014, iwl9260_2ac_160_cfg)}, 608 609 {IWL_PCI_DEVICE(0x2526, 0x8010, iwl9260_2ac_160_cfg)}, 609 610 {IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_160_cfg)}, ··· 972 971 {IWL_PCI_DEVICE(0x7A70, 0x0310, iwlax211_2ax_cfg_so_gf_a0)}, 973 972 {IWL_PCI_DEVICE(0x7A70, 0x0510, iwlax211_2ax_cfg_so_gf_a0)}, 974 973 {IWL_PCI_DEVICE(0x7A70, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)}, 974 + {IWL_PCI_DEVICE(0x7AF0, 0x0090, iwlax211_2ax_cfg_so_gf_a0)}, 975 975 {IWL_PCI_DEVICE(0x7AF0, 0x0310, iwlax211_2ax_cfg_so_gf_a0)}, 976 976 {IWL_PCI_DEVICE(0x7AF0, 0x0510, iwlax211_2ax_cfg_so_gf_a0)}, 977 977 {IWL_PCI_DEVICE(0x7AF0, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)}, ··· 1038 1036 cfg = &iwl22000_2ac_cfg_hr; 1039 1037 } 1040 1038 iwl_trans->cfg = cfg; 1039 + } 1040 + 1041 + /* 1042 + * This is a hack to switch from Qu B0 to Qu C0. We need to 1043 + * do this for all cfgs that use Qu B0. All this code is in 1044 + * urgent need for a refactor, but for now this is the easiest 1045 + * thing to do to support Qu C-step. 1046 + */ 1047 + if (iwl_trans->hw_rev == CSR_HW_REV_TYPE_QU_C0) { 1048 + if (iwl_trans->cfg == &iwl_ax101_cfg_qu_hr) 1049 + iwl_trans->cfg = &iwl_ax101_cfg_qu_c0_hr_b0; 1050 + else if (iwl_trans->cfg == &iwl_ax201_cfg_qu_hr) 1051 + iwl_trans->cfg = &iwl_ax201_cfg_qu_c0_hr_b0; 1052 + else if (iwl_trans->cfg == &iwl9461_2ac_cfg_qu_b0_jf_b0) 1053 + iwl_trans->cfg = &iwl9461_2ac_cfg_qu_c0_jf_b0; 1054 + else if (iwl_trans->cfg == &iwl9462_2ac_cfg_qu_b0_jf_b0) 1055 + iwl_trans->cfg = &iwl9462_2ac_cfg_qu_c0_jf_b0; 1056 + else if (iwl_trans->cfg == &iwl9560_2ac_cfg_qu_b0_jf_b0) 1057 + iwl_trans->cfg = &iwl9560_2ac_cfg_qu_c0_jf_b0; 1058 + else if (iwl_trans->cfg == &iwl9560_2ac_160_cfg_qu_b0_jf_b0) 1059 + iwl_trans->cfg = &iwl9560_2ac_160_cfg_qu_c0_jf_b0; 1041 1060 } 1042 1061 #endif 1043 1062
+6 -6
drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
··· 372 372 struct queue_entry *entry = (struct queue_entry *)urb->context; 373 373 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 374 374 375 - if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) 375 + if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) 376 376 return; 377 - 378 - /* 379 - * Report the frame as DMA done 380 - */ 381 - rt2x00lib_dmadone(entry); 382 377 383 378 /* 384 379 * Check if the received data is simply too small ··· 382 387 */ 383 388 if (urb->actual_length < entry->queue->desc_size || urb->status) 384 389 set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); 390 + 391 + /* 392 + * Report the frame as DMA done 393 + */ 394 + rt2x00lib_dmadone(entry); 385 395 386 396 /* 387 397 * Schedule the delayed work for reading the RX status
+1 -1
include/linux/filter.h
··· 747 747 return size <= size_default && (size & (size - 1)) == 0; 748 748 } 749 749 750 - #define bpf_ctx_wide_store_ok(off, size, type, field) \ 750 + #define bpf_ctx_wide_access_ok(off, size, type, field) \ 751 751 (size == sizeof(__u64) && \ 752 752 off >= offsetof(type, field) && \ 753 753 off + sizeof(__u64) <= offsetofend(type, field) && \
+2 -1
include/net/tcp.h
··· 1064 1064 void tcp_get_available_congestion_control(char *buf, size_t len); 1065 1065 void tcp_get_allowed_congestion_control(char *buf, size_t len); 1066 1066 int tcp_set_allowed_congestion_control(char *allowed); 1067 - int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool reinit); 1067 + int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, 1068 + bool reinit, bool cap_net_admin); 1068 1069 u32 tcp_slow_start(struct tcp_sock *tp, u32 acked); 1069 1070 void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked); 1070 1071
+2 -2
include/uapi/linux/bpf.h
··· 3248 3248 __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. 3249 3249 * Stored in network byte order. 3250 3250 */ 3251 - __u32 user_ip6[4]; /* Allows 1,2,4-byte read and 4,8-byte write. 3251 + __u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. 3252 3252 * Stored in network byte order. 3253 3253 */ 3254 3254 __u32 user_port; /* Allows 4-byte read and write. ··· 3260 3260 __u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write. 3261 3261 * Stored in network byte order. 3262 3262 */ 3263 - __u32 msg_src_ip6[4]; /* Allows 1,2,4-byte read and 4,8-byte write. 3263 + __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. 3264 3264 * Stored in network byte order. 3265 3265 */ 3266 3266 __bpf_md_ptr(struct bpf_sock *, sk);
+1 -1
include/uapi/linux/pkt_sched.h
··· 1174 1174 TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME, /* s64 */ 1175 1175 TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION, /* s64 */ 1176 1176 TCA_TAPRIO_ATTR_FLAGS, /* u32 */ 1177 - TCA_TAPRIO_ATTR_TXTIME_DELAY, /* s32 */ 1177 + TCA_TAPRIO_ATTR_TXTIME_DELAY, /* u32 */ 1178 1178 __TCA_TAPRIO_ATTR_MAX, 1179 1179 }; 1180 1180
+12 -7
kernel/bpf/btf.c
··· 1073 1073 !btf_type_is_var(size_type))) 1074 1074 return NULL; 1075 1075 1076 - size = btf->resolved_sizes[size_type_id]; 1077 1076 size_type_id = btf->resolved_ids[size_type_id]; 1078 1077 size_type = btf_type_by_id(btf, size_type_id); 1079 1078 if (btf_type_nosize_or_null(size_type)) 1079 + return NULL; 1080 + else if (btf_type_has_size(size_type)) 1081 + size = size_type->size; 1082 + else if (btf_type_is_array(size_type)) 1083 + size = btf->resolved_sizes[size_type_id]; 1084 + else if (btf_type_is_ptr(size_type)) 1085 + size = sizeof(void *); 1086 + else 1080 1087 return NULL; 1081 1088 } 1082 1089 ··· 1609 1602 const struct btf_type *next_type; 1610 1603 u32 next_type_id = t->type; 1611 1604 struct btf *btf = env->btf; 1612 - u32 next_type_size = 0; 1613 1605 1614 1606 next_type = btf_type_by_id(btf, next_type_id); 1615 1607 if (!next_type || btf_type_is_resolve_source_only(next_type)) { ··· 1626 1620 * save us a few type-following when we use it later (e.g. in 1627 1621 * pretty print). 1628 1622 */ 1629 - if (!btf_type_id_size(btf, &next_type_id, &next_type_size)) { 1623 + if (!btf_type_id_size(btf, &next_type_id, NULL)) { 1630 1624 if (env_type_is_resolved(env, next_type_id)) 1631 1625 next_type = btf_type_id_resolve(btf, &next_type_id); 1632 1626 ··· 1639 1633 } 1640 1634 } 1641 1635 1642 - env_stack_pop_resolved(env, next_type_id, next_type_size); 1636 + env_stack_pop_resolved(env, next_type_id, 0); 1643 1637 1644 1638 return 0; 1645 1639 } ··· 1651 1645 const struct btf_type *t = v->t; 1652 1646 u32 next_type_id = t->type; 1653 1647 struct btf *btf = env->btf; 1654 - u32 next_type_size; 1655 1648 1656 1649 next_type = btf_type_by_id(btf, next_type_id); 1657 1650 if (!next_type || btf_type_is_resolve_source_only(next_type)) { ··· 1680 1675 * forward types or similar that would resolve to size of 1681 1676 * zero is allowed. 1682 1677 */ 1683 - if (!btf_type_id_size(btf, &next_type_id, &next_type_size)) { 1678 + if (!btf_type_id_size(btf, &next_type_id, NULL)) { 1684 1679 btf_verifier_log_type(env, v->t, "Invalid type_id"); 1685 1680 return -EINVAL; 1686 1681 } 1687 1682 1688 - env_stack_pop_resolved(env, next_type_id, next_type_size); 1683 + env_stack_pop_resolved(env, next_type_id, 0); 1689 1684 1690 1685 return 0; 1691 1686 }
+6 -7
kernel/bpf/verifier.c
··· 1519 1519 return -EFAULT; 1520 1520 } 1521 1521 *stack_mask |= 1ull << spi; 1522 - } else if (class == BPF_STX) { 1522 + } else if (class == BPF_STX || class == BPF_ST) { 1523 1523 if (*reg_mask & dreg) 1524 - /* stx shouldn't be using _scalar_ dst_reg 1524 + /* stx & st shouldn't be using _scalar_ dst_reg 1525 1525 * to access memory. It means backtracking 1526 1526 * encountered a case of pointer subtraction. 1527 1527 */ ··· 1540 1540 if (!(*stack_mask & (1ull << spi))) 1541 1541 return 0; 1542 1542 *stack_mask &= ~(1ull << spi); 1543 - *reg_mask |= sreg; 1543 + if (class == BPF_STX) 1544 + *reg_mask |= sreg; 1544 1545 } else if (class == BPF_JMP || class == BPF_JMP32) { 1545 1546 if (opcode == BPF_CALL) { 1546 1547 if (insn->src_reg == BPF_PSEUDO_CALL) ··· 1569 1568 */ 1570 1569 if (mode == BPF_IND || mode == BPF_ABS) 1571 1570 /* to be analyzed */ 1572 - return -ENOTSUPP; 1573 - } else if (class == BPF_ST) { 1574 - if (*reg_mask & dreg) 1575 - /* likely pointer subtraction */ 1576 1571 return -ENOTSUPP; 1577 1572 } 1578 1573 return 0; ··· 6103 6106 if (env->prog->expected_attach_type == BPF_CGROUP_UDP4_RECVMSG || 6104 6107 env->prog->expected_attach_type == BPF_CGROUP_UDP6_RECVMSG) 6105 6108 range = tnum_range(1, 1); 6109 + break; 6106 6110 case BPF_PROG_TYPE_CGROUP_SKB: 6107 6111 if (env->prog->expected_attach_type == BPF_CGROUP_INET_EGRESS) { 6108 6112 range = tnum_range(0, 3); 6109 6113 enforce_attach_type_range = tnum_range(2, 3); 6110 6114 } 6115 + break; 6111 6116 case BPF_PROG_TYPE_CGROUP_SOCK: 6112 6117 case BPF_PROG_TYPE_SOCK_OPS: 6113 6118 case BPF_PROG_TYPE_CGROUP_DEVICE:
+18 -8
net/core/filter.c
··· 4335 4335 TCP_CA_NAME_MAX-1)); 4336 4336 name[TCP_CA_NAME_MAX-1] = 0; 4337 4337 ret = tcp_set_congestion_control(sk, name, false, 4338 - reinit); 4338 + reinit, true); 4339 4339 } else { 4340 4340 struct tcp_sock *tp = tcp_sk(sk); 4341 4341 ··· 6884 6884 case bpf_ctx_range(struct bpf_sock_addr, msg_src_ip4): 6885 6885 case bpf_ctx_range_till(struct bpf_sock_addr, msg_src_ip6[0], 6886 6886 msg_src_ip6[3]): 6887 - /* Only narrow read access allowed for now. */ 6888 6887 if (type == BPF_READ) { 6889 6888 bpf_ctx_record_field_size(info, size_default); 6889 + 6890 + if (bpf_ctx_wide_access_ok(off, size, 6891 + struct bpf_sock_addr, 6892 + user_ip6)) 6893 + return true; 6894 + 6895 + if (bpf_ctx_wide_access_ok(off, size, 6896 + struct bpf_sock_addr, 6897 + msg_src_ip6)) 6898 + return true; 6899 + 6890 6900 if (!bpf_ctx_narrow_access_ok(off, size, size_default)) 6891 6901 return false; 6892 6902 } else { 6893 - if (bpf_ctx_wide_store_ok(off, size, 6894 - struct bpf_sock_addr, 6895 - user_ip6)) 6903 + if (bpf_ctx_wide_access_ok(off, size, 6904 + struct bpf_sock_addr, 6905 + user_ip6)) 6896 6906 return true; 6897 6907 6898 - if (bpf_ctx_wide_store_ok(off, size, 6899 - struct bpf_sock_addr, 6900 - msg_src_ip6)) 6908 + if (bpf_ctx_wide_access_ok(off, size, 6909 + struct bpf_sock_addr, 6910 + msg_src_ip6)) 6901 6911 return true; 6902 6912 6903 6913 if (size != size_default)
+2
net/core/neighbour.c
··· 1124 1124 1125 1125 atomic_set(&neigh->probes, 1126 1126 NEIGH_VAR(neigh->parms, UCAST_PROBES)); 1127 + neigh_del_timer(neigh); 1127 1128 neigh->nud_state = NUD_INCOMPLETE; 1128 1129 neigh->updated = now; 1129 1130 next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), ··· 1141 1140 } 1142 1141 } else if (neigh->nud_state & NUD_STALE) { 1143 1142 neigh_dbg(2, "neigh %p is delayed\n", neigh); 1143 + neigh_del_timer(neigh); 1144 1144 neigh->nud_state = NUD_DELAY; 1145 1145 neigh->updated = jiffies; 1146 1146 neigh_add_timer(neigh, jiffies +
+1 -1
net/core/skbuff.c
··· 762 762 printk("%sdev name=%s feat=0x%pNF\n", 763 763 level, dev->name, &dev->features); 764 764 if (sk) 765 - printk("%ssk family=%hu type=%hu proto=%hu\n", 765 + printk("%ssk family=%hu type=%u proto=%u\n", 766 766 level, sk->sk_family, sk->sk_type, sk->sk_protocol); 767 767 768 768 if (full_pkt && headroom)
+1
net/dsa/tag_sja1105.c
··· 216 216 if (!skb) { 217 217 dev_err_ratelimited(dp->ds->dev, 218 218 "Failed to copy stampable skb\n"); 219 + spin_unlock(&sp->data->meta_lock); 219 220 return NULL; 220 221 } 221 222 sja1105_transfer_meta(skb, meta);
+5
net/ipv4/fib_frontend.c
··· 388 388 fib_combine_itag(itag, &res); 389 389 390 390 dev_match = fib_info_nh_uses_dev(res.fi, dev); 391 + /* This is not common, loopback packets retain skb_dst so normally they 392 + * would not even hit this slow path. 393 + */ 394 + dev_match = dev_match || (res.type == RTN_LOCAL && 395 + dev == net->loopback_dev); 391 396 if (dev_match) { 392 397 ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_HOST; 393 398 return ret;
+3 -1
net/ipv4/tcp.c
··· 2785 2785 name[val] = 0; 2786 2786 2787 2787 lock_sock(sk); 2788 - err = tcp_set_congestion_control(sk, name, true, true); 2788 + err = tcp_set_congestion_control(sk, name, true, true, 2789 + ns_capable(sock_net(sk)->user_ns, 2790 + CAP_NET_ADMIN)); 2789 2791 release_sock(sk); 2790 2792 return err; 2791 2793 }
+3 -3
net/ipv4/tcp_cong.c
··· 333 333 * tcp_reinit_congestion_control (if the current congestion control was 334 334 * already initialized. 335 335 */ 336 - int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool reinit) 336 + int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, 337 + bool reinit, bool cap_net_admin) 337 338 { 338 339 struct inet_connection_sock *icsk = inet_csk(sk); 339 340 const struct tcp_congestion_ops *ca; ··· 370 369 } else { 371 370 err = -EBUSY; 372 371 } 373 - } else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || 374 - ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))) { 372 + } else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || cap_net_admin)) { 375 373 err = -EPERM; 376 374 } else if (!try_module_get(ca->owner)) { 377 375 err = -EBUSY;
+1 -1
net/ipv4/udp.c
··· 2170 2170 2171 2171 /* Initialize UDP checksum. If exited with zero value (success), 2172 2172 * CHECKSUM_UNNECESSARY means, that no more checks are required. 2173 - * Otherwise, csum completion requires chacksumming packet body, 2173 + * Otherwise, csum completion requires checksumming packet body, 2174 2174 * including udp header and folding it to skb->csum. 2175 2175 */ 2176 2176 static inline int udp4_csum_init(struct sk_buff *skb, struct udphdr *uh,
+17 -1
net/ipv6/ip6_fib.c
··· 1151 1151 err = call_fib6_entry_notifiers(info->nl_net, 1152 1152 FIB_EVENT_ENTRY_ADD, 1153 1153 rt, extack); 1154 - if (err) 1154 + if (err) { 1155 + struct fib6_info *sibling, *next_sibling; 1156 + 1157 + /* If the route has siblings, then it first 1158 + * needs to be unlinked from them. 1159 + */ 1160 + if (!rt->fib6_nsiblings) 1161 + return err; 1162 + 1163 + list_for_each_entry_safe(sibling, next_sibling, 1164 + &rt->fib6_siblings, 1165 + fib6_siblings) 1166 + sibling->fib6_nsiblings--; 1167 + rt->fib6_nsiblings = 0; 1168 + list_del_init(&rt->fib6_siblings); 1169 + rt6_multipath_rebalance(next_sibling); 1155 1170 return err; 1171 + } 1156 1172 } 1157 1173 1158 1174 rcu_assign_pointer(rt->fib6_next, iter);
+1 -1
net/ipv6/route.c
··· 2563 2563 { 2564 2564 u32 rt_cookie = 0; 2565 2565 2566 - if ((from && !fib6_get_cookie_safe(from, &rt_cookie)) || 2566 + if (!from || !fib6_get_cookie_safe(from, &rt_cookie) || 2567 2567 rt_cookie != cookie) 2568 2568 return NULL; 2569 2569
+9 -4
net/ipv6/sit.c
··· 900 900 RT_TOS(tos), RT_SCOPE_UNIVERSE, IPPROTO_IPV6, 901 901 0, dst, tiph->saddr, 0, 0, 902 902 sock_net_uid(tunnel->net, NULL)); 903 - rt = ip_route_output_flow(tunnel->net, &fl4, NULL); 904 903 905 - if (IS_ERR(rt)) { 906 - dev->stats.tx_carrier_errors++; 907 - goto tx_error_icmp; 904 + rt = dst_cache_get_ip4(&tunnel->dst_cache, &fl4.saddr); 905 + if (!rt) { 906 + rt = ip_route_output_flow(tunnel->net, &fl4, NULL); 907 + if (IS_ERR(rt)) { 908 + dev->stats.tx_carrier_errors++; 909 + goto tx_error_icmp; 910 + } 911 + dst_cache_set_ip4(&tunnel->dst_cache, &rt->dst, fl4.saddr); 908 912 } 913 + 909 914 if (rt->rt_type != RTN_UNICAST) { 910 915 ip_rt_put(rt); 911 916 dev->stats.tx_carrier_errors++;
+1
net/rds/ib.h
··· 156 156 157 157 /* To control the number of wrs from fastreg */ 158 158 atomic_t i_fastreg_wrs; 159 + atomic_t i_fastreg_inuse_count; 159 160 160 161 /* interrupt handling */ 161 162 struct tasklet_struct i_send_tasklet;
+8 -1
net/rds/ib_cm.c
··· 40 40 #include "rds_single_path.h" 41 41 #include "rds.h" 42 42 #include "ib.h" 43 + #include "ib_mr.h" 43 44 44 45 /* 45 46 * Set the selected protocol version ··· 527 526 attr.qp_type = IB_QPT_RC; 528 527 attr.send_cq = ic->i_send_cq; 529 528 attr.recv_cq = ic->i_recv_cq; 530 - atomic_set(&ic->i_fastreg_wrs, RDS_IB_DEFAULT_FR_WR); 531 529 532 530 /* 533 531 * XXX this can fail if max_*_wr is too large? Are we supposed ··· 993 993 ic->i_cm_id, err); 994 994 } 995 995 996 + /* kick off "flush_worker" for all pools in order to reap 997 + * all FRMR registrations that are still marked "FRMR_IS_INUSE" 998 + */ 999 + rds_ib_flush_mrs(); 1000 + 996 1001 /* 997 1002 * We want to wait for tx and rx completion to finish 998 1003 * before we tear down the connection, but we have to be ··· 1010 1005 wait_event(rds_ib_ring_empty_wait, 1011 1006 rds_ib_ring_empty(&ic->i_recv_ring) && 1012 1007 (atomic_read(&ic->i_signaled_sends) == 0) && 1008 + (atomic_read(&ic->i_fastreg_inuse_count) == 0) && 1013 1009 (atomic_read(&ic->i_fastreg_wrs) == RDS_IB_DEFAULT_FR_WR)); 1014 1010 tasklet_kill(&ic->i_send_tasklet); 1015 1011 tasklet_kill(&ic->i_recv_tasklet); ··· 1138 1132 spin_lock_init(&ic->i_ack_lock); 1139 1133 #endif 1140 1134 atomic_set(&ic->i_signaled_sends, 0); 1135 + atomic_set(&ic->i_fastreg_wrs, RDS_IB_DEFAULT_FR_WR); 1141 1136 1142 1137 /* 1143 1138 * rds_ib_conn_shutdown() waits for these to be emptied so they
+76 -8
net/rds/ib_frmr.c
··· 32 32 33 33 #include "ib_mr.h" 34 34 35 + static inline void 36 + rds_transition_frwr_state(struct rds_ib_mr *ibmr, 37 + enum rds_ib_fr_state old_state, 38 + enum rds_ib_fr_state new_state) 39 + { 40 + if (cmpxchg(&ibmr->u.frmr.fr_state, 41 + old_state, new_state) == old_state && 42 + old_state == FRMR_IS_INUSE) { 43 + /* enforce order of ibmr->u.frmr.fr_state update 44 + * before decrementing i_fastreg_inuse_count 45 + */ 46 + smp_mb__before_atomic(); 47 + atomic_dec(&ibmr->ic->i_fastreg_inuse_count); 48 + if (waitqueue_active(&rds_ib_ring_empty_wait)) 49 + wake_up(&rds_ib_ring_empty_wait); 50 + } 51 + } 52 + 35 53 static struct rds_ib_mr *rds_ib_alloc_frmr(struct rds_ib_device *rds_ibdev, 36 54 int npages) 37 55 { ··· 93 75 pool->max_items_soft = pool->max_items; 94 76 95 77 frmr->fr_state = FRMR_IS_FREE; 78 + init_waitqueue_head(&frmr->fr_inv_done); 79 + init_waitqueue_head(&frmr->fr_reg_done); 96 80 return ibmr; 97 81 98 82 out_no_cigar: ··· 136 116 if (unlikely(ret != ibmr->sg_len)) 137 117 return ret < 0 ? ret : -EINVAL; 138 118 119 + if (cmpxchg(&frmr->fr_state, 120 + FRMR_IS_FREE, FRMR_IS_INUSE) != FRMR_IS_FREE) 121 + return -EBUSY; 122 + 123 + atomic_inc(&ibmr->ic->i_fastreg_inuse_count); 124 + 139 125 /* Perform a WR for the fast_reg_mr. Each individual page 140 126 * in the sg list is added to the fast reg page list and placed 141 127 * inside the fast_reg_mr WR. The key used is a rolling 8bit 142 128 * counter, which should guarantee uniqueness. 143 129 */ 144 130 ib_update_fast_reg_key(frmr->mr, ibmr->remap_count++); 145 - frmr->fr_state = FRMR_IS_INUSE; 131 + frmr->fr_reg = true; 146 132 147 133 memset(&reg_wr, 0, sizeof(reg_wr)); 148 134 reg_wr.wr.wr_id = (unsigned long)(void *)ibmr; ··· 164 138 ret = ib_post_send(ibmr->ic->i_cm_id->qp, &reg_wr.wr, NULL); 165 139 if (unlikely(ret)) { 166 140 /* Failure here can be because of -ENOMEM as well */ 167 - frmr->fr_state = FRMR_IS_STALE; 141 + rds_transition_frwr_state(ibmr, FRMR_IS_INUSE, FRMR_IS_STALE); 142 + 168 143 atomic_inc(&ibmr->ic->i_fastreg_wrs); 169 144 if (printk_ratelimit()) 170 145 pr_warn("RDS/IB: %s returned error(%d)\n", 171 146 __func__, ret); 147 + goto out; 172 148 } 149 + 150 + /* Wait for the registration to complete in order to prevent an invalid 151 + * access error resulting from a race between the memory region already 152 + * being accessed while registration is still pending. 153 + */ 154 + wait_event(frmr->fr_reg_done, !frmr->fr_reg); 155 + 156 + out: 157 + 173 158 return ret; 174 159 } 175 160 ··· 292 255 293 256 ret = ib_post_send(i_cm_id->qp, s_wr, NULL); 294 257 if (unlikely(ret)) { 295 - frmr->fr_state = FRMR_IS_STALE; 258 + rds_transition_frwr_state(ibmr, FRMR_IS_INUSE, FRMR_IS_STALE); 296 259 frmr->fr_inv = false; 260 + /* enforce order of frmr->fr_inv update 261 + * before incrementing i_fastreg_wrs 262 + */ 263 + smp_mb__before_atomic(); 297 264 atomic_inc(&ibmr->ic->i_fastreg_wrs); 298 265 pr_err("RDS/IB: %s returned error(%d)\n", __func__, ret); 299 266 goto out; 300 267 } 268 + 269 + /* Wait for the FRMR_IS_FREE (or FRMR_IS_STALE) transition in order to 270 + * 1) avoid a silly bouncing between "clean_list" and "drop_list" 271 + * triggered by function "rds_ib_reg_frmr" as it is releases frmr 272 + * regions whose state is not "FRMR_IS_FREE" right away. 273 + * 2) prevents an invalid access error in a race 274 + * from a pending "IB_WR_LOCAL_INV" operation 275 + * with a teardown ("dma_unmap_sg", "put_page") 276 + * and de-registration ("ib_dereg_mr") of the corresponding 277 + * memory region. 278 + */ 279 + wait_event(frmr->fr_inv_done, frmr->fr_state != FRMR_IS_INUSE); 280 + 301 281 out: 302 282 return ret; 303 283 } ··· 325 271 struct rds_ib_frmr *frmr = &ibmr->u.frmr; 326 272 327 273 if (wc->status != IB_WC_SUCCESS) { 328 - frmr->fr_state = FRMR_IS_STALE; 274 + rds_transition_frwr_state(ibmr, FRMR_IS_INUSE, FRMR_IS_STALE); 329 275 if (rds_conn_up(ic->conn)) 330 276 rds_ib_conn_error(ic->conn, 331 277 "frmr completion <%pI4,%pI4> status %u(%s), vendor_err 0x%x, disconnecting and reconnecting\n", ··· 337 283 } 338 284 339 285 if (frmr->fr_inv) { 340 - frmr->fr_state = FRMR_IS_FREE; 286 + rds_transition_frwr_state(ibmr, FRMR_IS_INUSE, FRMR_IS_FREE); 341 287 frmr->fr_inv = false; 288 + wake_up(&frmr->fr_inv_done); 342 289 } 343 290 291 + if (frmr->fr_reg) { 292 + frmr->fr_reg = false; 293 + wake_up(&frmr->fr_reg_done); 294 + } 295 + 296 + /* enforce order of frmr->{fr_reg,fr_inv} update 297 + * before incrementing i_fastreg_wrs 298 + */ 299 + smp_mb__before_atomic(); 344 300 atomic_inc(&ic->i_fastreg_wrs); 345 301 } 346 302 ··· 359 295 { 360 296 struct rds_ib_mr *ibmr, *next; 361 297 struct rds_ib_frmr *frmr; 362 - int ret = 0; 298 + int ret = 0, ret2; 363 299 unsigned int freed = *nfreed; 364 300 365 301 /* String all ib_mr's onto one list and hand them to ib_unmap_fmr */ 366 302 list_for_each_entry(ibmr, list, unmap_list) { 367 - if (ibmr->sg_dma_len) 368 - ret |= rds_ib_post_inv(ibmr); 303 + if (ibmr->sg_dma_len) { 304 + ret2 = rds_ib_post_inv(ibmr); 305 + if (ret2 && !ret) 306 + ret = ret2; 307 + } 369 308 } 309 + 370 310 if (ret) 371 311 pr_warn("RDS/IB: %s failed (err=%d)\n", __func__, ret); 372 312
+4
net/rds/ib_mr.h
··· 57 57 struct ib_mr *mr; 58 58 enum rds_ib_fr_state fr_state; 59 59 bool fr_inv; 60 + wait_queue_head_t fr_inv_done; 61 + bool fr_reg; 62 + wait_queue_head_t fr_reg_done; 60 63 struct ib_send_wr fr_wr; 61 64 unsigned int dma_npages; 62 65 unsigned int sg_byte_len; ··· 100 97 struct llist_head free_list; /* unused MRs */ 101 98 struct llist_head clean_list; /* unused & unmapped MRs */ 102 99 wait_queue_head_t flush_wait; 100 + spinlock_t clean_lock; /* "clean_list" concurrency */ 103 101 104 102 atomic_t free_pinned; /* memory pinned by free MRs */ 105 103 unsigned long max_items;
+19 -39
net/rds/ib_rdma.c
··· 40 40 41 41 struct workqueue_struct *rds_ib_mr_wq; 42 42 43 - static DEFINE_PER_CPU(unsigned long, clean_list_grace); 44 - #define CLEAN_LIST_BUSY_BIT 0 45 - 46 43 static struct rds_ib_device *rds_ib_get_device(__be32 ipaddr) 47 44 { 48 45 struct rds_ib_device *rds_ibdev; ··· 192 195 { 193 196 struct rds_ib_mr *ibmr = NULL; 194 197 struct llist_node *ret; 195 - unsigned long *flag; 198 + unsigned long flags; 196 199 197 - preempt_disable(); 198 - flag = this_cpu_ptr(&clean_list_grace); 199 - set_bit(CLEAN_LIST_BUSY_BIT, flag); 200 + spin_lock_irqsave(&pool->clean_lock, flags); 200 201 ret = llist_del_first(&pool->clean_list); 202 + spin_unlock_irqrestore(&pool->clean_lock, flags); 201 203 if (ret) { 202 204 ibmr = llist_entry(ret, struct rds_ib_mr, llnode); 203 205 if (pool->pool_type == RDS_IB_MR_8K_POOL) ··· 205 209 rds_ib_stats_inc(s_ib_rdma_mr_1m_reused); 206 210 } 207 211 208 - clear_bit(CLEAN_LIST_BUSY_BIT, flag); 209 - preempt_enable(); 210 212 return ibmr; 211 - } 212 - 213 - static inline void wait_clean_list_grace(void) 214 - { 215 - int cpu; 216 - unsigned long *flag; 217 - 218 - for_each_online_cpu(cpu) { 219 - flag = &per_cpu(clean_list_grace, cpu); 220 - while (test_bit(CLEAN_LIST_BUSY_BIT, flag)) 221 - cpu_relax(); 222 - } 223 213 } 224 214 225 215 void rds_ib_sync_mr(void *trans_private, int direction) ··· 306 324 * of clusters. Each cluster has linked llist nodes of 307 325 * MR_CLUSTER_SIZE mrs that are ready for reuse. 308 326 */ 309 - static void list_to_llist_nodes(struct rds_ib_mr_pool *pool, 310 - struct list_head *list, 327 + static void list_to_llist_nodes(struct list_head *list, 311 328 struct llist_node **nodes_head, 312 329 struct llist_node **nodes_tail) 313 330 { ··· 383 402 */ 384 403 dirty_to_clean = llist_append_to_list(&pool->drop_list, &unmap_list); 385 404 dirty_to_clean += llist_append_to_list(&pool->free_list, &unmap_list); 386 - if (free_all) 405 + if (free_all) { 406 + unsigned long flags; 407 + 408 + spin_lock_irqsave(&pool->clean_lock, flags); 387 409 llist_append_to_list(&pool->clean_list, &unmap_list); 410 + spin_unlock_irqrestore(&pool->clean_lock, flags); 411 + } 388 412 389 413 free_goal = rds_ib_flush_goal(pool, free_all); 390 414 ··· 402 416 rds_ib_unreg_fmr(&unmap_list, &nfreed, &unpinned, free_goal); 403 417 404 418 if (!list_empty(&unmap_list)) { 405 - /* we have to make sure that none of the things we're about 406 - * to put on the clean list would race with other cpus trying 407 - * to pull items off. The llist would explode if we managed to 408 - * remove something from the clean list and then add it back again 409 - * while another CPU was spinning on that same item in llist_del_first. 410 - * 411 - * This is pretty unlikely, but just in case wait for an llist grace period 412 - * here before adding anything back into the clean list. 413 - */ 414 - wait_clean_list_grace(); 419 + unsigned long flags; 415 420 416 - list_to_llist_nodes(pool, &unmap_list, &clean_nodes, &clean_tail); 421 + list_to_llist_nodes(&unmap_list, &clean_nodes, &clean_tail); 417 422 if (ibmr_ret) { 418 423 *ibmr_ret = llist_entry(clean_nodes, struct rds_ib_mr, llnode); 419 424 clean_nodes = clean_nodes->next; 420 425 } 421 426 /* more than one entry in llist nodes */ 422 - if (clean_nodes) 427 + if (clean_nodes) { 428 + spin_lock_irqsave(&pool->clean_lock, flags); 423 429 llist_add_batch(clean_nodes, clean_tail, 424 430 &pool->clean_list); 425 - 431 + spin_unlock_irqrestore(&pool->clean_lock, flags); 432 + } 426 433 } 427 434 428 435 atomic_sub(unpinned, &pool->free_pinned); ··· 450 471 rds_ib_stats_inc(s_ib_rdma_mr_8k_pool_depleted); 451 472 else 452 473 rds_ib_stats_inc(s_ib_rdma_mr_1m_pool_depleted); 453 - return ERR_PTR(-EAGAIN); 474 + break; 454 475 } 455 476 456 477 /* We do have some empty MRs. Flush them out. */ ··· 464 485 return ibmr; 465 486 } 466 487 467 - return ibmr; 488 + return NULL; 468 489 } 469 490 470 491 static void rds_ib_mr_pool_flush_worker(struct work_struct *work) ··· 589 610 init_llist_head(&pool->free_list); 590 611 init_llist_head(&pool->drop_list); 591 612 init_llist_head(&pool->clean_list); 613 + spin_lock_init(&pool->clean_lock); 592 614 mutex_init(&pool->flush_lock); 593 615 init_waitqueue_head(&pool->flush_wait); 594 616 INIT_DELAYED_WORK(&pool->flush_worker, rds_ib_mr_pool_flush_worker);
+1 -1
net/sched/Kconfig
··· 942 942 943 943 config NET_ACT_CT 944 944 tristate "connection tracking tc action" 945 - depends on NET_CLS_ACT && NF_CONNTRACK 945 + depends on NET_CLS_ACT && NF_CONNTRACK && NF_NAT 946 946 help 947 947 Say Y here to allow sending the packets to conntrack module. 948 948
+1
net/sched/cls_api.c
··· 2152 2152 tfilter_notify(net, skb, n, tp, block, q, parent, fh, 2153 2153 RTM_NEWTFILTER, false, rtnl_held); 2154 2154 tfilter_put(tp, fh); 2155 + q->flags &= ~TCQ_F_CAN_BYPASS; 2155 2156 } 2156 2157 2157 2158 errout:
-2
net/sched/sch_fq_codel.c
··· 596 596 static unsigned long fq_codel_bind(struct Qdisc *sch, unsigned long parent, 597 597 u32 classid) 598 598 { 599 - /* we cannot bypass queue discipline anymore */ 600 - sch->flags &= ~TCQ_F_CAN_BYPASS; 601 599 return 0; 602 600 } 603 601
-2
net/sched/sch_sfq.c
··· 824 824 static unsigned long sfq_bind(struct Qdisc *sch, unsigned long parent, 825 825 u32 classid) 826 826 { 827 - /* we cannot bypass queue discipline anymore */ 828 - sch->flags &= ~TCQ_F_CAN_BYPASS; 829 827 return 0; 830 828 } 831 829
+3 -3
net/sched/sch_taprio.c
··· 75 75 struct sched_gate_list __rcu *admin_sched; 76 76 struct hrtimer advance_timer; 77 77 struct list_head taprio_list; 78 - int txtime_delay; 78 + u32 txtime_delay; 79 79 }; 80 80 81 81 static ktime_t sched_base_time(const struct sched_gate_list *sched) ··· 1113 1113 goto unlock; 1114 1114 } 1115 1115 1116 - q->txtime_delay = nla_get_s32(tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]); 1116 + q->txtime_delay = nla_get_u32(tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]); 1117 1117 } 1118 1118 1119 1119 if (!TXTIME_ASSIST_IS_ENABLED(taprio_flags) && ··· 1430 1430 goto options_error; 1431 1431 1432 1432 if (q->txtime_delay && 1433 - nla_put_s32(skb, TCA_TAPRIO_ATTR_TXTIME_DELAY, q->txtime_delay)) 1433 + nla_put_u32(skb, TCA_TAPRIO_ATTR_TXTIME_DELAY, q->txtime_delay)) 1434 1434 goto options_error; 1435 1435 1436 1436 if (oper && dump_schedule(skb, oper))
+4 -8
net/sctp/sm_make_chunk.c
··· 2582 2582 case SCTP_PARAM_STATE_COOKIE: 2583 2583 asoc->peer.cookie_len = 2584 2584 ntohs(param.p->length) - sizeof(struct sctp_paramhdr); 2585 - if (asoc->peer.cookie) 2586 - kfree(asoc->peer.cookie); 2585 + kfree(asoc->peer.cookie); 2587 2586 asoc->peer.cookie = kmemdup(param.cookie->body, asoc->peer.cookie_len, gfp); 2588 2587 if (!asoc->peer.cookie) 2589 2588 retval = 0; ··· 2647 2648 goto fall_through; 2648 2649 2649 2650 /* Save peer's random parameter */ 2650 - if (asoc->peer.peer_random) 2651 - kfree(asoc->peer.peer_random); 2651 + kfree(asoc->peer.peer_random); 2652 2652 asoc->peer.peer_random = kmemdup(param.p, 2653 2653 ntohs(param.p->length), gfp); 2654 2654 if (!asoc->peer.peer_random) { ··· 2661 2663 goto fall_through; 2662 2664 2663 2665 /* Save peer's HMAC list */ 2664 - if (asoc->peer.peer_hmacs) 2665 - kfree(asoc->peer.peer_hmacs); 2666 + kfree(asoc->peer.peer_hmacs); 2666 2667 asoc->peer.peer_hmacs = kmemdup(param.p, 2667 2668 ntohs(param.p->length), gfp); 2668 2669 if (!asoc->peer.peer_hmacs) { ··· 2677 2680 if (!ep->auth_enable) 2678 2681 goto fall_through; 2679 2682 2680 - if (asoc->peer.peer_chunks) 2681 - kfree(asoc->peer.peer_chunks); 2683 + kfree(asoc->peer.peer_chunks); 2682 2684 asoc->peer.peer_chunks = kmemdup(param.p, 2683 2685 ntohs(param.p->length), gfp); 2684 2686 if (!asoc->peer.peer_chunks)
+1
net/tipc/node.c
··· 1807 1807 __skb_queue_head_init(&xmitq); 1808 1808 1809 1809 /* Ensure message is well-formed before touching the header */ 1810 + TIPC_SKB_CB(skb)->validated = false; 1810 1811 if (unlikely(!tipc_msg_validate(&skb))) 1811 1812 goto discard; 1812 1813 hdr = buf_msg(skb);
+6 -10
net/xdp/xdp_umem.c
··· 87 87 struct netdev_bpf bpf; 88 88 int err = 0; 89 89 90 + ASSERT_RTNL(); 91 + 90 92 force_zc = flags & XDP_ZEROCOPY; 91 93 force_copy = flags & XDP_COPY; 92 94 93 95 if (force_zc && force_copy) 94 96 return -EINVAL; 95 97 96 - rtnl_lock(); 97 - if (xdp_get_umem_from_qid(dev, queue_id)) { 98 - err = -EBUSY; 99 - goto out_rtnl_unlock; 100 - } 98 + if (xdp_get_umem_from_qid(dev, queue_id)) 99 + return -EBUSY; 101 100 102 101 err = xdp_reg_umem_at_qid(dev, umem, queue_id); 103 102 if (err) 104 - goto out_rtnl_unlock; 103 + return err; 105 104 106 105 umem->dev = dev; 107 106 umem->queue_id = queue_id; ··· 109 110 110 111 if (force_copy) 111 112 /* For copy-mode, we are done. */ 112 - goto out_rtnl_unlock; 113 + return 0; 113 114 114 115 if (!dev->netdev_ops->ndo_bpf || 115 116 !dev->netdev_ops->ndo_xsk_async_xmit) { ··· 124 125 err = dev->netdev_ops->ndo_bpf(dev, &bpf); 125 126 if (err) 126 127 goto err_unreg_umem; 127 - rtnl_unlock(); 128 128 129 129 umem->zc = true; 130 130 return 0; ··· 133 135 err = 0; /* fallback to copy mode */ 134 136 if (err) 135 137 xdp_clear_umem_at_qid(dev, queue_id); 136 - out_rtnl_unlock: 137 - rtnl_unlock(); 138 138 return err; 139 139 } 140 140
+6 -7
net/xdp/xsk.c
··· 240 240 241 241 mutex_lock(&xs->mutex); 242 242 243 + if (xs->queue_id >= xs->dev->real_num_tx_queues) 244 + goto out; 245 + 243 246 while (xskq_peek_desc(xs->tx, &desc)) { 244 247 char *buffer; 245 248 u64 addr; ··· 252 249 err = -EAGAIN; 253 250 goto out; 254 251 } 255 - 256 - if (xskq_reserve_addr(xs->umem->cq)) 257 - goto out; 258 - 259 - if (xs->queue_id >= xs->dev->real_num_tx_queues) 260 - goto out; 261 252 262 253 len = desc.len; 263 254 skb = sock_alloc_send_skb(sk, len, 1, &err); ··· 264 267 addr = desc.addr; 265 268 buffer = xdp_umem_get_data(xs->umem, addr); 266 269 err = skb_store_bits(skb, 0, buffer, len); 267 - if (unlikely(err)) { 270 + if (unlikely(err) || xskq_reserve_addr(xs->umem->cq)) { 268 271 kfree_skb(skb); 269 272 goto out; 270 273 } ··· 430 433 if (flags & ~(XDP_SHARED_UMEM | XDP_COPY | XDP_ZEROCOPY)) 431 434 return -EINVAL; 432 435 436 + rtnl_lock(); 433 437 mutex_lock(&xs->mutex); 434 438 if (xs->state != XSK_READY) { 435 439 err = -EBUSY; ··· 516 518 xs->state = XSK_BOUND; 517 519 out_release: 518 520 mutex_unlock(&xs->mutex); 521 + rtnl_unlock(); 519 522 return err; 520 523 } 521 524
+1 -1
samples/bpf/Makefile
··· 284 284 $(Q)$(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) -I$(obj) \ 285 285 -I$(srctree)/tools/testing/selftests/bpf/ \ 286 286 -D__KERNEL__ -D__BPF_TRACING__ -Wno-unused-value -Wno-pointer-sign \ 287 - -D__TARGET_ARCH_$(ARCH) -Wno-compare-distinct-pointer-types \ 287 + -D__TARGET_ARCH_$(SRCARCH) -Wno-compare-distinct-pointer-types \ 288 288 -Wno-gnu-variable-sized-type-not-at-end \ 289 289 -Wno-address-of-packed-member -Wno-tautological-compare \ 290 290 -Wno-unknown-warning-option $(CLANG_ARCH_ARGS) \
+1
tools/bpf/bpftool/main.h
··· 74 74 [BPF_PROG_TYPE_SK_REUSEPORT] = "sk_reuseport", 75 75 [BPF_PROG_TYPE_FLOW_DISSECTOR] = "flow_dissector", 76 76 [BPF_PROG_TYPE_CGROUP_SYSCTL] = "cgroup_sysctl", 77 + [BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE] = "raw_tracepoint_writable", 77 78 [BPF_PROG_TYPE_CGROUP_SOCKOPT] = "cgroup_sockopt", 78 79 }; 79 80
+2 -2
tools/include/uapi/linux/bpf.h
··· 3245 3245 __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. 3246 3246 * Stored in network byte order. 3247 3247 */ 3248 - __u32 user_ip6[4]; /* Allows 1,2,4-byte read and 4,8-byte write. 3248 + __u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. 3249 3249 * Stored in network byte order. 3250 3250 */ 3251 3251 __u32 user_port; /* Allows 4-byte read and write. ··· 3257 3257 __u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write. 3258 3258 * Stored in network byte order. 3259 3259 */ 3260 - __u32 msg_src_ip6[4]; /* Allows 1,2,4-byte read and 4,8-byte write. 3260 + __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. 3261 3261 * Stored in network byte order. 3262 3262 */ 3263 3263 __bpf_md_ptr(struct bpf_sock *, sk);
+2 -2
tools/lib/bpf/libbpf.c
··· 4126 4126 } 4127 4127 attr.size = sizeof(attr); 4128 4128 attr.type = type; 4129 - attr.config1 = (uint64_t)(void *)name; /* kprobe_func or uprobe_path */ 4130 - attr.config2 = offset; /* kprobe_addr or probe_offset */ 4129 + attr.config1 = ptr_to_u64(name); /* kprobe_func or uprobe_path */ 4130 + attr.config2 = offset; /* kprobe_addr or probe_offset */ 4131 4131 4132 4132 /* pid filter is meaningful only for uprobes */ 4133 4133 pfd = syscall(__NR_perf_event_open, &attr,
+2 -1
tools/lib/bpf/xsk.c
··· 517 517 err = -errno; 518 518 goto out_socket; 519 519 } 520 - strncpy(xsk->ifname, ifname, IFNAMSIZ); 520 + strncpy(xsk->ifname, ifname, IFNAMSIZ - 1); 521 + xsk->ifname[IFNAMSIZ - 1] = '\0'; 521 522 522 523 err = xsk_set_xdp_socket_config(&xsk->config, usr_config); 523 524 if (err)
+33 -31
tools/testing/selftests/bpf/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 + include ../../../../scripts/Kbuild.include 3 + include ../../../scripts/Makefile.arch 2 4 3 5 LIBDIR := ../../../lib 4 6 BPFDIR := $(LIBDIR)/bpf ··· 83 81 $(OUTPUT)/urandom_read: $(OUTPUT)/%: %.c 84 82 $(CC) -o $@ $< -Wl,--build-id 85 83 86 - $(OUTPUT)/test_maps: map_tests/*.c 84 + $(OUTPUT)/test_stub.o: test_stub.c 85 + $(CC) $(TEST_PROGS_CFLAGS) $(CFLAGS) -c -o $@ $< 87 86 88 87 BPFOBJ := $(OUTPUT)/libbpf.a 89 88 90 - $(TEST_GEN_PROGS): test_stub.o $(BPFOBJ) 89 + $(TEST_GEN_PROGS): $(OUTPUT)/test_stub.o $(BPFOBJ) 91 90 92 - $(TEST_GEN_PROGS_EXTENDED): test_stub.o $(OUTPUT)/libbpf.a 91 + $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(OUTPUT)/libbpf.a 93 92 94 93 $(OUTPUT)/test_dev_cgroup: cgroup_helpers.c 95 94 $(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c ··· 141 138 142 139 CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi \ 143 140 $(CLANG_SYS_INCLUDES) \ 144 - -Wno-compare-distinct-pointer-types 141 + -Wno-compare-distinct-pointer-types \ 142 + -D__TARGET_ARCH_$(SRCARCH) 145 143 146 144 $(OUTPUT)/test_l4lb_noinline.o: CLANG_FLAGS += -fno-inline 147 145 $(OUTPUT)/test_xdp_noinline.o: CLANG_FLAGS += -fno-inline ··· 176 172 endif 177 173 178 174 TEST_PROGS_CFLAGS := -I. -I$(OUTPUT) 175 + TEST_MAPS_CFLAGS := -I. -I$(OUTPUT) 179 176 TEST_VERIFIER_CFLAGS := -I. -I$(OUTPUT) -Iverifier 180 177 181 178 ifneq ($(SUBREG_CODEGEN),) ··· 185 180 $(ALU32_BUILD_DIR): 186 181 mkdir -p $@ 187 182 188 - $(ALU32_BUILD_DIR)/urandom_read: $(OUTPUT)/urandom_read 183 + $(ALU32_BUILD_DIR)/urandom_read: $(OUTPUT)/urandom_read | $(ALU32_BUILD_DIR) 189 184 cp $< $@ 190 185 191 186 $(ALU32_BUILD_DIR)/test_progs_32: test_progs.c $(OUTPUT)/libbpf.a\ 192 - $(ALU32_BUILD_DIR) \ 193 - $(ALU32_BUILD_DIR)/urandom_read 187 + $(ALU32_BUILD_DIR)/urandom_read \ 188 + | $(ALU32_BUILD_DIR) 194 189 $(CC) $(TEST_PROGS_CFLAGS) $(CFLAGS) \ 195 190 -o $(ALU32_BUILD_DIR)/test_progs_32 \ 196 191 test_progs.c test_stub.c trace_helpers.c prog_tests/*.c \ ··· 199 194 $(ALU32_BUILD_DIR)/test_progs_32: $(PROG_TESTS_H) 200 195 $(ALU32_BUILD_DIR)/test_progs_32: prog_tests/*.c 201 196 202 - $(ALU32_BUILD_DIR)/%.o: progs/%.c $(ALU32_BUILD_DIR) \ 203 - $(ALU32_BUILD_DIR)/test_progs_32 204 - $(CLANG) $(CLANG_FLAGS) \ 205 - -O2 -target bpf -emit-llvm -c $< -o - | \ 197 + $(ALU32_BUILD_DIR)/%.o: progs/%.c $(ALU32_BUILD_DIR)/test_progs_32 \ 198 + | $(ALU32_BUILD_DIR) 199 + ($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \ 200 + echo "clang failed") | \ 206 201 $(LLC) -march=bpf -mattr=+alu32 -mcpu=$(CPU) $(LLC_FLAGS) \ 207 202 -filetype=obj -o $@ 208 203 ifeq ($(DWARF2BTF),y) ··· 213 208 # Have one program compiled without "-target bpf" to test whether libbpf loads 214 209 # it successfully 215 210 $(OUTPUT)/test_xdp.o: progs/test_xdp.c 216 - $(CLANG) $(CLANG_FLAGS) \ 217 - -O2 -emit-llvm -c $< -o - | \ 211 + ($(CLANG) $(CLANG_FLAGS) -O2 -emit-llvm -c $< -o - || \ 212 + echo "clang failed") | \ 218 213 $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ 219 214 ifeq ($(DWARF2BTF),y) 220 215 $(BTF_PAHOLE) -J $@ 221 216 endif 222 217 223 218 $(OUTPUT)/%.o: progs/%.c 224 - $(CLANG) $(CLANG_FLAGS) \ 225 - -O2 -target bpf -emit-llvm -c $< -o - | \ 219 + ($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \ 220 + echo "clang failed") | \ 226 221 $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ 227 222 ifeq ($(DWARF2BTF),y) 228 223 $(BTF_PAHOLE) -J $@ 229 224 endif 230 225 231 - PROG_TESTS_H := $(OUTPUT)/prog_tests/tests.h 232 - test_progs.c: $(PROG_TESTS_H) 233 - $(OUTPUT)/test_progs: CFLAGS += $(TEST_PROGS_CFLAGS) 234 - $(OUTPUT)/test_progs: prog_tests/*.c 235 - 236 226 PROG_TESTS_DIR = $(OUTPUT)/prog_tests 237 227 $(PROG_TESTS_DIR): 238 228 mkdir -p $@ 239 - 229 + PROG_TESTS_H := $(PROG_TESTS_DIR)/tests.h 240 230 PROG_TESTS_FILES := $(wildcard prog_tests/*.c) 241 - $(PROG_TESTS_H): $(PROG_TESTS_DIR) $(PROG_TESTS_FILES) 231 + test_progs.c: $(PROG_TESTS_H) 232 + $(OUTPUT)/test_progs: CFLAGS += $(TEST_PROGS_CFLAGS) 233 + $(OUTPUT)/test_progs: test_progs.c $(PROG_TESTS_H) $(PROG_TESTS_FILES) 234 + $(PROG_TESTS_H): $(PROG_TESTS_FILES) | $(PROG_TESTS_DIR) 242 235 $(shell ( cd prog_tests/; \ 243 236 echo '/* Generated header, do not edit */'; \ 244 237 echo '#ifdef DECLARE'; \ ··· 249 246 echo '#endif' \ 250 247 ) > $(PROG_TESTS_H)) 251 248 252 - TEST_MAPS_CFLAGS := -I. -I$(OUTPUT) 253 249 MAP_TESTS_DIR = $(OUTPUT)/map_tests 254 250 $(MAP_TESTS_DIR): 255 251 mkdir -p $@ 256 252 MAP_TESTS_H := $(MAP_TESTS_DIR)/tests.h 253 + MAP_TESTS_FILES := $(wildcard map_tests/*.c) 257 254 test_maps.c: $(MAP_TESTS_H) 258 255 $(OUTPUT)/test_maps: CFLAGS += $(TEST_MAPS_CFLAGS) 259 - MAP_TESTS_FILES := $(wildcard map_tests/*.c) 260 - $(MAP_TESTS_H): $(MAP_TESTS_DIR) $(MAP_TESTS_FILES) 256 + $(OUTPUT)/test_maps: test_maps.c $(MAP_TESTS_H) $(MAP_TESTS_FILES) 257 + $(MAP_TESTS_H): $(MAP_TESTS_FILES) | $(MAP_TESTS_DIR) 261 258 $(shell ( cd map_tests/; \ 262 259 echo '/* Generated header, do not edit */'; \ 263 260 echo '#ifdef DECLARE'; \ ··· 270 267 echo '#endif' \ 271 268 ) > $(MAP_TESTS_H)) 272 269 273 - VERIFIER_TESTS_H := $(OUTPUT)/verifier/tests.h 274 - test_verifier.c: $(VERIFIER_TESTS_H) 275 - $(OUTPUT)/test_verifier: CFLAGS += $(TEST_VERIFIER_CFLAGS) 276 - 277 270 VERIFIER_TESTS_DIR = $(OUTPUT)/verifier 278 271 $(VERIFIER_TESTS_DIR): 279 272 mkdir -p $@ 280 - 273 + VERIFIER_TESTS_H := $(VERIFIER_TESTS_DIR)/tests.h 281 274 VERIFIER_TEST_FILES := $(wildcard verifier/*.c) 282 - $(OUTPUT)/verifier/tests.h: $(VERIFIER_TESTS_DIR) $(VERIFIER_TEST_FILES) 275 + test_verifier.c: $(VERIFIER_TESTS_H) 276 + $(OUTPUT)/test_verifier: CFLAGS += $(TEST_VERIFIER_CFLAGS) 277 + $(OUTPUT)/test_verifier: test_verifier.c $(VERIFIER_TESTS_H) 278 + $(VERIFIER_TESTS_H): $(VERIFIER_TEST_FILES) | $(VERIFIER_TESTS_DIR) 283 279 $(shell ( cd verifier/; \ 284 280 echo '/* Generated header, do not edit */'; \ 285 281 echo '#ifdef FILL_ARRAY'; \
+62 -27
tools/testing/selftests/bpf/bpf_helpers.h
··· 315 315 #if defined(__TARGET_ARCH_x86) 316 316 #define bpf_target_x86 317 317 #define bpf_target_defined 318 - #elif defined(__TARGET_ARCH_s930x) 319 - #define bpf_target_s930x 318 + #elif defined(__TARGET_ARCH_s390) 319 + #define bpf_target_s390 320 320 #define bpf_target_defined 321 321 #elif defined(__TARGET_ARCH_arm) 322 322 #define bpf_target_arm ··· 341 341 #ifndef bpf_target_defined 342 342 #if defined(__x86_64__) 343 343 #define bpf_target_x86 344 - #elif defined(__s390x__) 345 - #define bpf_target_s930x 344 + #elif defined(__s390__) 345 + #define bpf_target_s390 346 346 #elif defined(__arm__) 347 347 #define bpf_target_arm 348 348 #elif defined(__aarch64__) ··· 358 358 359 359 #if defined(bpf_target_x86) 360 360 361 + #ifdef __KERNEL__ 361 362 #define PT_REGS_PARM1(x) ((x)->di) 362 363 #define PT_REGS_PARM2(x) ((x)->si) 363 364 #define PT_REGS_PARM3(x) ((x)->dx) ··· 369 368 #define PT_REGS_RC(x) ((x)->ax) 370 369 #define PT_REGS_SP(x) ((x)->sp) 371 370 #define PT_REGS_IP(x) ((x)->ip) 371 + #else 372 + #ifdef __i386__ 373 + /* i386 kernel is built with -mregparm=3 */ 374 + #define PT_REGS_PARM1(x) ((x)->eax) 375 + #define PT_REGS_PARM2(x) ((x)->edx) 376 + #define PT_REGS_PARM3(x) ((x)->ecx) 377 + #define PT_REGS_PARM4(x) 0 378 + #define PT_REGS_PARM5(x) 0 379 + #define PT_REGS_RET(x) ((x)->esp) 380 + #define PT_REGS_FP(x) ((x)->ebp) 381 + #define PT_REGS_RC(x) ((x)->eax) 382 + #define PT_REGS_SP(x) ((x)->esp) 383 + #define PT_REGS_IP(x) ((x)->eip) 384 + #else 385 + #define PT_REGS_PARM1(x) ((x)->rdi) 386 + #define PT_REGS_PARM2(x) ((x)->rsi) 387 + #define PT_REGS_PARM3(x) ((x)->rdx) 388 + #define PT_REGS_PARM4(x) ((x)->rcx) 389 + #define PT_REGS_PARM5(x) ((x)->r8) 390 + #define PT_REGS_RET(x) ((x)->rsp) 391 + #define PT_REGS_FP(x) ((x)->rbp) 392 + #define PT_REGS_RC(x) ((x)->rax) 393 + #define PT_REGS_SP(x) ((x)->rsp) 394 + #define PT_REGS_IP(x) ((x)->rip) 395 + #endif 396 + #endif 372 397 373 - #elif defined(bpf_target_s390x) 398 + #elif defined(bpf_target_s390) 374 399 375 - #define PT_REGS_PARM1(x) ((x)->gprs[2]) 376 - #define PT_REGS_PARM2(x) ((x)->gprs[3]) 377 - #define PT_REGS_PARM3(x) ((x)->gprs[4]) 378 - #define PT_REGS_PARM4(x) ((x)->gprs[5]) 379 - #define PT_REGS_PARM5(x) ((x)->gprs[6]) 380 - #define PT_REGS_RET(x) ((x)->gprs[14]) 381 - #define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */ 382 - #define PT_REGS_RC(x) ((x)->gprs[2]) 383 - #define PT_REGS_SP(x) ((x)->gprs[15]) 384 - #define PT_REGS_IP(x) ((x)->psw.addr) 400 + /* s390 provides user_pt_regs instead of struct pt_regs to userspace */ 401 + struct pt_regs; 402 + #define PT_REGS_S390 const volatile user_pt_regs 403 + #define PT_REGS_PARM1(x) (((PT_REGS_S390 *)(x))->gprs[2]) 404 + #define PT_REGS_PARM2(x) (((PT_REGS_S390 *)(x))->gprs[3]) 405 + #define PT_REGS_PARM3(x) (((PT_REGS_S390 *)(x))->gprs[4]) 406 + #define PT_REGS_PARM4(x) (((PT_REGS_S390 *)(x))->gprs[5]) 407 + #define PT_REGS_PARM5(x) (((PT_REGS_S390 *)(x))->gprs[6]) 408 + #define PT_REGS_RET(x) (((PT_REGS_S390 *)(x))->gprs[14]) 409 + /* Works only with CONFIG_FRAME_POINTER */ 410 + #define PT_REGS_FP(x) (((PT_REGS_S390 *)(x))->gprs[11]) 411 + #define PT_REGS_RC(x) (((PT_REGS_S390 *)(x))->gprs[2]) 412 + #define PT_REGS_SP(x) (((PT_REGS_S390 *)(x))->gprs[15]) 413 + #define PT_REGS_IP(x) (((PT_REGS_S390 *)(x))->psw.addr) 385 414 386 415 #elif defined(bpf_target_arm) 387 416 ··· 428 397 429 398 #elif defined(bpf_target_arm64) 430 399 431 - #define PT_REGS_PARM1(x) ((x)->regs[0]) 432 - #define PT_REGS_PARM2(x) ((x)->regs[1]) 433 - #define PT_REGS_PARM3(x) ((x)->regs[2]) 434 - #define PT_REGS_PARM4(x) ((x)->regs[3]) 435 - #define PT_REGS_PARM5(x) ((x)->regs[4]) 436 - #define PT_REGS_RET(x) ((x)->regs[30]) 437 - #define PT_REGS_FP(x) ((x)->regs[29]) /* Works only with CONFIG_FRAME_POINTER */ 438 - #define PT_REGS_RC(x) ((x)->regs[0]) 439 - #define PT_REGS_SP(x) ((x)->sp) 440 - #define PT_REGS_IP(x) ((x)->pc) 400 + /* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */ 401 + struct pt_regs; 402 + #define PT_REGS_ARM64 const volatile struct user_pt_regs 403 + #define PT_REGS_PARM1(x) (((PT_REGS_ARM64 *)(x))->regs[0]) 404 + #define PT_REGS_PARM2(x) (((PT_REGS_ARM64 *)(x))->regs[1]) 405 + #define PT_REGS_PARM3(x) (((PT_REGS_ARM64 *)(x))->regs[2]) 406 + #define PT_REGS_PARM4(x) (((PT_REGS_ARM64 *)(x))->regs[3]) 407 + #define PT_REGS_PARM5(x) (((PT_REGS_ARM64 *)(x))->regs[4]) 408 + #define PT_REGS_RET(x) (((PT_REGS_ARM64 *)(x))->regs[30]) 409 + /* Works only with CONFIG_FRAME_POINTER */ 410 + #define PT_REGS_FP(x) (((PT_REGS_ARM64 *)(x))->regs[29]) 411 + #define PT_REGS_RC(x) (((PT_REGS_ARM64 *)(x))->regs[0]) 412 + #define PT_REGS_SP(x) (((PT_REGS_ARM64 *)(x))->sp) 413 + #define PT_REGS_IP(x) (((PT_REGS_ARM64 *)(x))->pc) 441 414 442 415 #elif defined(bpf_target_mips) 443 416 ··· 487 452 488 453 #endif 489 454 490 - #ifdef bpf_target_powerpc 455 + #if defined(bpf_target_powerpc) 491 456 #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) 492 457 #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP 493 - #elif bpf_target_sparc 458 + #elif defined(bpf_target_sparc) 494 459 #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) 495 460 #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP 496 461 #else
+2 -8
tools/testing/selftests/bpf/prog_tests/attach_probe.c
··· 21 21 return -EINVAL; 22 22 } 23 23 24 - #ifdef __x86_64__ 25 - #define SYS_KPROBE_NAME "__x64_sys_nanosleep" 26 - #else 27 - #define SYS_KPROBE_NAME "sys_nanosleep" 28 - #endif 29 - 30 24 void test_attach_probe(void) 31 25 { 32 26 const char *kprobe_name = "kprobe/sys_nanosleep"; ··· 78 84 79 85 kprobe_link = bpf_program__attach_kprobe(kprobe_prog, 80 86 false /* retprobe */, 81 - SYS_KPROBE_NAME); 87 + SYS_NANOSLEEP_KPROBE_NAME); 82 88 if (CHECK(IS_ERR(kprobe_link), "attach_kprobe", 83 89 "err %ld\n", PTR_ERR(kprobe_link))) { 84 90 kprobe_link = NULL; ··· 86 92 } 87 93 kretprobe_link = bpf_program__attach_kprobe(kretprobe_prog, 88 94 true /* retprobe */, 89 - SYS_KPROBE_NAME); 95 + SYS_NANOSLEEP_KPROBE_NAME); 90 96 if (CHECK(IS_ERR(kretprobe_link), "attach_kretprobe", 91 97 "err %ld\n", PTR_ERR(kretprobe_link))) { 92 98 kretprobe_link = NULL;
+1 -7
tools/testing/selftests/bpf/prog_tests/perf_buffer.c
··· 5 5 #include <sys/socket.h> 6 6 #include <test_progs.h> 7 7 8 - #ifdef __x86_64__ 9 - #define SYS_KPROBE_NAME "__x64_sys_nanosleep" 10 - #else 11 - #define SYS_KPROBE_NAME "sys_nanosleep" 12 - #endif 13 - 14 8 static void on_sample(void *ctx, int cpu, void *data, __u32 size) 15 9 { 16 10 int cpu_data = *(int *)data, duration = 0; ··· 50 56 51 57 /* attach kprobe */ 52 58 link = bpf_program__attach_kprobe(prog, false /* retprobe */, 53 - SYS_KPROBE_NAME); 59 + SYS_NANOSLEEP_KPROBE_NAME); 54 60 if (CHECK(IS_ERR(link), "attach_kprobe", "err %ld\n", PTR_ERR(link))) 55 61 goto out_close; 56 62
+32 -1
tools/testing/selftests/bpf/prog_tests/send_signal.c
··· 173 173 return test_send_signal_common(&attr, BPF_PROG_TYPE_TRACEPOINT, "tracepoint"); 174 174 } 175 175 176 + static int test_send_signal_perf(void) 177 + { 178 + struct perf_event_attr attr = { 179 + .sample_period = 1, 180 + .type = PERF_TYPE_SOFTWARE, 181 + .config = PERF_COUNT_SW_CPU_CLOCK, 182 + }; 183 + 184 + return test_send_signal_common(&attr, BPF_PROG_TYPE_PERF_EVENT, 185 + "perf_sw_event"); 186 + } 187 + 176 188 static int test_send_signal_nmi(void) 177 189 { 178 190 struct perf_event_attr attr = { ··· 193 181 .type = PERF_TYPE_HARDWARE, 194 182 .config = PERF_COUNT_HW_CPU_CYCLES, 195 183 }; 184 + int pmu_fd; 196 185 197 - return test_send_signal_common(&attr, BPF_PROG_TYPE_PERF_EVENT, "perf_event"); 186 + /* Some setups (e.g. virtual machines) might run with hardware 187 + * perf events disabled. If this is the case, skip this test. 188 + */ 189 + pmu_fd = syscall(__NR_perf_event_open, &attr, 0 /* pid */, 190 + -1 /* cpu */, -1 /* group_fd */, 0 /* flags */); 191 + if (pmu_fd == -1) { 192 + if (errno == ENOENT) { 193 + printf("%s:SKIP:no PERF_COUNT_HW_CPU_CYCLES\n", 194 + __func__); 195 + return 0; 196 + } 197 + /* Let the test fail with a more informative message */ 198 + } else { 199 + close(pmu_fd); 200 + } 201 + 202 + return test_send_signal_common(&attr, BPF_PROG_TYPE_PERF_EVENT, 203 + "perf_hw_event"); 198 204 } 199 205 200 206 void test_send_signal(void) ··· 220 190 int ret = 0; 221 191 222 192 ret |= test_send_signal_tracepoint(); 193 + ret |= test_send_signal_perf(); 223 194 ret |= test_send_signal_nmi(); 224 195 if (!ret) 225 196 printf("test_send_signal:OK\n");
+1 -1
tools/testing/selftests/bpf/progs/loop1.c
··· 18 18 for (j = 0; j < 300; j++) 19 19 for (i = 0; i < j; i++) { 20 20 if (j & 1) 21 - m = ctx->rax; 21 + m = PT_REGS_RC(ctx); 22 22 else 23 23 m = j; 24 24 sum += i * m;
+1 -1
tools/testing/selftests/bpf/progs/loop2.c
··· 16 16 int i = 0; 17 17 18 18 while (true) { 19 - if (ctx->rax & 1) 19 + if (PT_REGS_RC(ctx) & 1) 20 20 i += 3; 21 21 else 22 22 i += 7;
+1 -1
tools/testing/selftests/bpf/progs/loop3.c
··· 16 16 __u64 i = 0, sum = 0; 17 17 do { 18 18 i++; 19 - sum += ctx->rax; 19 + sum += PT_REGS_RC(ctx); 20 20 } while (i < 0x100000000ULL); 21 21 return sum; 22 22 }
+2 -1
tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c
··· 47 47 * issue and avoid complicated C programming massaging. 48 48 * This is an acceptable workaround since there is one entry here. 49 49 */ 50 + typedef __u64 raw_stack_trace_t[2 * MAX_STACK_RAWTP]; 50 51 struct { 51 52 __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); 52 53 __uint(max_entries, 1); 53 54 __type(key, __u32); 54 - __u64 (*value)[2 * MAX_STACK_RAWTP]; 55 + __type(value, raw_stack_trace_t); 55 56 } rawdata_map SEC(".maps"); 56 57 57 58 SEC("tracepoint/raw_syscalls/sys_enter")
+1 -2
tools/testing/selftests/bpf/progs/test_stacktrace_build_id.c
··· 36 36 __uint(type, BPF_MAP_TYPE_ARRAY); 37 37 __uint(max_entries, 128); 38 38 __type(key, __u32); 39 - /* there seems to be a bug in kernel not handling typedef properly */ 40 - struct bpf_stack_build_id (*value)[PERF_MAX_STACK_DEPTH]; 39 + __type(value, stack_trace_t); 41 40 } stack_amap SEC(".maps"); 42 41 43 42 /* taken from /sys/kernel/debug/tracing/events/random/urandom_read/format */
+1 -1
tools/testing/selftests/bpf/progs/test_stacktrace_map.c
··· 35 35 __uint(type, BPF_MAP_TYPE_ARRAY); 36 36 __uint(max_entries, 16384); 37 37 __type(key, __u32); 38 - __u64 (*value)[PERF_MAX_STACK_DEPTH]; 38 + __type(value, stack_trace_t); 39 39 } stack_amap SEC(".maps"); 40 40 41 41 /* taken from /sys/kernel/debug/tracing/events/sched/sched_switch/format */
+9 -8
tools/testing/selftests/bpf/progs/test_xdp_noinline.c
··· 14 14 #include <linux/tcp.h> 15 15 #include <linux/udp.h> 16 16 #include "bpf_helpers.h" 17 + #include "bpf_endian.h" 17 18 18 19 static __u32 rol32(__u32 word, unsigned int shift) 19 20 { ··· 306 305 ip6h->nexthdr = IPPROTO_IPV6; 307 306 ip_suffix = pckt->flow.srcv6[3] ^ pckt->flow.port16[0]; 308 307 ip6h->payload_len = 309 - __builtin_bswap16(pkt_bytes + sizeof(struct ipv6hdr)); 308 + bpf_htons(pkt_bytes + sizeof(struct ipv6hdr)); 310 309 ip6h->hop_limit = 4; 311 310 312 311 ip6h->saddr.in6_u.u6_addr32[0] = 1; ··· 323 322 struct real_definition *dst, __u32 pkt_bytes) 324 323 { 325 324 326 - __u32 ip_suffix = __builtin_bswap16(pckt->flow.port16[0]); 325 + __u32 ip_suffix = bpf_ntohs(pckt->flow.port16[0]); 327 326 struct eth_hdr *new_eth; 328 327 struct eth_hdr *old_eth; 329 328 __u16 *next_iph_u16; ··· 353 352 iph->protocol = IPPROTO_IPIP; 354 353 iph->check = 0; 355 354 iph->tos = 1; 356 - iph->tot_len = __builtin_bswap16(pkt_bytes + sizeof(struct iphdr)); 355 + iph->tot_len = bpf_htons(pkt_bytes + sizeof(struct iphdr)); 357 356 /* don't update iph->daddr, since it will overwrite old eth_proto 358 357 * and multiple iterations of bpf_prog_run() will fail 359 358 */ ··· 640 639 iph_len = sizeof(struct ipv6hdr); 641 640 *protocol = ip6h->nexthdr; 642 641 pckt->flow.proto = *protocol; 643 - *pkt_bytes = __builtin_bswap16(ip6h->payload_len); 642 + *pkt_bytes = bpf_ntohs(ip6h->payload_len); 644 643 off += iph_len; 645 644 if (*protocol == 45) { 646 645 return XDP_DROP; ··· 672 671 return XDP_DROP; 673 672 *protocol = iph->protocol; 674 673 pckt->flow.proto = *protocol; 675 - *pkt_bytes = __builtin_bswap16(iph->tot_len); 674 + *pkt_bytes = bpf_ntohs(iph->tot_len); 676 675 off += 20; 677 676 if (iph->frag_off & 65343) 678 677 return XDP_DROP; ··· 809 808 nh_off = sizeof(struct eth_hdr); 810 809 if (data + nh_off > data_end) 811 810 return XDP_DROP; 812 - eth_proto = eth->eth_proto; 813 - if (eth_proto == 8) 811 + eth_proto = bpf_ntohs(eth->eth_proto); 812 + if (eth_proto == ETH_P_IP) 814 813 return process_packet(data, nh_off, data_end, 0, ctx); 815 - else if (eth_proto == 56710) 814 + else if (eth_proto == ETH_P_IPV6) 816 815 return process_packet(data, nh_off, data_end, 1, ctx); 817 816 else 818 817 return XDP_DROP;
+88
tools/testing/selftests/bpf/test_btf.c
··· 3417 3417 .value_type_id = 1, 3418 3418 .max_entries = 4, 3419 3419 }, 3420 + /* 3421 + * typedef int arr_t[16]; 3422 + * struct s { 3423 + * arr_t *a; 3424 + * }; 3425 + */ 3426 + { 3427 + .descr = "struct->ptr->typedef->array->int size resolution", 3428 + .raw_types = { 3429 + BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */ 3430 + BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3431 + BTF_PTR_ENC(3), /* [2] */ 3432 + BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 3433 + BTF_TYPE_ARRAY_ENC(5, 5, 16), /* [4] */ 3434 + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [5] */ 3435 + BTF_END_RAW, 3436 + }, 3437 + BTF_STR_SEC("\0s\0a\0arr_t"), 3438 + .map_type = BPF_MAP_TYPE_ARRAY, 3439 + .map_name = "ptr_mod_chain_size_resolve_map", 3440 + .key_size = sizeof(int), 3441 + .value_size = sizeof(int) * 16, 3442 + .key_type_id = 5 /* int */, 3443 + .value_type_id = 3 /* arr_t */, 3444 + .max_entries = 4, 3445 + }, 3446 + /* 3447 + * typedef int arr_t[16][8][4]; 3448 + * struct s { 3449 + * arr_t *a; 3450 + * }; 3451 + */ 3452 + { 3453 + .descr = "struct->ptr->typedef->multi-array->int size resolution", 3454 + .raw_types = { 3455 + BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */ 3456 + BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3457 + BTF_PTR_ENC(3), /* [2] */ 3458 + BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 3459 + BTF_TYPE_ARRAY_ENC(5, 7, 16), /* [4] */ 3460 + BTF_TYPE_ARRAY_ENC(6, 7, 8), /* [5] */ 3461 + BTF_TYPE_ARRAY_ENC(7, 7, 4), /* [6] */ 3462 + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [7] */ 3463 + BTF_END_RAW, 3464 + }, 3465 + BTF_STR_SEC("\0s\0a\0arr_t"), 3466 + .map_type = BPF_MAP_TYPE_ARRAY, 3467 + .map_name = "multi_arr_size_resolve_map", 3468 + .key_size = sizeof(int), 3469 + .value_size = sizeof(int) * 16 * 8 * 4, 3470 + .key_type_id = 7 /* int */, 3471 + .value_type_id = 3 /* arr_t */, 3472 + .max_entries = 4, 3473 + }, 3474 + /* 3475 + * typedef int int_t; 3476 + * typedef int_t arr3_t[4]; 3477 + * typedef arr3_t arr2_t[8]; 3478 + * typedef arr2_t arr1_t[16]; 3479 + * struct s { 3480 + * arr1_t *a; 3481 + * }; 3482 + */ 3483 + { 3484 + .descr = "typedef/multi-arr mix size resolution", 3485 + .raw_types = { 3486 + BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [1] */ 3487 + BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3488 + BTF_PTR_ENC(3), /* [2] */ 3489 + BTF_TYPEDEF_ENC(NAME_TBD, 4), /* [3] */ 3490 + BTF_TYPE_ARRAY_ENC(5, 10, 16), /* [4] */ 3491 + BTF_TYPEDEF_ENC(NAME_TBD, 6), /* [5] */ 3492 + BTF_TYPE_ARRAY_ENC(7, 10, 8), /* [6] */ 3493 + BTF_TYPEDEF_ENC(NAME_TBD, 8), /* [7] */ 3494 + BTF_TYPE_ARRAY_ENC(9, 10, 4), /* [8] */ 3495 + BTF_TYPEDEF_ENC(NAME_TBD, 10), /* [9] */ 3496 + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [10] */ 3497 + BTF_END_RAW, 3498 + }, 3499 + BTF_STR_SEC("\0s\0a\0arr1_t\0arr2_t\0arr3_t\0int_t"), 3500 + .map_type = BPF_MAP_TYPE_ARRAY, 3501 + .map_name = "typedef_arra_mix_size_resolve_map", 3502 + .key_size = sizeof(int), 3503 + .value_size = sizeof(int) * 16 * 8 * 4, 3504 + .key_type_id = 10 /* int */, 3505 + .value_type_id = 3 /* arr_t */, 3506 + .max_entries = 4, 3507 + }, 3420 3508 3421 3509 }; /* struct btf_raw_test raw_tests[] */ 3422 3510
+8
tools/testing/selftests/bpf/test_progs.h
··· 92 92 int compare_stack_ips(int smap_fd, int amap_fd, int stack_trace_len); 93 93 int extract_build_id(char *build_id, size_t size); 94 94 void *spin_lock_thread(void *arg); 95 + 96 + #ifdef __x86_64__ 97 + #define SYS_NANOSLEEP_KPROBE_NAME "__x64_sys_nanosleep" 98 + #elif defined(__s390x__) 99 + #define SYS_NANOSLEEP_KPROBE_NAME "__s390x_sys_nanosleep" 100 + #else 101 + #define SYS_NANOSLEEP_KPROBE_NAME "sys_nanosleep" 102 + #endif
+15 -20
tools/testing/selftests/bpf/test_verifier.c
··· 86 86 int fixup_sk_storage_map[MAX_FIXUPS]; 87 87 const char *errstr; 88 88 const char *errstr_unpriv; 89 - uint32_t retval, retval_unpriv, insn_processed; 89 + uint32_t insn_processed; 90 90 int prog_len; 91 91 enum { 92 92 UNDEF, ··· 95 95 } result, result_unpriv; 96 96 enum bpf_prog_type prog_type; 97 97 uint8_t flags; 98 - __u8 data[TEST_DATA_LEN]; 99 98 void (*fill_helper)(struct bpf_test *self); 100 99 uint8_t runs; 101 - struct { 102 - uint32_t retval, retval_unpriv; 103 - union { 104 - __u8 data[TEST_DATA_LEN]; 105 - __u64 data64[TEST_DATA_LEN / 8]; 106 - }; 107 - } retvals[MAX_TEST_RUNS]; 100 + #define bpf_testdata_struct_t \ 101 + struct { \ 102 + uint32_t retval, retval_unpriv; \ 103 + union { \ 104 + __u8 data[TEST_DATA_LEN]; \ 105 + __u64 data64[TEST_DATA_LEN / 8]; \ 106 + }; \ 107 + } 108 + union { 109 + bpf_testdata_struct_t; 110 + bpf_testdata_struct_t retvals[MAX_TEST_RUNS]; 111 + }; 108 112 enum bpf_attach_type expected_attach_type; 109 113 }; 110 114 ··· 953 949 uint32_t expected_val; 954 950 int i; 955 951 956 - if (!test->runs) { 957 - expected_val = unpriv && test->retval_unpriv ? 958 - test->retval_unpriv : test->retval; 959 - 960 - err = do_prog_test_run(fd_prog, unpriv, expected_val, 961 - test->data, sizeof(test->data)); 962 - if (err) 963 - run_errs++; 964 - else 965 - run_successes++; 966 - } 952 + if (!test->runs) 953 + test->runs = 1; 967 954 968 955 for (i = 0; i < test->runs; i++) { 969 956 if (unpriv && test->retvals[i].retval_unpriv)
+1 -1
tools/testing/selftests/bpf/verifier/array_access.c
··· 226 226 BPF_LD_MAP_FD(BPF_REG_1, 0), 227 227 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 228 228 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 229 - BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 229 + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0), 230 230 BPF_EXIT_INSN(), 231 231 }, 232 232 .fixup_map_array_ro = { 3 },
+1 -1
tools/testing/selftests/bpf/verifier/value_ptr_arith.c
··· 183 183 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 184 184 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 185 185 BPF_EXIT_INSN(), 186 - BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 186 + BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 187 187 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 188 188 BPF_MOV64_IMM(BPF_REG_2, 0), 189 189 BPF_MOV64_IMM(BPF_REG_3, 0x100000),
+73
tools/testing/selftests/bpf/verifier/wide_access.c
··· 1 + #define BPF_SOCK_ADDR_STORE(field, off, res, err) \ 2 + { \ 3 + "wide store to bpf_sock_addr." #field "[" #off "]", \ 4 + .insns = { \ 5 + BPF_MOV64_IMM(BPF_REG_0, 1), \ 6 + BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, \ 7 + offsetof(struct bpf_sock_addr, field[off])), \ 8 + BPF_EXIT_INSN(), \ 9 + }, \ 10 + .result = res, \ 11 + .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \ 12 + .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \ 13 + .errstr = err, \ 14 + } 15 + 16 + /* user_ip6[0] is u64 aligned */ 17 + BPF_SOCK_ADDR_STORE(user_ip6, 0, ACCEPT, 18 + NULL), 19 + BPF_SOCK_ADDR_STORE(user_ip6, 1, REJECT, 20 + "invalid bpf_context access off=12 size=8"), 21 + BPF_SOCK_ADDR_STORE(user_ip6, 2, ACCEPT, 22 + NULL), 23 + BPF_SOCK_ADDR_STORE(user_ip6, 3, REJECT, 24 + "invalid bpf_context access off=20 size=8"), 25 + 26 + /* msg_src_ip6[0] is _not_ u64 aligned */ 27 + BPF_SOCK_ADDR_STORE(msg_src_ip6, 0, REJECT, 28 + "invalid bpf_context access off=44 size=8"), 29 + BPF_SOCK_ADDR_STORE(msg_src_ip6, 1, ACCEPT, 30 + NULL), 31 + BPF_SOCK_ADDR_STORE(msg_src_ip6, 2, REJECT, 32 + "invalid bpf_context access off=52 size=8"), 33 + BPF_SOCK_ADDR_STORE(msg_src_ip6, 3, REJECT, 34 + "invalid bpf_context access off=56 size=8"), 35 + 36 + #undef BPF_SOCK_ADDR_STORE 37 + 38 + #define BPF_SOCK_ADDR_LOAD(field, off, res, err) \ 39 + { \ 40 + "wide load from bpf_sock_addr." #field "[" #off "]", \ 41 + .insns = { \ 42 + BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, \ 43 + offsetof(struct bpf_sock_addr, field[off])), \ 44 + BPF_MOV64_IMM(BPF_REG_0, 1), \ 45 + BPF_EXIT_INSN(), \ 46 + }, \ 47 + .result = res, \ 48 + .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \ 49 + .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \ 50 + .errstr = err, \ 51 + } 52 + 53 + /* user_ip6[0] is u64 aligned */ 54 + BPF_SOCK_ADDR_LOAD(user_ip6, 0, ACCEPT, 55 + NULL), 56 + BPF_SOCK_ADDR_LOAD(user_ip6, 1, REJECT, 57 + "invalid bpf_context access off=12 size=8"), 58 + BPF_SOCK_ADDR_LOAD(user_ip6, 2, ACCEPT, 59 + NULL), 60 + BPF_SOCK_ADDR_LOAD(user_ip6, 3, REJECT, 61 + "invalid bpf_context access off=20 size=8"), 62 + 63 + /* msg_src_ip6[0] is _not_ u64 aligned */ 64 + BPF_SOCK_ADDR_LOAD(msg_src_ip6, 0, REJECT, 65 + "invalid bpf_context access off=44 size=8"), 66 + BPF_SOCK_ADDR_LOAD(msg_src_ip6, 1, ACCEPT, 67 + NULL), 68 + BPF_SOCK_ADDR_LOAD(msg_src_ip6, 2, REJECT, 69 + "invalid bpf_context access off=52 size=8"), 70 + BPF_SOCK_ADDR_LOAD(msg_src_ip6, 3, REJECT, 71 + "invalid bpf_context access off=56 size=8"), 72 + 73 + #undef BPF_SOCK_ADDR_LOAD
-36
tools/testing/selftests/bpf/verifier/wide_store.c
··· 1 - #define BPF_SOCK_ADDR(field, off, res, err) \ 2 - { \ 3 - "wide store to bpf_sock_addr." #field "[" #off "]", \ 4 - .insns = { \ 5 - BPF_MOV64_IMM(BPF_REG_0, 1), \ 6 - BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, \ 7 - offsetof(struct bpf_sock_addr, field[off])), \ 8 - BPF_EXIT_INSN(), \ 9 - }, \ 10 - .result = res, \ 11 - .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR, \ 12 - .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG, \ 13 - .errstr = err, \ 14 - } 15 - 16 - /* user_ip6[0] is u64 aligned */ 17 - BPF_SOCK_ADDR(user_ip6, 0, ACCEPT, 18 - NULL), 19 - BPF_SOCK_ADDR(user_ip6, 1, REJECT, 20 - "invalid bpf_context access off=12 size=8"), 21 - BPF_SOCK_ADDR(user_ip6, 2, ACCEPT, 22 - NULL), 23 - BPF_SOCK_ADDR(user_ip6, 3, REJECT, 24 - "invalid bpf_context access off=20 size=8"), 25 - 26 - /* msg_src_ip6[0] is _not_ u64 aligned */ 27 - BPF_SOCK_ADDR(msg_src_ip6, 0, REJECT, 28 - "invalid bpf_context access off=44 size=8"), 29 - BPF_SOCK_ADDR(msg_src_ip6, 1, ACCEPT, 30 - NULL), 31 - BPF_SOCK_ADDR(msg_src_ip6, 2, REJECT, 32 - "invalid bpf_context access off=52 size=8"), 33 - BPF_SOCK_ADDR(msg_src_ip6, 3, REJECT, 34 - "invalid bpf_context access off=56 size=8"), 35 - 36 - #undef BPF_SOCK_ADDR
+34 -1
tools/testing/selftests/net/fib_tests.sh
··· 9 9 ksft_skip=4 10 10 11 11 # all tests in this script. Can be overridden with -t option 12 - TESTS="unregister down carrier nexthop ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw" 12 + TESTS="unregister down carrier nexthop ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw rp_filter" 13 13 14 14 VERBOSE=0 15 15 PAUSE_ON_FAIL=no 16 16 PAUSE=no 17 17 IP="ip -netns ns1" 18 + NS_EXEC="ip netns exec ns1" 18 19 19 20 log_test() 20 21 { ··· 432 431 { 433 432 fib_carrier_local_test 434 433 fib_carrier_unicast_test 434 + } 435 + 436 + fib_rp_filter_test() 437 + { 438 + echo 439 + echo "IPv4 rp_filter tests" 440 + 441 + setup 442 + 443 + set -e 444 + $IP link set dev lo address 52:54:00:6a:c7:5e 445 + $IP link set dummy0 address 52:54:00:6a:c7:5e 446 + $IP link add dummy1 type dummy 447 + $IP link set dummy1 address 52:54:00:6a:c7:5e 448 + $IP link set dev dummy1 up 449 + $NS_EXEC sysctl -qw net.ipv4.conf.all.rp_filter=1 450 + $NS_EXEC sysctl -qw net.ipv4.conf.all.accept_local=1 451 + $NS_EXEC sysctl -qw net.ipv4.conf.all.route_localnet=1 452 + 453 + $NS_EXEC tc qd add dev dummy1 parent root handle 1: fq_codel 454 + $NS_EXEC tc filter add dev dummy1 parent 1: protocol arp basic action mirred egress redirect dev lo 455 + $NS_EXEC tc filter add dev dummy1 parent 1: protocol ip basic action mirred egress redirect dev lo 456 + set +e 457 + 458 + run_cmd "ip netns exec ns1 ping -I dummy1 -w1 -c1 198.51.100.1" 459 + log_test $? 0 "rp_filter passes local packets" 460 + 461 + run_cmd "ip netns exec ns1 ping -I dummy1 -w1 -c1 127.0.0.1" 462 + log_test $? 0 "rp_filter passes loopback packets" 463 + 464 + cleanup 435 465 } 436 466 437 467 ################################################################################ ··· 1589 1557 fib_unreg_test|unregister) fib_unreg_test;; 1590 1558 fib_down_test|down) fib_down_test;; 1591 1559 fib_carrier_test|carrier) fib_carrier_test;; 1560 + fib_rp_filter_test|rp_filter) fib_rp_filter_test;; 1592 1561 fib_nexthop_test|nexthop) fib_nexthop_test;; 1593 1562 ipv6_route_test|ipv6_rt) ipv6_route_test;; 1594 1563 ipv4_route_test|ipv4_rt) ipv4_route_test;;