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/netdev/net

Pull networking fixes from David Miller:

1) Fix leak in nl80211 AP start where we leak the ACL memory, from
Johannes Berg.

2) Fix double mutex unlock in mac80211, from Andrei Otcheretianski.

3) Fix RCU stall in ipset, from Jozsef Kadlecsik.

4) Fix devlink locking in devlink_dpipe_table_register, from Madhuparna
Bhowmik.

5) Fix race causing TX hang in ll_temac, from Esben Haabendal.

6) Stale eth hdr pointer in br_dev_xmit(), from Nikolay Aleksandrov.

7) Fix TX hash calculation bounds checking wrt. tc rules, from Amritha
Nambiar.

8) Size netlink responses properly in schedule action code to take into
consideration TCA_ACT_FLAGS. From Jiri Pirko.

9) Fix firmware paths for mscc PHY driver, from Antoine Tenart.

10) Don't register stmmac notifier multiple times, from Aaro Koskinen.

11) Various rmnet bug fixes, from Taehee Yoo.

12) Fix vsock deadlock in vsock transport release, from Stefano
Garzarella.

* git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (61 commits)
net: dsa: mv88e6xxx: Fix masking of egress port
mlxsw: pci: Wait longer before accessing the device after reset
sfc: fix timestamp reconstruction at 16-bit rollover points
vsock: fix potential deadlock in transport->release()
unix: It's CONFIG_PROC_FS not CONFIG_PROCFS
net: rmnet: fix packet forwarding in rmnet bridge mode
net: rmnet: fix bridge mode bugs
net: rmnet: use upper/lower device infrastructure
net: rmnet: do not allow to change mux id if mux id is duplicated
net: rmnet: remove rcu_read_lock in rmnet_force_unassociate_device()
net: rmnet: fix suspicious RCU usage
net: rmnet: fix NULL pointer dereference in rmnet_changelink()
net: rmnet: fix NULL pointer dereference in rmnet_newlink()
net: phy: marvell: don't interpret PHY status unless resolved
mlx5: register lag notifier for init network namespace only
unix: define and set show_fdinfo only if procfs is enabled
hinic: fix a bug of rss configuration
hinic: fix a bug of setting hw_ioctxt
hinic: fix a irq affinity bug
net/smc: check for valid ib_client_data
...

+1059 -533
+3 -2
Documentation/networking/phy.rst
··· 487 487 The stubs set one of the two matching criteria, and set the other one to 488 488 match anything. 489 489 490 - When phy_register_fixup() or \*_for_uid()/\*_for_id() is called at module, 491 - unregister fixup and free allocate memory are required. 490 + When phy_register_fixup() or \*_for_uid()/\*_for_id() is called at module load 491 + time, the module needs to unregister the fixup and free allocated memory when 492 + it's unloaded. 492 493 493 494 Call one of following function before unloading module:: 494 495
+1 -2
drivers/net/dsa/bcm_sf2.c
··· 69 69 /* Force link status for IMP port */ 70 70 reg = core_readl(priv, offset); 71 71 reg |= (MII_SW_OR | LINK_STS); 72 - if (priv->type == BCM7278_DEVICE_ID) 73 - reg |= GMII_SPEED_UP_2G; 72 + reg &= ~GMII_SPEED_UP_2G; 74 73 core_writel(priv, reg, offset); 75 74 76 75 /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */
+2 -2
drivers/net/dsa/mv88e6xxx/global1.c
··· 278 278 switch (direction) { 279 279 case MV88E6XXX_EGRESS_DIR_INGRESS: 280 280 dest_port_chip = &chip->ingress_dest_port; 281 - reg &= MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK; 281 + reg &= ~MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK; 282 282 reg |= port << 283 283 __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK); 284 284 break; 285 285 case MV88E6XXX_EGRESS_DIR_EGRESS: 286 286 dest_port_chip = &chip->egress_dest_port; 287 - reg &= MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK; 287 + reg &= ~MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK; 288 288 reg |= port << 289 289 __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK); 290 290 break;
+2 -2
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 11252 11252 } 11253 11253 } 11254 11254 if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event)) 11255 - netdev_info(bp->dev, "Receive PF driver unload event!"); 11255 + netdev_info(bp->dev, "Receive PF driver unload event!\n"); 11256 11256 } 11257 11257 11258 11258 #else ··· 11759 11759 u32 dw; 11760 11760 11761 11761 if (!pos) { 11762 - netdev_info(bp->dev, "Unable do read adapter's DSN"); 11762 + netdev_info(bp->dev, "Unable do read adapter's DSN\n"); 11763 11763 return -EOPNOTSUPP; 11764 11764 } 11765 11765
+5 -5
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
··· 641 641 rc = devlink_params_register(bp->dl, bnxt_dl_params, 642 642 ARRAY_SIZE(bnxt_dl_params)); 643 643 if (rc) { 644 - netdev_warn(bp->dev, "devlink_params_register failed. rc=%d", 644 + netdev_warn(bp->dev, "devlink_params_register failed. rc=%d\n", 645 645 rc); 646 646 return rc; 647 647 } 648 648 rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params, 649 649 ARRAY_SIZE(bnxt_dl_port_params)); 650 650 if (rc) { 651 - netdev_err(bp->dev, "devlink_port_params_register failed"); 651 + netdev_err(bp->dev, "devlink_port_params_register failed\n"); 652 652 devlink_params_unregister(bp->dl, bnxt_dl_params, 653 653 ARRAY_SIZE(bnxt_dl_params)); 654 654 return rc; ··· 679 679 else 680 680 dl = devlink_alloc(&bnxt_vf_dl_ops, sizeof(struct bnxt_dl)); 681 681 if (!dl) { 682 - netdev_warn(bp->dev, "devlink_alloc failed"); 682 + netdev_warn(bp->dev, "devlink_alloc failed\n"); 683 683 return -ENOMEM; 684 684 } 685 685 ··· 692 692 693 693 rc = devlink_register(dl, &bp->pdev->dev); 694 694 if (rc) { 695 - netdev_warn(bp->dev, "devlink_register failed. rc=%d", rc); 695 + netdev_warn(bp->dev, "devlink_register failed. rc=%d\n", rc); 696 696 goto err_dl_free; 697 697 } 698 698 ··· 704 704 sizeof(bp->dsn)); 705 705 rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id); 706 706 if (rc) { 707 - netdev_err(bp->dev, "devlink_port_register failed"); 707 + netdev_err(bp->dev, "devlink_port_register failed\n"); 708 708 goto err_dl_unreg; 709 709 } 710 710
+2 -2
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
··· 2028 2028 } 2029 2029 2030 2030 if (fw->size > item_len) { 2031 - netdev_err(dev, "PKG insufficient update area in nvram: %lu", 2031 + netdev_err(dev, "PKG insufficient update area in nvram: %lu\n", 2032 2032 (unsigned long)fw->size); 2033 2033 rc = -EFBIG; 2034 2034 } else { ··· 3338 3338 kfree(coredump.data); 3339 3339 *dump_len += sizeof(struct bnxt_coredump_record); 3340 3340 if (rc == -ENOBUFS) 3341 - netdev_err(bp->dev, "Firmware returned large coredump buffer"); 3341 + netdev_err(bp->dev, "Firmware returned large coredump buffer\n"); 3342 3342 return rc; 3343 3343 } 3344 3344
+24 -24
drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
··· 50 50 51 51 /* check if dev belongs to the same switch */ 52 52 if (!netdev_port_same_parent_id(pf_bp->dev, dev)) { 53 - netdev_info(pf_bp->dev, "dev(ifindex=%d) not on same switch", 53 + netdev_info(pf_bp->dev, "dev(ifindex=%d) not on same switch\n", 54 54 dev->ifindex); 55 55 return BNXT_FID_INVALID; 56 56 } ··· 70 70 struct net_device *dev = act->dev; 71 71 72 72 if (!dev) { 73 - netdev_info(bp->dev, "no dev in mirred action"); 73 + netdev_info(bp->dev, "no dev in mirred action\n"); 74 74 return -EINVAL; 75 75 } 76 76 ··· 106 106 const struct ip_tunnel_key *tun_key = &tun_info->key; 107 107 108 108 if (ip_tunnel_info_af(tun_info) != AF_INET) { 109 - netdev_info(bp->dev, "only IPv4 tunnel-encap is supported"); 109 + netdev_info(bp->dev, "only IPv4 tunnel-encap is supported\n"); 110 110 return -EOPNOTSUPP; 111 111 } 112 112 ··· 295 295 int i, rc; 296 296 297 297 if (!flow_action_has_entries(flow_action)) { 298 - netdev_info(bp->dev, "no actions"); 298 + netdev_info(bp->dev, "no actions\n"); 299 299 return -EINVAL; 300 300 } 301 301 ··· 370 370 /* KEY_CONTROL and KEY_BASIC are needed for forming a meaningful key */ 371 371 if ((dissector->used_keys & BIT(FLOW_DISSECTOR_KEY_CONTROL)) == 0 || 372 372 (dissector->used_keys & BIT(FLOW_DISSECTOR_KEY_BASIC)) == 0) { 373 - netdev_info(bp->dev, "cannot form TC key: used_keys = 0x%x", 373 + netdev_info(bp->dev, "cannot form TC key: used_keys = 0x%x\n", 374 374 dissector->used_keys); 375 375 return -EOPNOTSUPP; 376 376 } ··· 508 508 509 509 rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); 510 510 if (rc) 511 - netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); 511 + netdev_info(bp->dev, "%s: Error rc=%d\n", __func__, rc); 512 512 513 513 return rc; 514 514 } ··· 841 841 resp = bnxt_get_hwrm_resp_addr(bp, &req); 842 842 *decap_filter_handle = resp->decap_filter_id; 843 843 } else { 844 - netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); 844 + netdev_info(bp->dev, "%s: Error rc=%d\n", __func__, rc); 845 845 } 846 846 mutex_unlock(&bp->hwrm_cmd_lock); 847 847 ··· 859 859 860 860 rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); 861 861 if (rc) 862 - netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); 862 + netdev_info(bp->dev, "%s: Error rc=%d\n", __func__, rc); 863 863 864 864 return rc; 865 865 } ··· 906 906 resp = bnxt_get_hwrm_resp_addr(bp, &req); 907 907 *encap_record_handle = resp->encap_record_id; 908 908 } else { 909 - netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); 909 + netdev_info(bp->dev, "%s: Error rc=%d\n", __func__, rc); 910 910 } 911 911 mutex_unlock(&bp->hwrm_cmd_lock); 912 912 ··· 924 924 925 925 rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); 926 926 if (rc) 927 - netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); 927 + netdev_info(bp->dev, "%s: Error rc=%d\n", __func__, rc); 928 928 929 929 return rc; 930 930 } ··· 943 943 tc_info->l2_ht_params); 944 944 if (rc) 945 945 netdev_err(bp->dev, 946 - "Error: %s: rhashtable_remove_fast: %d", 946 + "Error: %s: rhashtable_remove_fast: %d\n", 947 947 __func__, rc); 948 948 kfree_rcu(l2_node, rcu); 949 949 } ··· 972 972 if (rc) { 973 973 kfree_rcu(l2_node, rcu); 974 974 netdev_err(bp->dev, 975 - "Error: %s: rhashtable_insert_fast: %d", 975 + "Error: %s: rhashtable_insert_fast: %d\n", 976 976 __func__, rc); 977 977 return NULL; 978 978 } ··· 1031 1031 if ((flow->flags & BNXT_TC_FLOW_FLAGS_PORTS) && 1032 1032 (flow->l4_key.ip_proto != IPPROTO_TCP && 1033 1033 flow->l4_key.ip_proto != IPPROTO_UDP)) { 1034 - netdev_info(bp->dev, "Cannot offload non-TCP/UDP (%d) ports", 1034 + netdev_info(bp->dev, "Cannot offload non-TCP/UDP (%d) ports\n", 1035 1035 flow->l4_key.ip_proto); 1036 1036 return false; 1037 1037 } ··· 1088 1088 rc = rhashtable_remove_fast(tunnel_table, &tunnel_node->node, 1089 1089 *ht_params); 1090 1090 if (rc) { 1091 - netdev_err(bp->dev, "rhashtable_remove_fast rc=%d", rc); 1091 + netdev_err(bp->dev, "rhashtable_remove_fast rc=%d\n", rc); 1092 1092 rc = -1; 1093 1093 } 1094 1094 kfree_rcu(tunnel_node, rcu); ··· 1129 1129 tunnel_node->refcount++; 1130 1130 return tunnel_node; 1131 1131 err: 1132 - netdev_info(bp->dev, "error rc=%d", rc); 1132 + netdev_info(bp->dev, "error rc=%d\n", rc); 1133 1133 return NULL; 1134 1134 } 1135 1135 ··· 1187 1187 &decap_l2_node->node, 1188 1188 tc_info->decap_l2_ht_params); 1189 1189 if (rc) 1190 - netdev_err(bp->dev, "rhashtable_remove_fast rc=%d", rc); 1190 + netdev_err(bp->dev, "rhashtable_remove_fast rc=%d\n", rc); 1191 1191 kfree_rcu(decap_l2_node, rcu); 1192 1192 } 1193 1193 } ··· 1227 1227 1228 1228 rt = ip_route_output_key(dev_net(real_dst_dev), &flow); 1229 1229 if (IS_ERR(rt)) { 1230 - netdev_info(bp->dev, "no route to %pI4b", &flow.daddr); 1230 + netdev_info(bp->dev, "no route to %pI4b\n", &flow.daddr); 1231 1231 return -EOPNOTSUPP; 1232 1232 } 1233 1233 ··· 1241 1241 1242 1242 if (vlan->real_dev != real_dst_dev) { 1243 1243 netdev_info(bp->dev, 1244 - "dst_dev(%s) doesn't use PF-if(%s)", 1244 + "dst_dev(%s) doesn't use PF-if(%s)\n", 1245 1245 netdev_name(dst_dev), 1246 1246 netdev_name(real_dst_dev)); 1247 1247 rc = -EOPNOTSUPP; ··· 1253 1253 #endif 1254 1254 } else if (dst_dev != real_dst_dev) { 1255 1255 netdev_info(bp->dev, 1256 - "dst_dev(%s) for %pI4b is not PF-if(%s)", 1256 + "dst_dev(%s) for %pI4b is not PF-if(%s)\n", 1257 1257 netdev_name(dst_dev), &flow.daddr, 1258 1258 netdev_name(real_dst_dev)); 1259 1259 rc = -EOPNOTSUPP; ··· 1262 1262 1263 1263 nbr = dst_neigh_lookup(&rt->dst, &flow.daddr); 1264 1264 if (!nbr) { 1265 - netdev_info(bp->dev, "can't lookup neighbor for %pI4b", 1265 + netdev_info(bp->dev, "can't lookup neighbor for %pI4b\n", 1266 1266 &flow.daddr); 1267 1267 rc = -EOPNOTSUPP; 1268 1268 goto put_rt; ··· 1472 1472 rc = rhashtable_remove_fast(&tc_info->flow_table, &flow_node->node, 1473 1473 tc_info->flow_ht_params); 1474 1474 if (rc) 1475 - netdev_err(bp->dev, "Error: %s: rhashtable_remove_fast rc=%d", 1475 + netdev_err(bp->dev, "Error: %s: rhashtable_remove_fast rc=%d\n", 1476 1476 __func__, rc); 1477 1477 1478 1478 kfree_rcu(flow_node, rcu); ··· 1587 1587 free_node: 1588 1588 kfree_rcu(new_node, rcu); 1589 1589 done: 1590 - netdev_err(bp->dev, "Error: %s: cookie=0x%lx error=%d", 1590 + netdev_err(bp->dev, "Error: %s: cookie=0x%lx error=%d\n", 1591 1591 __func__, tc_flow_cmd->cookie, rc); 1592 1592 return rc; 1593 1593 } ··· 1700 1700 le64_to_cpu(resp_bytes[i]); 1701 1701 } 1702 1702 } else { 1703 - netdev_info(bp->dev, "error rc=%d", rc); 1703 + netdev_info(bp->dev, "error rc=%d\n", rc); 1704 1704 } 1705 1705 mutex_unlock(&bp->hwrm_cmd_lock); 1706 1706 ··· 1970 1970 bp); 1971 1971 if (rc) 1972 1972 netdev_info(bp->dev, 1973 - "Failed to register indirect blk: dev: %s", 1973 + "Failed to register indirect blk: dev: %s\n", 1974 1974 netdev->name); 1975 1975 break; 1976 1976 case NETDEV_UNREGISTER:
+5 -5
drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c
··· 43 43 netdev_dbg(bp->dev, "tx_cfa_action=0x%x, rx_cfa_code=0x%x", 44 44 *tx_cfa_action, *rx_cfa_code); 45 45 } else { 46 - netdev_info(bp->dev, "%s error rc=%d", __func__, rc); 46 + netdev_info(bp->dev, "%s error rc=%d\n", __func__, rc); 47 47 } 48 48 49 49 mutex_unlock(&bp->hwrm_cmd_lock); ··· 60 60 61 61 rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); 62 62 if (rc) 63 - netdev_info(bp->dev, "%s error rc=%d", __func__, rc); 63 + netdev_info(bp->dev, "%s error rc=%d\n", __func__, rc); 64 64 return rc; 65 65 } 66 66 ··· 465 465 return 0; 466 466 467 467 err: 468 - netdev_info(bp->dev, "%s error=%d", __func__, rc); 468 + netdev_info(bp->dev, "%s error=%d\n", __func__, rc); 469 469 kfree(cfa_code_map); 470 470 __bnxt_vf_reps_destroy(bp); 471 471 return rc; ··· 488 488 489 489 mutex_lock(&bp->sriov_lock); 490 490 if (bp->eswitch_mode == mode) { 491 - netdev_info(bp->dev, "already in %s eswitch mode", 491 + netdev_info(bp->dev, "already in %s eswitch mode\n", 492 492 mode == DEVLINK_ESWITCH_MODE_LEGACY ? 493 493 "legacy" : "switchdev"); 494 494 rc = -EINVAL; ··· 508 508 } 509 509 510 510 if (pci_num_vf(bp->pdev) == 0) { 511 - netdev_info(bp->dev, "Enable VFs before setting switchdev mode"); 511 + netdev_info(bp->dev, "Enable VFs before setting switchdev mode\n"); 512 512 rc = -EPERM; 513 513 goto done; 514 514 }
+1
drivers/net/ethernet/broadcom/genet/bcmmii.c
··· 294 294 */ 295 295 if (priv->ext_phy) { 296 296 reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL); 297 + reg &= ~ID_MODE_DIS; 297 298 reg |= id_mode_dis; 298 299 if (GENET_IS_V1(priv) || GENET_IS_V2(priv) || GENET_IS_V3(priv)) 299 300 reg |= RGMII_MODE_EN_V123;
+1
drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c
··· 297 297 } 298 298 299 299 hw_ioctxt.func_idx = HINIC_HWIF_FUNC_IDX(hwif); 300 + hw_ioctxt.ppf_idx = HINIC_HWIF_PPF_IDX(hwif); 300 301 301 302 hw_ioctxt.set_cmdq_depth = HW_IOCTXT_SET_CMDQ_DEPTH_DEFAULT; 302 303 hw_ioctxt.cmdq_depth = 0;
+1 -1
drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h
··· 151 151 152 152 u8 lro_en; 153 153 u8 rsvd3; 154 + u8 ppf_idx; 154 155 u8 rsvd4; 155 - u8 rsvd5; 156 156 157 157 u16 rq_depth; 158 158 u16 rx_buf_sz_idx;
+1
drivers/net/ethernet/huawei/hinic/hinic_hw_if.h
··· 137 137 #define HINIC_HWIF_FUNC_IDX(hwif) ((hwif)->attr.func_idx) 138 138 #define HINIC_HWIF_PCI_INTF(hwif) ((hwif)->attr.pci_intf_idx) 139 139 #define HINIC_HWIF_PF_IDX(hwif) ((hwif)->attr.pf_idx) 140 + #define HINIC_HWIF_PPF_IDX(hwif) ((hwif)->attr.ppf_idx) 140 141 141 142 #define HINIC_FUNC_TYPE(hwif) ((hwif)->attr.func_type) 142 143 #define HINIC_IS_PF(hwif) (HINIC_FUNC_TYPE(hwif) == HINIC_PF)
+1
drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h
··· 94 94 95 95 struct hinic_wq *wq; 96 96 97 + struct cpumask affinity_mask; 97 98 u32 irq; 98 99 u16 msix_entry; 99 100
+2 -1
drivers/net/ethernet/huawei/hinic/hinic_main.c
··· 356 356 if (!num_cpus) 357 357 num_cpus = num_online_cpus(); 358 358 359 - nic_dev->num_qps = min_t(u16, nic_dev->max_qps, num_cpus); 359 + nic_dev->num_qps = hinic_hwdev_num_qps(hwdev); 360 + nic_dev->num_qps = min_t(u16, nic_dev->num_qps, num_cpus); 360 361 361 362 nic_dev->rss_limit = nic_dev->num_qps; 362 363 nic_dev->num_rss = nic_dev->num_qps;
+2 -3
drivers/net/ethernet/huawei/hinic/hinic_rx.c
··· 475 475 struct hinic_hwdev *hwdev = nic_dev->hwdev; 476 476 struct hinic_rq *rq = rxq->rq; 477 477 struct hinic_qp *qp; 478 - struct cpumask mask; 479 478 int err; 480 479 481 480 rx_add_napi(rxq); ··· 491 492 } 492 493 493 494 qp = container_of(rq, struct hinic_qp, rq); 494 - cpumask_set_cpu(qp->q_id % num_online_cpus(), &mask); 495 - return irq_set_affinity_hint(rq->irq, &mask); 495 + cpumask_set_cpu(qp->q_id % num_online_cpus(), &rq->affinity_mask); 496 + return irq_set_affinity_hint(rq->irq, &rq->affinity_mask); 496 497 } 497 498 498 499 static void rx_free_irq(struct hinic_rxq *rxq)
+1 -2
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
··· 5147 5147 5148 5148 static void mlx5e_nic_disable(struct mlx5e_priv *priv) 5149 5149 { 5150 - struct net_device *netdev = priv->netdev; 5151 5150 struct mlx5_core_dev *mdev = priv->mdev; 5152 5151 5153 5152 #ifdef CONFIG_MLX5_CORE_EN_DCB ··· 5167 5168 mlx5e_monitor_counter_cleanup(priv); 5168 5169 5169 5170 mlx5e_disable_async_events(priv); 5170 - mlx5_lag_remove(mdev, netdev); 5171 + mlx5_lag_remove(mdev); 5171 5172 } 5172 5173 5173 5174 int mlx5e_update_nic_rx(struct mlx5e_priv *priv)
+1 -2
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
··· 1861 1861 1862 1862 static void mlx5e_uplink_rep_disable(struct mlx5e_priv *priv) 1863 1863 { 1864 - struct net_device *netdev = priv->netdev; 1865 1864 struct mlx5_core_dev *mdev = priv->mdev; 1866 1865 struct mlx5e_rep_priv *rpriv = priv->ppriv; 1867 1866 ··· 1869 1870 #endif 1870 1871 mlx5_notifier_unregister(mdev, &priv->events_nb); 1871 1872 cancel_work_sync(&rpriv->uplink_priv.reoffload_flows_work); 1872 - mlx5_lag_remove(mdev, netdev); 1873 + mlx5_lag_remove(mdev); 1873 1874 } 1874 1875 1875 1876 static MLX5E_DEFINE_STATS_GRP(sw_rep, 0);
+3 -8
drivers/net/ethernet/mellanox/mlx5/core/lag.c
··· 464 464 struct mlx5_lag *ldev; 465 465 int changed = 0; 466 466 467 - if (!net_eq(dev_net(ndev), &init_net)) 468 - return NOTIFY_DONE; 469 - 470 467 if ((event != NETDEV_CHANGEUPPER) && (event != NETDEV_CHANGELOWERSTATE)) 471 468 return NOTIFY_DONE; 472 469 ··· 583 586 584 587 if (!ldev->nb.notifier_call) { 585 588 ldev->nb.notifier_call = mlx5_lag_netdev_event; 586 - if (register_netdevice_notifier_dev_net(netdev, &ldev->nb, 587 - &ldev->nn)) { 589 + if (register_netdevice_notifier_net(&init_net, &ldev->nb)) { 588 590 ldev->nb.notifier_call = NULL; 589 591 mlx5_core_err(dev, "Failed to register LAG netdev notifier\n"); 590 592 } ··· 596 600 } 597 601 598 602 /* Must be called with intf_mutex held */ 599 - void mlx5_lag_remove(struct mlx5_core_dev *dev, struct net_device *netdev) 603 + void mlx5_lag_remove(struct mlx5_core_dev *dev) 600 604 { 601 605 struct mlx5_lag *ldev; 602 606 int i; ··· 616 620 617 621 if (i == MLX5_MAX_PORTS) { 618 622 if (ldev->nb.notifier_call) 619 - unregister_netdevice_notifier_dev_net(netdev, &ldev->nb, 620 - &ldev->nn); 623 + unregister_netdevice_notifier_net(&init_net, &ldev->nb); 621 624 mlx5_lag_mp_cleanup(ldev); 622 625 cancel_delayed_work_sync(&ldev->bond_work); 623 626 mlx5_lag_dev_free(ldev);
-1
drivers/net/ethernet/mellanox/mlx5/core/lag.h
··· 44 44 struct workqueue_struct *wq; 45 45 struct delayed_work bond_work; 46 46 struct notifier_block nb; 47 - struct netdev_net_notifier nn; 48 47 struct lag_mp lag_mp; 49 48 }; 50 49
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
··· 157 157 u8 feature_group, u8 access_reg_group); 158 158 159 159 void mlx5_lag_add(struct mlx5_core_dev *dev, struct net_device *netdev); 160 - void mlx5_lag_remove(struct mlx5_core_dev *dev, struct net_device *netdev); 160 + void mlx5_lag_remove(struct mlx5_core_dev *dev); 161 161 162 162 int mlx5_irq_table_init(struct mlx5_core_dev *dev); 163 163 void mlx5_irq_table_cleanup(struct mlx5_core_dev *dev);
+1 -1
drivers/net/ethernet/mellanox/mlxsw/pci_hw.h
··· 28 28 #define MLXSW_PCI_SW_RESET 0xF0010 29 29 #define MLXSW_PCI_SW_RESET_RST_BIT BIT(0) 30 30 #define MLXSW_PCI_SW_RESET_TIMEOUT_MSECS 900000 31 - #define MLXSW_PCI_SW_RESET_WAIT_MSECS 100 31 + #define MLXSW_PCI_SW_RESET_WAIT_MSECS 200 32 32 #define MLXSW_PCI_FW_READY 0xA1844 33 33 #define MLXSW_PCI_FW_READY_MASK 0xFFFF 34 34 #define MLXSW_PCI_FW_READY_MAGIC 0x5E
+8 -6
drivers/net/ethernet/micrel/ks8851_mll.c
··· 513 513 { 514 514 struct net_device *netdev = pw; 515 515 struct ks_net *ks = netdev_priv(netdev); 516 + unsigned long flags; 516 517 u16 status; 517 518 519 + spin_lock_irqsave(&ks->statelock, flags); 518 520 /*this should be the first in IRQ handler */ 519 521 ks_save_cmd_reg(ks); 520 522 521 523 status = ks_rdreg16(ks, KS_ISR); 522 524 if (unlikely(!status)) { 523 525 ks_restore_cmd_reg(ks); 526 + spin_unlock_irqrestore(&ks->statelock, flags); 524 527 return IRQ_NONE; 525 528 } 526 529 ··· 549 546 ks->netdev->stats.rx_over_errors++; 550 547 /* this should be the last in IRQ handler*/ 551 548 ks_restore_cmd_reg(ks); 549 + spin_unlock_irqrestore(&ks->statelock, flags); 552 550 return IRQ_HANDLED; 553 551 } 554 552 ··· 619 615 620 616 /* shutdown RX/TX QMU */ 621 617 ks_disable_qmu(ks); 618 + ks_disable_int(ks); 622 619 623 620 /* set powermode to soft power down to save power */ 624 621 ks_set_powermode(ks, PMECR_PM_SOFTDOWN); ··· 676 671 { 677 672 netdev_tx_t retv = NETDEV_TX_OK; 678 673 struct ks_net *ks = netdev_priv(netdev); 674 + unsigned long flags; 679 675 680 - disable_irq(netdev->irq); 681 - ks_disable_int(ks); 682 - spin_lock(&ks->statelock); 676 + spin_lock_irqsave(&ks->statelock, flags); 683 677 684 678 /* Extra space are required: 685 679 * 4 byte for alignment, 4 for status/length, 4 for CRC ··· 692 688 dev_kfree_skb(skb); 693 689 } else 694 690 retv = NETDEV_TX_BUSY; 695 - spin_unlock(&ks->statelock); 696 - ks_enable_int(ks); 697 - enable_irq(netdev->irq); 691 + spin_unlock_irqrestore(&ks->statelock, flags); 698 692 return retv; 699 693 } 700 694
+91 -95
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
··· 13 13 #include "rmnet_vnd.h" 14 14 #include "rmnet_private.h" 15 15 16 - /* Locking scheme - 17 - * The shared resource which needs to be protected is realdev->rx_handler_data. 18 - * For the writer path, this is using rtnl_lock(). The writer paths are 19 - * rmnet_newlink(), rmnet_dellink() and rmnet_force_unassociate_device(). These 20 - * paths are already called with rtnl_lock() acquired in. There is also an 21 - * ASSERT_RTNL() to ensure that we are calling with rtnl acquired. For 22 - * dereference here, we will need to use rtnl_dereference(). Dev list writing 23 - * needs to happen with rtnl_lock() acquired for netdev_master_upper_dev_link(). 24 - * For the reader path, the real_dev->rx_handler_data is called in the TX / RX 25 - * path. We only need rcu_read_lock() for these scenarios. In these cases, 26 - * the rcu_read_lock() is held in __dev_queue_xmit() and 27 - * netif_receive_skb_internal(), so readers need to use rcu_dereference_rtnl() 28 - * to get the relevant information. For dev list reading, we again acquire 29 - * rcu_read_lock() in rmnet_dellink() for netdev_master_upper_dev_get_rcu(). 30 - * We also use unregister_netdevice_many() to free all rmnet devices in 31 - * rmnet_force_unassociate_device() so we dont lose the rtnl_lock() and free in 32 - * same context. 33 - */ 34 - 35 16 /* Local Definitions and Declarations */ 36 17 37 18 static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX + 1] = { ··· 32 51 return rtnl_dereference(real_dev->rx_handler_data); 33 52 } 34 53 35 - static int rmnet_unregister_real_device(struct net_device *real_dev, 36 - struct rmnet_port *port) 54 + static int rmnet_unregister_real_device(struct net_device *real_dev) 37 55 { 56 + struct rmnet_port *port = rmnet_get_port_rtnl(real_dev); 57 + 38 58 if (port->nr_rmnet_devs) 39 59 return -EINVAL; 40 60 41 61 netdev_rx_handler_unregister(real_dev); 42 62 43 63 kfree(port); 44 - 45 - /* release reference on real_dev */ 46 - dev_put(real_dev); 47 64 48 65 netdev_dbg(real_dev, "Removed from rmnet\n"); 49 66 return 0; ··· 68 89 return -EBUSY; 69 90 } 70 91 71 - /* hold on to real dev for MAP data */ 72 - dev_hold(real_dev); 73 - 74 92 for (entry = 0; entry < RMNET_MAX_LOGICAL_EP; entry++) 75 93 INIT_HLIST_HEAD(&port->muxed_ep[entry]); 76 94 ··· 75 99 return 0; 76 100 } 77 101 78 - static void rmnet_unregister_bridge(struct net_device *dev, 79 - struct rmnet_port *port) 102 + static void rmnet_unregister_bridge(struct rmnet_port *port) 80 103 { 81 - struct rmnet_port *bridge_port; 82 - struct net_device *bridge_dev; 104 + struct net_device *bridge_dev, *real_dev, *rmnet_dev; 105 + struct rmnet_port *real_port; 83 106 84 107 if (port->rmnet_mode != RMNET_EPMODE_BRIDGE) 85 108 return; 86 109 87 - /* bridge slave handling */ 110 + rmnet_dev = port->rmnet_dev; 88 111 if (!port->nr_rmnet_devs) { 89 - bridge_dev = port->bridge_ep; 112 + /* bridge device */ 113 + real_dev = port->bridge_ep; 114 + bridge_dev = port->dev; 90 115 91 - bridge_port = rmnet_get_port_rtnl(bridge_dev); 92 - bridge_port->bridge_ep = NULL; 93 - bridge_port->rmnet_mode = RMNET_EPMODE_VND; 116 + real_port = rmnet_get_port_rtnl(real_dev); 117 + real_port->bridge_ep = NULL; 118 + real_port->rmnet_mode = RMNET_EPMODE_VND; 94 119 } else { 120 + /* real device */ 95 121 bridge_dev = port->bridge_ep; 96 122 97 - bridge_port = rmnet_get_port_rtnl(bridge_dev); 98 - rmnet_unregister_real_device(bridge_dev, bridge_port); 123 + port->bridge_ep = NULL; 124 + port->rmnet_mode = RMNET_EPMODE_VND; 99 125 } 126 + 127 + netdev_upper_dev_unlink(bridge_dev, rmnet_dev); 128 + rmnet_unregister_real_device(bridge_dev); 100 129 } 101 130 102 131 static int rmnet_newlink(struct net *src_net, struct net_device *dev, ··· 115 134 struct rmnet_port *port; 116 135 int err = 0; 117 136 u16 mux_id; 137 + 138 + if (!tb[IFLA_LINK]) { 139 + NL_SET_ERR_MSG_MOD(extack, "link not specified"); 140 + return -EINVAL; 141 + } 118 142 119 143 real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); 120 144 if (!real_dev || !dev) ··· 143 157 if (err) 144 158 goto err1; 145 159 160 + err = netdev_upper_dev_link(real_dev, dev, extack); 161 + if (err < 0) 162 + goto err2; 163 + 146 164 port->rmnet_mode = mode; 165 + port->rmnet_dev = dev; 147 166 148 167 hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]); 149 168 ··· 164 173 165 174 return 0; 166 175 176 + err2: 177 + unregister_netdevice(dev); 178 + rmnet_vnd_dellink(mux_id, port, ep); 167 179 err1: 168 - rmnet_unregister_real_device(real_dev, port); 180 + rmnet_unregister_real_device(real_dev); 169 181 err0: 170 182 kfree(ep); 171 183 return err; ··· 177 183 static void rmnet_dellink(struct net_device *dev, struct list_head *head) 178 184 { 179 185 struct rmnet_priv *priv = netdev_priv(dev); 180 - struct net_device *real_dev; 186 + struct net_device *real_dev, *bridge_dev; 187 + struct rmnet_port *real_port, *bridge_port; 181 188 struct rmnet_endpoint *ep; 182 - struct rmnet_port *port; 183 - u8 mux_id; 189 + u8 mux_id = priv->mux_id; 184 190 185 191 real_dev = priv->real_dev; 186 192 187 - if (!real_dev || !rmnet_is_real_dev_registered(real_dev)) 193 + if (!rmnet_is_real_dev_registered(real_dev)) 188 194 return; 189 195 190 - port = rmnet_get_port_rtnl(real_dev); 196 + real_port = rmnet_get_port_rtnl(real_dev); 197 + bridge_dev = real_port->bridge_ep; 198 + if (bridge_dev) { 199 + bridge_port = rmnet_get_port_rtnl(bridge_dev); 200 + rmnet_unregister_bridge(bridge_port); 201 + } 191 202 192 - mux_id = rmnet_vnd_get_mux(dev); 193 - 194 - ep = rmnet_get_endpoint(port, mux_id); 203 + ep = rmnet_get_endpoint(real_port, mux_id); 195 204 if (ep) { 196 205 hlist_del_init_rcu(&ep->hlnode); 197 - rmnet_unregister_bridge(dev, port); 198 - rmnet_vnd_dellink(mux_id, port, ep); 206 + rmnet_vnd_dellink(mux_id, real_port, ep); 199 207 kfree(ep); 200 208 } 201 - rmnet_unregister_real_device(real_dev, port); 202 209 210 + netdev_upper_dev_unlink(real_dev, dev); 211 + rmnet_unregister_real_device(real_dev); 203 212 unregister_netdevice_queue(dev, head); 204 213 } 205 214 206 - static void rmnet_force_unassociate_device(struct net_device *dev) 215 + static void rmnet_force_unassociate_device(struct net_device *real_dev) 207 216 { 208 - struct net_device *real_dev = dev; 209 217 struct hlist_node *tmp_ep; 210 218 struct rmnet_endpoint *ep; 211 219 struct rmnet_port *port; 212 220 unsigned long bkt_ep; 213 221 LIST_HEAD(list); 214 222 215 - if (!rmnet_is_real_dev_registered(real_dev)) 216 - return; 223 + port = rmnet_get_port_rtnl(real_dev); 217 224 218 - ASSERT_RTNL(); 219 - 220 - port = rmnet_get_port_rtnl(dev); 221 - 222 - rcu_read_lock(); 223 - rmnet_unregister_bridge(dev, port); 224 - 225 - hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { 226 - unregister_netdevice_queue(ep->egress_dev, &list); 227 - rmnet_vnd_dellink(ep->mux_id, port, ep); 228 - 229 - hlist_del_init_rcu(&ep->hlnode); 230 - kfree(ep); 225 + if (port->nr_rmnet_devs) { 226 + /* real device */ 227 + rmnet_unregister_bridge(port); 228 + hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { 229 + unregister_netdevice_queue(ep->egress_dev, &list); 230 + netdev_upper_dev_unlink(real_dev, ep->egress_dev); 231 + rmnet_vnd_dellink(ep->mux_id, port, ep); 232 + hlist_del_init_rcu(&ep->hlnode); 233 + kfree(ep); 234 + } 235 + rmnet_unregister_real_device(real_dev); 236 + unregister_netdevice_many(&list); 237 + } else { 238 + rmnet_unregister_bridge(port); 231 239 } 232 - 233 - rcu_read_unlock(); 234 - unregister_netdevice_many(&list); 235 - 236 - rmnet_unregister_real_device(real_dev, port); 237 240 } 238 241 239 242 static int rmnet_config_notify_cb(struct notifier_block *nb, 240 243 unsigned long event, void *data) 241 244 { 242 - struct net_device *dev = netdev_notifier_info_to_dev(data); 245 + struct net_device *real_dev = netdev_notifier_info_to_dev(data); 243 246 244 - if (!dev) 247 + if (!rmnet_is_real_dev_registered(real_dev)) 245 248 return NOTIFY_DONE; 246 249 247 250 switch (event) { 248 251 case NETDEV_UNREGISTER: 249 - netdev_dbg(dev, "Kernel unregister\n"); 250 - rmnet_force_unassociate_device(dev); 252 + netdev_dbg(real_dev, "Kernel unregister\n"); 253 + rmnet_force_unassociate_device(real_dev); 251 254 break; 252 255 253 256 default: ··· 286 295 if (!dev) 287 296 return -ENODEV; 288 297 289 - real_dev = __dev_get_by_index(dev_net(dev), 290 - nla_get_u32(tb[IFLA_LINK])); 291 - 292 - if (!real_dev || !rmnet_is_real_dev_registered(real_dev)) 298 + real_dev = priv->real_dev; 299 + if (!rmnet_is_real_dev_registered(real_dev)) 293 300 return -ENODEV; 294 301 295 302 port = rmnet_get_port_rtnl(real_dev); 296 303 297 304 if (data[IFLA_RMNET_MUX_ID]) { 298 305 mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]); 306 + if (rmnet_get_endpoint(port, mux_id)) { 307 + NL_SET_ERR_MSG_MOD(extack, "MUX ID already exists"); 308 + return -EINVAL; 309 + } 299 310 ep = rmnet_get_endpoint(port, priv->mux_id); 300 311 if (!ep) 301 312 return -ENODEV; ··· 372 379 .fill_info = rmnet_fill_info, 373 380 }; 374 381 375 - /* Needs either rcu_read_lock() or rtnl lock */ 376 - struct rmnet_port *rmnet_get_port(struct net_device *real_dev) 382 + struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev) 377 383 { 378 384 if (rmnet_is_real_dev_registered(real_dev)) 379 - return rcu_dereference_rtnl(real_dev->rx_handler_data); 385 + return rcu_dereference_bh(real_dev->rx_handler_data); 380 386 else 381 387 return NULL; 382 388 } ··· 401 409 struct rmnet_port *port, *slave_port; 402 410 int err; 403 411 404 - port = rmnet_get_port(real_dev); 412 + port = rmnet_get_port_rtnl(real_dev); 405 413 406 414 /* If there is more than one rmnet dev attached, its probably being 407 415 * used for muxing. Skip the briding in that case 408 416 */ 409 417 if (port->nr_rmnet_devs > 1) 418 + return -EINVAL; 419 + 420 + if (port->rmnet_mode != RMNET_EPMODE_VND) 410 421 return -EINVAL; 411 422 412 423 if (rmnet_is_real_dev_registered(slave_dev)) ··· 419 424 if (err) 420 425 return -EBUSY; 421 426 422 - slave_port = rmnet_get_port(slave_dev); 427 + err = netdev_master_upper_dev_link(slave_dev, rmnet_dev, NULL, NULL, 428 + extack); 429 + if (err) { 430 + rmnet_unregister_real_device(slave_dev); 431 + return err; 432 + } 433 + 434 + slave_port = rmnet_get_port_rtnl(slave_dev); 423 435 slave_port->rmnet_mode = RMNET_EPMODE_BRIDGE; 424 436 slave_port->bridge_ep = real_dev; 437 + slave_port->rmnet_dev = rmnet_dev; 425 438 426 439 port->rmnet_mode = RMNET_EPMODE_BRIDGE; 427 440 port->bridge_ep = slave_dev; ··· 441 438 int rmnet_del_bridge(struct net_device *rmnet_dev, 442 439 struct net_device *slave_dev) 443 440 { 444 - struct rmnet_priv *priv = netdev_priv(rmnet_dev); 445 - struct net_device *real_dev = priv->real_dev; 446 - struct rmnet_port *port, *slave_port; 441 + struct rmnet_port *port = rmnet_get_port_rtnl(slave_dev); 447 442 448 - port = rmnet_get_port(real_dev); 449 - port->rmnet_mode = RMNET_EPMODE_VND; 450 - port->bridge_ep = NULL; 451 - 452 - slave_port = rmnet_get_port(slave_dev); 453 - rmnet_unregister_real_device(slave_dev, slave_port); 443 + rmnet_unregister_bridge(port); 454 444 455 445 netdev_dbg(slave_dev, "removed from rmnet as slave\n"); 456 446 return 0; ··· 469 473 470 474 static void __exit rmnet_exit(void) 471 475 { 472 - unregister_netdevice_notifier(&rmnet_dev_notifier); 473 476 rtnl_link_unregister(&rmnet_link_ops); 477 + unregister_netdevice_notifier(&rmnet_dev_notifier); 474 478 } 475 479 476 480 module_init(rmnet_init)
+2 -1
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h
··· 28 28 u8 rmnet_mode; 29 29 struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP]; 30 30 struct net_device *bridge_ep; 31 + struct net_device *rmnet_dev; 31 32 }; 32 33 33 34 extern struct rtnl_link_ops rmnet_link_ops; ··· 66 65 struct rmnet_priv_stats stats; 67 66 }; 68 67 69 - struct rmnet_port *rmnet_get_port(struct net_device *real_dev); 68 + struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev); 70 69 struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); 71 70 int rmnet_add_bridge(struct net_device *rmnet_dev, 72 71 struct net_device *slave_dev,
+5 -2
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
··· 159 159 static void 160 160 rmnet_bridge_handler(struct sk_buff *skb, struct net_device *bridge_dev) 161 161 { 162 + if (skb_mac_header_was_set(skb)) 163 + skb_push(skb, skb->mac_len); 164 + 162 165 if (bridge_dev) { 163 166 skb->dev = bridge_dev; 164 167 dev_queue_xmit(skb); ··· 187 184 return RX_HANDLER_PASS; 188 185 189 186 dev = skb->dev; 190 - port = rmnet_get_port(dev); 187 + port = rmnet_get_port_rcu(dev); 191 188 192 189 switch (port->rmnet_mode) { 193 190 case RMNET_EPMODE_VND: ··· 220 217 skb->dev = priv->real_dev; 221 218 mux_id = priv->mux_id; 222 219 223 - port = rmnet_get_port(skb->dev); 220 + port = rmnet_get_port_rcu(skb->dev); 224 221 if (!port) 225 222 goto drop; 226 223
-8
drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c
··· 266 266 return 0; 267 267 } 268 268 269 - u8 rmnet_vnd_get_mux(struct net_device *rmnet_dev) 270 - { 271 - struct rmnet_priv *priv; 272 - 273 - priv = netdev_priv(rmnet_dev); 274 - return priv->mux_id; 275 - } 276 - 277 269 int rmnet_vnd_do_flow_control(struct net_device *rmnet_dev, int enable) 278 270 { 279 271 netdev_dbg(rmnet_dev, "Setting VND TX queue state to %d\n", enable);
-1
drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h
··· 16 16 struct rmnet_endpoint *ep); 17 17 void rmnet_vnd_rx_fixup(struct sk_buff *skb, struct net_device *dev); 18 18 void rmnet_vnd_tx_fixup(struct sk_buff *skb, struct net_device *dev); 19 - u8 rmnet_vnd_get_mux(struct net_device *rmnet_dev); 20 19 void rmnet_vnd_setup(struct net_device *dev); 21 20 #endif /* _RMNET_VND_H_ */
+35 -3
drivers/net/ethernet/sfc/ptp.c
··· 560 560 u32 nic_major, u32 nic_minor, 561 561 s32 correction) 562 562 { 563 + u32 sync_timestamp; 563 564 ktime_t kt = { 0 }; 565 + s16 delta; 564 566 565 567 if (!(nic_major & 0x80000000)) { 566 568 WARN_ON_ONCE(nic_major >> 16); 567 - /* Use the top bits from the latest sync event. */ 568 - nic_major &= 0xffff; 569 - nic_major |= (last_sync_timestamp_major(efx) & 0xffff0000); 569 + 570 + /* Medford provides 48 bits of timestamp, so we must get the top 571 + * 16 bits from the timesync event state. 572 + * 573 + * We only have the lower 16 bits of the time now, but we do 574 + * have a full resolution timestamp at some point in past. As 575 + * long as the difference between the (real) now and the sync 576 + * is less than 2^15, then we can reconstruct the difference 577 + * between those two numbers using only the lower 16 bits of 578 + * each. 579 + * 580 + * Put another way 581 + * 582 + * a - b = ((a mod k) - b) mod k 583 + * 584 + * when -k/2 < (a-b) < k/2. In our case k is 2^16. We know 585 + * (a mod k) and b, so can calculate the delta, a - b. 586 + * 587 + */ 588 + sync_timestamp = last_sync_timestamp_major(efx); 589 + 590 + /* Because delta is s16 this does an implicit mask down to 591 + * 16 bits which is what we need, assuming 592 + * MEDFORD_TX_SECS_EVENT_BITS is 16. delta is signed so that 593 + * we can deal with the (unlikely) case of sync timestamps 594 + * arriving from the future. 595 + */ 596 + delta = nic_major - sync_timestamp; 597 + 598 + /* Recover the fully specified time now, by applying the offset 599 + * to the (fully specified) sync time. 600 + */ 601 + nic_major = sync_timestamp + delta; 570 602 571 603 kt = ptp->nic_to_kernel_time(nic_major, nic_minor, 572 604 correction);
+8 -5
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
··· 4405 4405 { 4406 4406 struct stmmac_priv *priv = netdev_priv(dev); 4407 4407 4408 + rtnl_lock(); 4409 + 4408 4410 /* Create per netdev entries */ 4409 4411 priv->dbgfs_dir = debugfs_create_dir(dev->name, stmmac_fs_dir); 4410 4412 ··· 4418 4416 debugfs_create_file("dma_cap", 0444, priv->dbgfs_dir, dev, 4419 4417 &stmmac_dma_cap_fops); 4420 4418 4421 - register_netdevice_notifier(&stmmac_notifier); 4419 + rtnl_unlock(); 4422 4420 } 4423 4421 4424 4422 static void stmmac_exit_fs(struct net_device *dev) 4425 4423 { 4426 4424 struct stmmac_priv *priv = netdev_priv(dev); 4427 4425 4428 - unregister_netdevice_notifier(&stmmac_notifier); 4429 4426 debugfs_remove_recursive(priv->dbgfs_dir); 4430 4427 } 4431 4428 #endif /* CONFIG_DEBUG_FS */ ··· 4941 4940 4942 4941 netdev_info(priv->dev, "%s: removing driver", __func__); 4943 4942 4944 - #ifdef CONFIG_DEBUG_FS 4945 - stmmac_exit_fs(ndev); 4946 - #endif 4947 4943 stmmac_stop_all_dma(priv); 4948 4944 4949 4945 stmmac_mac_set(priv, priv->ioaddr, false); 4950 4946 netif_carrier_off(ndev); 4951 4947 unregister_netdev(ndev); 4948 + #ifdef CONFIG_DEBUG_FS 4949 + stmmac_exit_fs(ndev); 4950 + #endif 4952 4951 phylink_destroy(priv->phylink); 4953 4952 if (priv->plat->stmmac_rst) 4954 4953 reset_control_assert(priv->plat->stmmac_rst); ··· 5167 5166 /* Create debugfs main directory if it doesn't exist yet */ 5168 5167 if (!stmmac_fs_dir) 5169 5168 stmmac_fs_dir = debugfs_create_dir(STMMAC_RESOURCE_NAME, NULL); 5169 + register_netdevice_notifier(&stmmac_notifier); 5170 5170 #endif 5171 5171 5172 5172 return 0; ··· 5176 5174 static void __exit stmmac_exit(void) 5177 5175 { 5178 5176 #ifdef CONFIG_DEBUG_FS 5177 + unregister_netdevice_notifier(&stmmac_notifier); 5179 5178 debugfs_remove_recursive(stmmac_fs_dir); 5180 5179 #endif 5181 5180 }
+4
drivers/net/ethernet/xilinx/ll_temac.h
··· 375 375 int tx_bd_next; 376 376 int tx_bd_tail; 377 377 int rx_bd_ci; 378 + int rx_bd_tail; 378 379 379 380 /* DMA channel control setup */ 380 381 u32 tx_chnl_ctrl; 381 382 u32 rx_chnl_ctrl; 383 + u8 coalesce_count_rx; 384 + 385 + struct delayed_work restart_work; 382 386 }; 383 387 384 388 /* Wrappers for temac_ior()/temac_iow() function pointers above */
+170 -37
drivers/net/ethernet/xilinx/ll_temac_main.c
··· 51 51 #include <linux/ip.h> 52 52 #include <linux/slab.h> 53 53 #include <linux/interrupt.h> 54 + #include <linux/workqueue.h> 54 55 #include <linux/dma-mapping.h> 55 56 #include <linux/processor.h> 56 57 #include <linux/platform_data/xilinx-ll-temac.h> ··· 368 367 skb_dma_addr = dma_map_single(ndev->dev.parent, skb->data, 369 368 XTE_MAX_JUMBO_FRAME_SIZE, 370 369 DMA_FROM_DEVICE); 370 + if (dma_mapping_error(ndev->dev.parent, skb_dma_addr)) 371 + goto out; 371 372 lp->rx_bd_v[i].phys = cpu_to_be32(skb_dma_addr); 372 373 lp->rx_bd_v[i].len = cpu_to_be32(XTE_MAX_JUMBO_FRAME_SIZE); 373 374 lp->rx_bd_v[i].app0 = cpu_to_be32(STS_CTRL_APP0_IRQONEND); ··· 390 387 lp->tx_bd_next = 0; 391 388 lp->tx_bd_tail = 0; 392 389 lp->rx_bd_ci = 0; 390 + lp->rx_bd_tail = RX_BD_NUM - 1; 393 391 394 392 /* Enable RX DMA transfers */ 395 393 wmb(); 396 394 lp->dma_out(lp, RX_CURDESC_PTR, lp->rx_bd_p); 397 395 lp->dma_out(lp, RX_TAILDESC_PTR, 398 - lp->rx_bd_p + (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1))); 396 + lp->rx_bd_p + (sizeof(*lp->rx_bd_v) * lp->rx_bd_tail)); 399 397 400 398 /* Prepare for TX DMA transfer */ 401 399 lp->dma_out(lp, TX_CURDESC_PTR, lp->tx_bd_p); ··· 792 788 stat = be32_to_cpu(cur_p->app0); 793 789 } 794 790 791 + /* Matches barrier in temac_start_xmit */ 792 + smp_mb(); 793 + 795 794 netif_wake_queue(ndev); 796 795 } 797 796 ··· 837 830 cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; 838 831 839 832 if (temac_check_tx_bd_space(lp, num_frag + 1)) { 840 - if (!netif_queue_stopped(ndev)) 841 - netif_stop_queue(ndev); 842 - return NETDEV_TX_BUSY; 833 + if (netif_queue_stopped(ndev)) 834 + return NETDEV_TX_BUSY; 835 + 836 + netif_stop_queue(ndev); 837 + 838 + /* Matches barrier in temac_start_xmit_done */ 839 + smp_mb(); 840 + 841 + /* Space might have just been freed - check again */ 842 + if (temac_check_tx_bd_space(lp, num_frag)) 843 + return NETDEV_TX_BUSY; 844 + 845 + netif_wake_queue(ndev); 843 846 } 844 847 845 848 cur_p->app0 = 0; ··· 867 850 skb_dma_addr = dma_map_single(ndev->dev.parent, skb->data, 868 851 skb_headlen(skb), DMA_TO_DEVICE); 869 852 cur_p->len = cpu_to_be32(skb_headlen(skb)); 853 + if (WARN_ON_ONCE(dma_mapping_error(ndev->dev.parent, skb_dma_addr))) { 854 + dev_kfree_skb_any(skb); 855 + ndev->stats.tx_dropped++; 856 + return NETDEV_TX_OK; 857 + } 870 858 cur_p->phys = cpu_to_be32(skb_dma_addr); 871 859 ptr_to_txbd((void *)skb, cur_p); 872 860 873 861 for (ii = 0; ii < num_frag; ii++) { 874 - lp->tx_bd_tail++; 875 - if (lp->tx_bd_tail >= TX_BD_NUM) 862 + if (++lp->tx_bd_tail >= TX_BD_NUM) 876 863 lp->tx_bd_tail = 0; 877 864 878 865 cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; ··· 884 863 skb_frag_address(frag), 885 864 skb_frag_size(frag), 886 865 DMA_TO_DEVICE); 866 + if (dma_mapping_error(ndev->dev.parent, skb_dma_addr)) { 867 + if (--lp->tx_bd_tail < 0) 868 + lp->tx_bd_tail = TX_BD_NUM - 1; 869 + cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; 870 + while (--ii >= 0) { 871 + --frag; 872 + dma_unmap_single(ndev->dev.parent, 873 + be32_to_cpu(cur_p->phys), 874 + skb_frag_size(frag), 875 + DMA_TO_DEVICE); 876 + if (--lp->tx_bd_tail < 0) 877 + lp->tx_bd_tail = TX_BD_NUM - 1; 878 + cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; 879 + } 880 + dma_unmap_single(ndev->dev.parent, 881 + be32_to_cpu(cur_p->phys), 882 + skb_headlen(skb), DMA_TO_DEVICE); 883 + dev_kfree_skb_any(skb); 884 + ndev->stats.tx_dropped++; 885 + return NETDEV_TX_OK; 886 + } 887 887 cur_p->phys = cpu_to_be32(skb_dma_addr); 888 888 cur_p->len = cpu_to_be32(skb_frag_size(frag)); 889 889 cur_p->app0 = 0; ··· 926 884 return NETDEV_TX_OK; 927 885 } 928 886 887 + static int ll_temac_recv_buffers_available(struct temac_local *lp) 888 + { 889 + int available; 890 + 891 + if (!lp->rx_skb[lp->rx_bd_ci]) 892 + return 0; 893 + available = 1 + lp->rx_bd_tail - lp->rx_bd_ci; 894 + if (available <= 0) 895 + available += RX_BD_NUM; 896 + return available; 897 + } 929 898 930 899 static void ll_temac_recv(struct net_device *ndev) 931 900 { 932 901 struct temac_local *lp = netdev_priv(ndev); 933 - struct sk_buff *skb, *new_skb; 934 - unsigned int bdstat; 935 - struct cdmac_bd *cur_p; 936 - dma_addr_t tail_p, skb_dma_addr; 937 - int length; 938 902 unsigned long flags; 903 + int rx_bd; 904 + bool update_tail = false; 939 905 940 906 spin_lock_irqsave(&lp->rx_lock, flags); 941 907 942 - tail_p = lp->rx_bd_p + sizeof(*lp->rx_bd_v) * lp->rx_bd_ci; 943 - cur_p = &lp->rx_bd_v[lp->rx_bd_ci]; 908 + /* Process all received buffers, passing them on network 909 + * stack. After this, the buffer descriptors will be in an 910 + * un-allocated stage, where no skb is allocated for it, and 911 + * they are therefore not available for TEMAC/DMA. 912 + */ 913 + do { 914 + struct cdmac_bd *bd = &lp->rx_bd_v[lp->rx_bd_ci]; 915 + struct sk_buff *skb = lp->rx_skb[lp->rx_bd_ci]; 916 + unsigned int bdstat = be32_to_cpu(bd->app0); 917 + int length; 944 918 945 - bdstat = be32_to_cpu(cur_p->app0); 946 - while ((bdstat & STS_CTRL_APP0_CMPLT)) { 919 + /* While this should not normally happen, we can end 920 + * here when GFP_ATOMIC allocations fail, and we 921 + * therefore have un-allocated buffers. 922 + */ 923 + if (!skb) 924 + break; 947 925 948 - skb = lp->rx_skb[lp->rx_bd_ci]; 949 - length = be32_to_cpu(cur_p->app4) & 0x3FFF; 926 + /* Loop over all completed buffer descriptors */ 927 + if (!(bdstat & STS_CTRL_APP0_CMPLT)) 928 + break; 950 929 951 - dma_unmap_single(ndev->dev.parent, be32_to_cpu(cur_p->phys), 930 + dma_unmap_single(ndev->dev.parent, be32_to_cpu(bd->phys), 952 931 XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE); 932 + /* The buffer is not valid for DMA anymore */ 933 + bd->phys = 0; 934 + bd->len = 0; 953 935 936 + length = be32_to_cpu(bd->app4) & 0x3FFF; 954 937 skb_put(skb, length); 955 938 skb->protocol = eth_type_trans(skb, ndev); 956 939 skb_checksum_none_assert(skb); ··· 990 923 * (back) for proper IP checksum byte order 991 924 * (be16). 992 925 */ 993 - skb->csum = htons(be32_to_cpu(cur_p->app3) & 0xFFFF); 926 + skb->csum = htons(be32_to_cpu(bd->app3) & 0xFFFF); 994 927 skb->ip_summed = CHECKSUM_COMPLETE; 995 928 } 996 929 997 930 if (!skb_defer_rx_timestamp(skb)) 998 931 netif_rx(skb); 932 + /* The skb buffer is now owned by network stack above */ 933 + lp->rx_skb[lp->rx_bd_ci] = NULL; 999 934 1000 935 ndev->stats.rx_packets++; 1001 936 ndev->stats.rx_bytes += length; 1002 937 1003 - new_skb = netdev_alloc_skb_ip_align(ndev, 1004 - XTE_MAX_JUMBO_FRAME_SIZE); 1005 - if (!new_skb) { 1006 - spin_unlock_irqrestore(&lp->rx_lock, flags); 1007 - return; 938 + rx_bd = lp->rx_bd_ci; 939 + if (++lp->rx_bd_ci >= RX_BD_NUM) 940 + lp->rx_bd_ci = 0; 941 + } while (rx_bd != lp->rx_bd_tail); 942 + 943 + /* DMA operations will halt when the last buffer descriptor is 944 + * processed (ie. the one pointed to by RX_TAILDESC_PTR). 945 + * When that happens, no more interrupt events will be 946 + * generated. No IRQ_COAL or IRQ_DLY, and not even an 947 + * IRQ_ERR. To avoid stalling, we schedule a delayed work 948 + * when there is a potential risk of that happening. The work 949 + * will call this function, and thus re-schedule itself until 950 + * enough buffers are available again. 951 + */ 952 + if (ll_temac_recv_buffers_available(lp) < lp->coalesce_count_rx) 953 + schedule_delayed_work(&lp->restart_work, HZ / 1000); 954 + 955 + /* Allocate new buffers for those buffer descriptors that were 956 + * passed to network stack. Note that GFP_ATOMIC allocations 957 + * can fail (e.g. when a larger burst of GFP_ATOMIC 958 + * allocations occurs), so while we try to allocate all 959 + * buffers in the same interrupt where they were processed, we 960 + * continue with what we could get in case of allocation 961 + * failure. Allocation of remaining buffers will be retried 962 + * in following calls. 963 + */ 964 + while (1) { 965 + struct sk_buff *skb; 966 + struct cdmac_bd *bd; 967 + dma_addr_t skb_dma_addr; 968 + 969 + rx_bd = lp->rx_bd_tail + 1; 970 + if (rx_bd >= RX_BD_NUM) 971 + rx_bd = 0; 972 + bd = &lp->rx_bd_v[rx_bd]; 973 + 974 + if (bd->phys) 975 + break; /* All skb's allocated */ 976 + 977 + skb = netdev_alloc_skb_ip_align(ndev, XTE_MAX_JUMBO_FRAME_SIZE); 978 + if (!skb) { 979 + dev_warn(&ndev->dev, "skb alloc failed\n"); 980 + break; 1008 981 } 1009 982 1010 - cur_p->app0 = cpu_to_be32(STS_CTRL_APP0_IRQONEND); 1011 - skb_dma_addr = dma_map_single(ndev->dev.parent, new_skb->data, 983 + skb_dma_addr = dma_map_single(ndev->dev.parent, skb->data, 1012 984 XTE_MAX_JUMBO_FRAME_SIZE, 1013 985 DMA_FROM_DEVICE); 1014 - cur_p->phys = cpu_to_be32(skb_dma_addr); 1015 - cur_p->len = cpu_to_be32(XTE_MAX_JUMBO_FRAME_SIZE); 1016 - lp->rx_skb[lp->rx_bd_ci] = new_skb; 986 + if (WARN_ON_ONCE(dma_mapping_error(ndev->dev.parent, 987 + skb_dma_addr))) { 988 + dev_kfree_skb_any(skb); 989 + break; 990 + } 1017 991 1018 - lp->rx_bd_ci++; 1019 - if (lp->rx_bd_ci >= RX_BD_NUM) 1020 - lp->rx_bd_ci = 0; 992 + bd->phys = cpu_to_be32(skb_dma_addr); 993 + bd->len = cpu_to_be32(XTE_MAX_JUMBO_FRAME_SIZE); 994 + bd->app0 = cpu_to_be32(STS_CTRL_APP0_IRQONEND); 995 + lp->rx_skb[rx_bd] = skb; 1021 996 1022 - cur_p = &lp->rx_bd_v[lp->rx_bd_ci]; 1023 - bdstat = be32_to_cpu(cur_p->app0); 997 + lp->rx_bd_tail = rx_bd; 998 + update_tail = true; 1024 999 } 1025 - lp->dma_out(lp, RX_TAILDESC_PTR, tail_p); 1000 + 1001 + /* Move tail pointer when buffers have been allocated */ 1002 + if (update_tail) { 1003 + lp->dma_out(lp, RX_TAILDESC_PTR, 1004 + lp->rx_bd_p + sizeof(*lp->rx_bd_v) * lp->rx_bd_tail); 1005 + } 1026 1006 1027 1007 spin_unlock_irqrestore(&lp->rx_lock, flags); 1008 + } 1009 + 1010 + /* Function scheduled to ensure a restart in case of DMA halt 1011 + * condition caused by running out of buffer descriptors. 1012 + */ 1013 + static void ll_temac_restart_work_func(struct work_struct *work) 1014 + { 1015 + struct temac_local *lp = container_of(work, struct temac_local, 1016 + restart_work.work); 1017 + struct net_device *ndev = lp->ndev; 1018 + 1019 + ll_temac_recv(ndev); 1028 1020 } 1029 1021 1030 1022 static irqreturn_t ll_temac_tx_irq(int irq, void *_ndev) ··· 1177 1051 struct phy_device *phydev = ndev->phydev; 1178 1052 1179 1053 dev_dbg(&ndev->dev, "temac_close()\n"); 1054 + 1055 + cancel_delayed_work_sync(&lp->restart_work); 1180 1056 1181 1057 free_irq(lp->tx_irq, ndev); 1182 1058 free_irq(lp->rx_irq, ndev); ··· 1301 1173 lp->dev = &pdev->dev; 1302 1174 lp->options = XTE_OPTION_DEFAULTS; 1303 1175 spin_lock_init(&lp->rx_lock); 1176 + INIT_DELAYED_WORK(&lp->restart_work, ll_temac_restart_work_func); 1304 1177 1305 1178 /* Setup mutex for synchronization of indirect register access */ 1306 1179 if (pdata) { ··· 1408 1279 */ 1409 1280 lp->tx_chnl_ctrl = 0x10220000; 1410 1281 lp->rx_chnl_ctrl = 0xff070000; 1282 + lp->coalesce_count_rx = 0x07; 1411 1283 1412 1284 /* Finished with the DMA node; drop the reference */ 1413 1285 of_node_put(dma_np); ··· 1440 1310 (pdata->tx_irq_count << 16); 1441 1311 else 1442 1312 lp->tx_chnl_ctrl = 0x10220000; 1443 - if (pdata->rx_irq_timeout || pdata->rx_irq_count) 1313 + if (pdata->rx_irq_timeout || pdata->rx_irq_count) { 1444 1314 lp->rx_chnl_ctrl = (pdata->rx_irq_timeout << 24) | 1445 1315 (pdata->rx_irq_count << 16); 1446 - else 1316 + lp->coalesce_count_rx = pdata->rx_irq_count; 1317 + } else { 1447 1318 lp->rx_chnl_ctrl = 0xff070000; 1319 + lp->coalesce_count_rx = 0x07; 1320 + } 1448 1321 } 1449 1322 1450 1323 /* Error handle returned DMA RX and TX interrupts */
+1 -1
drivers/net/hyperv/netvsc.c
··· 99 99 100 100 init_waitqueue_head(&net_device->wait_drain); 101 101 net_device->destroy = false; 102 - net_device->tx_disable = false; 102 + net_device->tx_disable = true; 103 103 104 104 net_device->max_pkt = RNDIS_MAX_PKT_DEFAULT; 105 105 net_device->pkt_align = RNDIS_PKT_ALIGN_DEFAULT;
+3
drivers/net/hyperv/netvsc_drv.c
··· 1068 1068 } 1069 1069 1070 1070 /* In any case device is now ready */ 1071 + nvdev->tx_disable = false; 1071 1072 netif_device_attach(ndev); 1072 1073 1073 1074 /* Note: enable and attach happen when sub-channels setup */ ··· 2476 2475 net->max_mtu = NETVSC_MTU - ETH_HLEN; 2477 2476 else 2478 2477 net->max_mtu = ETH_DATA_LEN; 2478 + 2479 + nvdev->tx_disable = false; 2479 2480 2480 2481 ret = register_netdevice(net); 2481 2482 if (ret != 0) {
+5
drivers/net/phy/marvell.c
··· 1306 1306 } 1307 1307 } 1308 1308 1309 + if (!(status & MII_M1011_PHY_STATUS_RESOLVED)) 1310 + return 0; 1311 + 1309 1312 if (status & MII_M1011_PHY_STATUS_FULLDUPLEX) 1310 1313 phydev->duplex = DUPLEX_FULL; 1311 1314 else ··· 1368 1365 linkmode_zero(phydev->lp_advertising); 1369 1366 phydev->pause = 0; 1370 1367 phydev->asym_pause = 0; 1368 + phydev->speed = SPEED_UNKNOWN; 1369 + phydev->duplex = DUPLEX_UNKNOWN; 1371 1370 1372 1371 if (phydev->autoneg == AUTONEG_ENABLE) 1373 1372 err = marvell_read_status_page_an(phydev, fiber, status);
+2 -2
drivers/net/phy/mscc.c
··· 345 345 BIT(VSC8531_FORCE_LED_OFF) | \ 346 346 BIT(VSC8531_FORCE_LED_ON)) 347 347 348 - #define MSCC_VSC8584_REVB_INT8051_FW "mscc_vsc8584_revb_int8051_fb48.bin" 348 + #define MSCC_VSC8584_REVB_INT8051_FW "microchip/mscc_vsc8584_revb_int8051_fb48.bin" 349 349 #define MSCC_VSC8584_REVB_INT8051_FW_START_ADDR 0xe800 350 350 #define MSCC_VSC8584_REVB_INT8051_FW_CRC 0xfb48 351 351 352 - #define MSCC_VSC8574_REVB_INT8051_FW "mscc_vsc8574_revb_int8051_29e8.bin" 352 + #define MSCC_VSC8574_REVB_INT8051_FW "microchip/mscc_vsc8574_revb_int8051_29e8.bin" 353 353 #define MSCC_VSC8574_REVB_INT8051_FW_START_ADDR 0x4000 354 354 #define MSCC_VSC8574_REVB_INT8051_FW_CRC 0x29e8 355 355
+3 -3
drivers/net/phy/phy-c45.c
··· 167 167 */ 168 168 int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart) 169 169 { 170 - int ret = 0; 170 + int ret; 171 171 172 172 if (!restart) { 173 173 /* Configure and restart aneg if it wasn't set before */ ··· 180 180 } 181 181 182 182 if (restart) 183 - ret = genphy_c45_restart_aneg(phydev); 183 + return genphy_c45_restart_aneg(phydev); 184 184 185 - return ret; 185 + return 0; 186 186 } 187 187 EXPORT_SYMBOL_GPL(genphy_c45_check_and_restart_aneg); 188 188
+6 -5
drivers/net/phy/phy_device.c
··· 247 247 * MDIO bus driver and clock gated at this point. 248 248 */ 249 249 if (!netdev) 250 - return !phydev->suspended; 250 + goto out; 251 251 252 252 if (netdev->wol_enabled) 253 253 return false; ··· 267 267 if (device_may_wakeup(&netdev->dev)) 268 268 return false; 269 269 270 - return true; 270 + out: 271 + return !phydev->suspended; 271 272 } 272 273 273 274 static int mdio_bus_phy_suspend(struct device *dev) ··· 1793 1792 */ 1794 1793 int genphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) 1795 1794 { 1796 - int ret = 0; 1795 + int ret; 1797 1796 1798 1797 if (!restart) { 1799 1798 /* Advertisement hasn't changed, but maybe aneg was never on to ··· 1808 1807 } 1809 1808 1810 1809 if (restart) 1811 - ret = genphy_restart_aneg(phydev); 1810 + return genphy_restart_aneg(phydev); 1812 1811 1813 - return ret; 1812 + return 0; 1814 1813 } 1815 1814 EXPORT_SYMBOL(genphy_check_and_restart_aneg); 1816 1815
+3
drivers/net/slip/slip.c
··· 863 863 tty->disc_data = NULL; 864 864 clear_bit(SLF_INUSE, &sl->flags); 865 865 sl_free_netdev(sl->dev); 866 + /* do not call free_netdev before rtnl_unlock */ 867 + rtnl_unlock(); 866 868 free_netdev(sl->dev); 869 + return err; 867 870 868 871 err_exit: 869 872 rtnl_unlock();
+3
drivers/net/usb/qmi_wwan.c
··· 337 337 netdev_dbg(net, "mode: raw IP\n"); 338 338 } else if (!net->header_ops) { /* don't bother if already set */ 339 339 ether_setup(net); 340 + /* Restoring min/max mtu values set originally by usbnet */ 341 + net->min_mtu = 0; 342 + net->max_mtu = ETH_MAX_MTU; 340 343 clear_bit(EVENT_NO_IP_ALIGN, &dev->flags); 341 344 netdev_dbg(net, "mode: Ethernet\n"); 342 345 }
+1 -9
drivers/vhost/net.c
··· 1414 1414 1415 1415 static struct socket *get_raw_socket(int fd) 1416 1416 { 1417 - struct { 1418 - struct sockaddr_ll sa; 1419 - char buf[MAX_ADDR_LEN]; 1420 - } uaddr; 1421 1417 int r; 1422 1418 struct socket *sock = sockfd_lookup(fd, &r); 1423 1419 ··· 1426 1430 goto err; 1427 1431 } 1428 1432 1429 - r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0); 1430 - if (r < 0) 1431 - goto err; 1432 - 1433 - if (uaddr.sa.sll_family != AF_PACKET) { 1433 + if (sock->sk->sk_family != AF_PACKET) { 1434 1434 r = -EPFNOSUPPORT; 1435 1435 goto err; 1436 1436 }
+10 -6
include/linux/icmpv6.h
··· 22 22 int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type, 23 23 unsigned int data_len); 24 24 25 + #if IS_ENABLED(CONFIG_NF_NAT) 26 + void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info); 27 + #else 28 + #define icmpv6_ndo_send icmpv6_send 29 + #endif 30 + 25 31 #else 26 32 27 33 static inline void icmpv6_send(struct sk_buff *skb, 28 34 u8 type, u8 code, __u32 info) 29 35 { 30 - 31 36 } 32 - #endif 33 37 34 - #if IS_ENABLED(CONFIG_NF_NAT) 35 - void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info); 36 - #else 37 - #define icmpv6_ndo_send icmpv6_send 38 + static inline void icmpv6_ndo_send(struct sk_buff *skb, 39 + u8 type, u8 code, __u32 info) 40 + { 41 + } 38 42 #endif 39 43 40 44 extern int icmpv6_init(void);
+10 -1
include/linux/netfilter/ipset/ip_set.h
··· 121 121 u32 timeout; 122 122 u8 packets_op; 123 123 u8 bytes_op; 124 + bool target; 124 125 }; 125 126 126 127 struct ip_set; ··· 188 187 /* Return true if "b" set is the same as "a" 189 188 * according to the create set parameters */ 190 189 bool (*same_set)(const struct ip_set *a, const struct ip_set *b); 190 + /* Region-locking is used */ 191 + bool region_lock; 192 + }; 193 + 194 + struct ip_set_region { 195 + spinlock_t lock; /* Region lock */ 196 + size_t ext_size; /* Size of the dynamic extensions */ 197 + u32 elements; /* Number of elements vs timeout */ 191 198 }; 192 199 193 200 /* The core set type structure */ ··· 510 501 } 511 502 512 503 #define IP_SET_INIT_KEXT(skb, opt, set) \ 513 - { .bytes = (skb)->len, .packets = 1, \ 504 + { .bytes = (skb)->len, .packets = 1, .target = true,\ 514 505 .timeout = ip_set_adt_opt_timeout(opt, set) } 515 506 516 507 #define IP_SET_INIT_UEXT(set) \
+2 -4
net/bridge/br_device.c
··· 34 34 const struct nf_br_ops *nf_ops; 35 35 u8 state = BR_STATE_FORWARDING; 36 36 const unsigned char *dest; 37 - struct ethhdr *eth; 38 37 u16 vid = 0; 39 38 40 39 rcu_read_lock(); ··· 53 54 BR_INPUT_SKB_CB(skb)->frag_max_size = 0; 54 55 55 56 skb_reset_mac_header(skb); 56 - eth = eth_hdr(skb); 57 57 skb_pull(skb, ETH_HLEN); 58 58 59 59 if (!br_allowed_ingress(br, br_vlan_group_rcu(br), skb, &vid, &state)) 60 60 goto out; 61 61 62 62 if (IS_ENABLED(CONFIG_INET) && 63 - (eth->h_proto == htons(ETH_P_ARP) || 64 - eth->h_proto == htons(ETH_P_RARP)) && 63 + (eth_hdr(skb)->h_proto == htons(ETH_P_ARP) || 64 + eth_hdr(skb)->h_proto == htons(ETH_P_RARP)) && 65 65 br_opt_get(br, BROPT_NEIGH_SUPPRESS_ENABLED)) { 66 66 br_do_proxy_suppress_arp(skb, br, vid, NULL); 67 67 } else if (IS_ENABLED(CONFIG_IPV6) &&
+2
net/core/dev.c
··· 3076 3076 3077 3077 if (skb_rx_queue_recorded(skb)) { 3078 3078 hash = skb_get_rx_queue(skb); 3079 + if (hash >= qoffset) 3080 + hash -= qoffset; 3079 3081 while (unlikely(hash >= qcount)) 3080 3082 hash -= qcount; 3081 3083 return hash + qoffset;
+23 -15
net/core/devlink.c
··· 2103 2103 2104 2104 static struct devlink_dpipe_table * 2105 2105 devlink_dpipe_table_find(struct list_head *dpipe_tables, 2106 - const char *table_name) 2106 + const char *table_name, struct devlink *devlink) 2107 2107 { 2108 2108 struct devlink_dpipe_table *table; 2109 - 2110 - list_for_each_entry_rcu(table, dpipe_tables, list) { 2109 + list_for_each_entry_rcu(table, dpipe_tables, list, 2110 + lockdep_is_held(&devlink->lock)) { 2111 2111 if (!strcmp(table->name, table_name)) 2112 2112 return table; 2113 2113 } ··· 2226 2226 2227 2227 table_name = nla_data(info->attrs[DEVLINK_ATTR_DPIPE_TABLE_NAME]); 2228 2228 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 2229 - table_name); 2229 + table_name, devlink); 2230 2230 if (!table) 2231 2231 return -EINVAL; 2232 2232 ··· 2382 2382 struct devlink_dpipe_table *table; 2383 2383 2384 2384 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 2385 - table_name); 2385 + table_name, devlink); 2386 2386 if (!table) 2387 2387 return -EINVAL; 2388 2388 ··· 6854 6854 6855 6855 rcu_read_lock(); 6856 6856 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 6857 - table_name); 6857 + table_name, devlink); 6858 6858 enabled = false; 6859 6859 if (table) 6860 6860 enabled = table->counters_enabled; ··· 6878 6878 void *priv, bool counter_control_extern) 6879 6879 { 6880 6880 struct devlink_dpipe_table *table; 6881 - 6882 - if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name)) 6883 - return -EEXIST; 6881 + int err = 0; 6884 6882 6885 6883 if (WARN_ON(!table_ops->size_get)) 6886 6884 return -EINVAL; 6887 6885 6886 + mutex_lock(&devlink->lock); 6887 + 6888 + if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name, 6889 + devlink)) { 6890 + err = -EEXIST; 6891 + goto unlock; 6892 + } 6893 + 6888 6894 table = kzalloc(sizeof(*table), GFP_KERNEL); 6889 - if (!table) 6890 - return -ENOMEM; 6895 + if (!table) { 6896 + err = -ENOMEM; 6897 + goto unlock; 6898 + } 6891 6899 6892 6900 table->name = table_name; 6893 6901 table->table_ops = table_ops; 6894 6902 table->priv = priv; 6895 6903 table->counter_control_extern = counter_control_extern; 6896 6904 6897 - mutex_lock(&devlink->lock); 6898 6905 list_add_tail_rcu(&table->list, &devlink->dpipe_table_list); 6906 + unlock: 6899 6907 mutex_unlock(&devlink->lock); 6900 - return 0; 6908 + return err; 6901 6909 } 6902 6910 EXPORT_SYMBOL_GPL(devlink_dpipe_table_register); 6903 6911 ··· 6922 6914 6923 6915 mutex_lock(&devlink->lock); 6924 6916 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 6925 - table_name); 6917 + table_name, devlink); 6926 6918 if (!table) 6927 6919 goto unlock; 6928 6920 list_del_rcu(&table->list); ··· 7079 7071 7080 7072 mutex_lock(&devlink->lock); 7081 7073 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, 7082 - table_name); 7074 + table_name, devlink); 7083 7075 if (!table) { 7084 7076 err = -EINVAL; 7085 7077 goto out;
+2 -1
net/ethtool/bitset.c
··· 305 305 static const struct nla_policy bitset_policy[ETHTOOL_A_BITSET_MAX + 1] = { 306 306 [ETHTOOL_A_BITSET_UNSPEC] = { .type = NLA_REJECT }, 307 307 [ETHTOOL_A_BITSET_NOMASK] = { .type = NLA_FLAG }, 308 - [ETHTOOL_A_BITSET_SIZE] = { .type = NLA_U32 }, 308 + [ETHTOOL_A_BITSET_SIZE] = NLA_POLICY_MAX(NLA_U32, 309 + ETHNL_MAX_BITSET_SIZE), 309 310 [ETHTOOL_A_BITSET_BITS] = { .type = NLA_NESTED }, 310 311 [ETHTOOL_A_BITSET_VALUE] = { .type = NLA_BINARY }, 311 312 [ETHTOOL_A_BITSET_MASK] = { .type = NLA_BINARY },
+2
net/ethtool/bitset.h
··· 3 3 #ifndef _NET_ETHTOOL_BITSET_H 4 4 #define _NET_ETHTOOL_BITSET_H 5 5 6 + #define ETHNL_MAX_BITSET_SIZE S16_MAX 7 + 6 8 typedef const char (*const ethnl_string_array_t)[ETH_GSTRING_LEN]; 7 9 8 10 int ethnl_bitset_is_compact(const struct nlattr *bitset, bool *compact);
+6 -1
net/ipv4/cipso_ipv4.c
··· 1724 1724 { 1725 1725 unsigned char optbuf[sizeof(struct ip_options) + 40]; 1726 1726 struct ip_options *opt = (struct ip_options *)optbuf; 1727 + int res; 1727 1728 1728 1729 if (ip_hdr(skb)->protocol == IPPROTO_ICMP || error != -EACCES) 1729 1730 return; ··· 1736 1735 1737 1736 memset(opt, 0, sizeof(struct ip_options)); 1738 1737 opt->optlen = ip_hdr(skb)->ihl*4 - sizeof(struct iphdr); 1739 - if (__ip_options_compile(dev_net(skb->dev), opt, skb, NULL)) 1738 + rcu_read_lock(); 1739 + res = __ip_options_compile(dev_net(skb->dev), opt, skb, NULL); 1740 + rcu_read_unlock(); 1741 + 1742 + if (res) 1740 1743 return; 1741 1744 1742 1745 if (gateway)
+5 -1
net/ipv4/tcp_input.c
··· 6124 6124 { 6125 6125 struct request_sock *req; 6126 6126 6127 - tcp_try_undo_loss(sk, false); 6127 + /* If we are still handling the SYNACK RTO, see if timestamp ECR allows 6128 + * undo. If peer SACKs triggered fast recovery, we can't undo here. 6129 + */ 6130 + if (inet_csk(sk)->icsk_ca_state == TCP_CA_Loss) 6131 + tcp_try_undo_loss(sk, false); 6128 6132 6129 6133 /* Reset rtx states to prevent spurious retransmits_timed_out() */ 6130 6134 tcp_sk(sk)->retrans_stamp = 0;
+8 -2
net/ipv6/ipv6_sockglue.c
··· 183 183 retv = -EBUSY; 184 184 break; 185 185 } 186 - } else if (sk->sk_protocol != IPPROTO_TCP) 186 + } else if (sk->sk_protocol == IPPROTO_TCP) { 187 + if (sk->sk_prot != &tcpv6_prot) { 188 + retv = -EBUSY; 189 + break; 190 + } 187 191 break; 188 - 192 + } else { 193 + break; 194 + } 189 195 if (sk->sk_state != TCP_ESTABLISHED) { 190 196 retv = -ENOTCONN; 191 197 break;
+1 -5
net/mac80211/mlme.c
··· 2959 2959 (auth_transaction == 2 && 2960 2960 ifmgd->auth_data->expected_transaction == 2)) { 2961 2961 if (!ieee80211_mark_sta_auth(sdata, bssid)) 2962 - goto out_err; 2962 + return; /* ignore frame -- wait for timeout */ 2963 2963 } else if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE && 2964 2964 auth_transaction == 2) { 2965 2965 sdata_info(sdata, "SAE peer confirmed\n"); ··· 2967 2967 } 2968 2968 2969 2969 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); 2970 - return; 2971 - out_err: 2972 - mutex_unlock(&sdata->local->sta_mtx); 2973 - /* ignore frame -- wait for timeout */ 2974 2970 } 2975 2971 2976 2972 #define case_WLAN(type) \
+1 -1
net/mac80211/rx.c
··· 4114 4114 4115 4115 lockdep_assert_held(&local->sta_mtx); 4116 4116 4117 - list_for_each_entry_rcu(sta, &local->sta_list, list) { 4117 + list_for_each_entry(sta, &local->sta_list, list) { 4118 4118 if (sdata != sta->sdata && 4119 4119 (!sta->sdata->bss || sta->sdata->bss != sdata->bss)) 4120 4120 continue;
+6
net/mptcp/protocol.c
··· 543 543 } 544 544 } 545 545 546 + static unsigned int mptcp_sync_mss(struct sock *sk, u32 pmtu) 547 + { 548 + return 0; 549 + } 550 + 546 551 static int __mptcp_init_sock(struct sock *sk) 547 552 { 548 553 struct mptcp_sock *msk = mptcp_sk(sk); ··· 556 551 __set_bit(MPTCP_SEND_SPACE, &msk->flags); 557 552 558 553 msk->first = NULL; 554 + inet_csk(sk)->icsk_sync_mss = mptcp_sync_mss; 559 555 560 556 return 0; 561 557 }
+24 -10
net/netfilter/ipset/ip_set_core.c
··· 723 723 return set; 724 724 } 725 725 726 + static inline void 727 + ip_set_lock(struct ip_set *set) 728 + { 729 + if (!set->variant->region_lock) 730 + spin_lock_bh(&set->lock); 731 + } 732 + 733 + static inline void 734 + ip_set_unlock(struct ip_set *set) 735 + { 736 + if (!set->variant->region_lock) 737 + spin_unlock_bh(&set->lock); 738 + } 739 + 726 740 int 727 741 ip_set_test(ip_set_id_t index, const struct sk_buff *skb, 728 742 const struct xt_action_param *par, struct ip_set_adt_opt *opt) ··· 758 744 if (ret == -EAGAIN) { 759 745 /* Type requests element to be completed */ 760 746 pr_debug("element must be completed, ADD is triggered\n"); 761 - spin_lock_bh(&set->lock); 747 + ip_set_lock(set); 762 748 set->variant->kadt(set, skb, par, IPSET_ADD, opt); 763 - spin_unlock_bh(&set->lock); 749 + ip_set_unlock(set); 764 750 ret = 1; 765 751 } else { 766 752 /* --return-nomatch: invert matched element */ ··· 789 775 !(opt->family == set->family || set->family == NFPROTO_UNSPEC)) 790 776 return -IPSET_ERR_TYPE_MISMATCH; 791 777 792 - spin_lock_bh(&set->lock); 778 + ip_set_lock(set); 793 779 ret = set->variant->kadt(set, skb, par, IPSET_ADD, opt); 794 - spin_unlock_bh(&set->lock); 780 + ip_set_unlock(set); 795 781 796 782 return ret; 797 783 } ··· 811 797 !(opt->family == set->family || set->family == NFPROTO_UNSPEC)) 812 798 return -IPSET_ERR_TYPE_MISMATCH; 813 799 814 - spin_lock_bh(&set->lock); 800 + ip_set_lock(set); 815 801 ret = set->variant->kadt(set, skb, par, IPSET_DEL, opt); 816 - spin_unlock_bh(&set->lock); 802 + ip_set_unlock(set); 817 803 818 804 return ret; 819 805 } ··· 1278 1264 { 1279 1265 pr_debug("set: %s\n", set->name); 1280 1266 1281 - spin_lock_bh(&set->lock); 1267 + ip_set_lock(set); 1282 1268 set->variant->flush(set); 1283 - spin_unlock_bh(&set->lock); 1269 + ip_set_unlock(set); 1284 1270 } 1285 1271 1286 1272 static int ip_set_flush(struct net *net, struct sock *ctnl, struct sk_buff *skb, ··· 1727 1713 bool eexist = flags & IPSET_FLAG_EXIST, retried = false; 1728 1714 1729 1715 do { 1730 - spin_lock_bh(&set->lock); 1716 + ip_set_lock(set); 1731 1717 ret = set->variant->uadt(set, tb, adt, &lineno, flags, retried); 1732 - spin_unlock_bh(&set->lock); 1718 + ip_set_unlock(set); 1733 1719 retried = true; 1734 1720 } while (ret == -EAGAIN && 1735 1721 set->variant->resize &&
+438 -193
net/netfilter/ipset/ip_set_hash_gen.h
··· 7 7 #include <linux/rcupdate.h> 8 8 #include <linux/jhash.h> 9 9 #include <linux/types.h> 10 + #include <linux/netfilter/nfnetlink.h> 10 11 #include <linux/netfilter/ipset/ip_set.h> 11 12 12 - #define __ipset_dereference_protected(p, c) rcu_dereference_protected(p, c) 13 - #define ipset_dereference_protected(p, set) \ 14 - __ipset_dereference_protected(p, lockdep_is_held(&(set)->lock)) 15 - 16 - #define rcu_dereference_bh_nfnl(p) rcu_dereference_bh_check(p, 1) 13 + #define __ipset_dereference(p) \ 14 + rcu_dereference_protected(p, 1) 15 + #define ipset_dereference_nfnl(p) \ 16 + rcu_dereference_protected(p, \ 17 + lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET)) 18 + #define ipset_dereference_set(p, set) \ 19 + rcu_dereference_protected(p, \ 20 + lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET) || \ 21 + lockdep_is_held(&(set)->lock)) 22 + #define ipset_dereference_bh_nfnl(p) \ 23 + rcu_dereference_bh_check(p, \ 24 + lockdep_nfnl_is_held(NFNL_SUBSYS_IPSET)) 17 25 18 26 /* Hashing which uses arrays to resolve clashing. The hash table is resized 19 27 * (doubled) when searching becomes too long. ··· 80 72 __aligned(__alignof__(u64)); 81 73 }; 82 74 75 + /* Region size for locking == 2^HTABLE_REGION_BITS */ 76 + #define HTABLE_REGION_BITS 10 77 + #define ahash_numof_locks(htable_bits) \ 78 + ((htable_bits) < HTABLE_REGION_BITS ? 1 \ 79 + : jhash_size((htable_bits) - HTABLE_REGION_BITS)) 80 + #define ahash_sizeof_regions(htable_bits) \ 81 + (ahash_numof_locks(htable_bits) * sizeof(struct ip_set_region)) 82 + #define ahash_region(n, htable_bits) \ 83 + ((n) % ahash_numof_locks(htable_bits)) 84 + #define ahash_bucket_start(h, htable_bits) \ 85 + ((htable_bits) < HTABLE_REGION_BITS ? 0 \ 86 + : (h) * jhash_size(HTABLE_REGION_BITS)) 87 + #define ahash_bucket_end(h, htable_bits) \ 88 + ((htable_bits) < HTABLE_REGION_BITS ? jhash_size(htable_bits) \ 89 + : ((h) + 1) * jhash_size(HTABLE_REGION_BITS)) 90 + 91 + struct htable_gc { 92 + struct delayed_work dwork; 93 + struct ip_set *set; /* Set the gc belongs to */ 94 + u32 region; /* Last gc run position */ 95 + }; 96 + 83 97 /* The hash table: the table size stored here in order to make resizing easy */ 84 98 struct htable { 85 99 atomic_t ref; /* References for resizing */ 86 - atomic_t uref; /* References for dumping */ 100 + atomic_t uref; /* References for dumping and gc */ 87 101 u8 htable_bits; /* size of hash table == 2^htable_bits */ 102 + u32 maxelem; /* Maxelem per region */ 103 + struct ip_set_region *hregion; /* Region locks and ext sizes */ 88 104 struct hbucket __rcu *bucket[0]; /* hashtable buckets */ 89 105 }; 90 106 ··· 194 162 #define NLEN 0 195 163 #endif /* IP_SET_HASH_WITH_NETS */ 196 164 165 + #define SET_ELEM_EXPIRED(set, d) \ 166 + (SET_WITH_TIMEOUT(set) && \ 167 + ip_set_timeout_expired(ext_timeout(d, set))) 168 + 197 169 #endif /* _IP_SET_HASH_GEN_H */ 198 170 199 171 #ifndef MTYPE ··· 241 205 #undef mtype_test_cidrs 242 206 #undef mtype_test 243 207 #undef mtype_uref 244 - #undef mtype_expire 245 208 #undef mtype_resize 209 + #undef mtype_ext_size 210 + #undef mtype_resize_ad 246 211 #undef mtype_head 247 212 #undef mtype_list 213 + #undef mtype_gc_do 248 214 #undef mtype_gc 249 215 #undef mtype_gc_init 250 216 #undef mtype_variant ··· 285 247 #define mtype_test_cidrs IPSET_TOKEN(MTYPE, _test_cidrs) 286 248 #define mtype_test IPSET_TOKEN(MTYPE, _test) 287 249 #define mtype_uref IPSET_TOKEN(MTYPE, _uref) 288 - #define mtype_expire IPSET_TOKEN(MTYPE, _expire) 289 250 #define mtype_resize IPSET_TOKEN(MTYPE, _resize) 251 + #define mtype_ext_size IPSET_TOKEN(MTYPE, _ext_size) 252 + #define mtype_resize_ad IPSET_TOKEN(MTYPE, _resize_ad) 290 253 #define mtype_head IPSET_TOKEN(MTYPE, _head) 291 254 #define mtype_list IPSET_TOKEN(MTYPE, _list) 255 + #define mtype_gc_do IPSET_TOKEN(MTYPE, _gc_do) 292 256 #define mtype_gc IPSET_TOKEN(MTYPE, _gc) 293 257 #define mtype_gc_init IPSET_TOKEN(MTYPE, _gc_init) 294 258 #define mtype_variant IPSET_TOKEN(MTYPE, _variant) ··· 315 275 /* The generic hash structure */ 316 276 struct htype { 317 277 struct htable __rcu *table; /* the hash table */ 318 - struct timer_list gc; /* garbage collection when timeout enabled */ 319 - struct ip_set *set; /* attached to this ip_set */ 278 + struct htable_gc gc; /* gc workqueue */ 320 279 u32 maxelem; /* max elements in the hash */ 321 280 u32 initval; /* random jhash init value */ 322 281 #ifdef IP_SET_HASH_WITH_MARKMASK ··· 327 288 #ifdef IP_SET_HASH_WITH_NETMASK 328 289 u8 netmask; /* netmask value for subnets to store */ 329 290 #endif 291 + struct list_head ad; /* Resize add|del backlist */ 330 292 struct mtype_elem next; /* temporary storage for uadd */ 331 293 #ifdef IP_SET_HASH_WITH_NETS 332 294 struct net_prefixes nets[NLEN]; /* book-keeping of prefixes */ 333 295 #endif 296 + }; 297 + 298 + /* ADD|DEL entries saved during resize */ 299 + struct mtype_resize_ad { 300 + struct list_head list; 301 + enum ipset_adt ad; /* ADD|DEL element */ 302 + struct mtype_elem d; /* Element value */ 303 + struct ip_set_ext ext; /* Extensions for ADD */ 304 + struct ip_set_ext mext; /* Target extensions for ADD */ 305 + u32 flags; /* Flags for ADD */ 334 306 }; 335 307 336 308 #ifdef IP_SET_HASH_WITH_NETS ··· 349 299 * sized networks. cidr == real cidr + 1 to support /0. 350 300 */ 351 301 static void 352 - mtype_add_cidr(struct htype *h, u8 cidr, u8 n) 302 + mtype_add_cidr(struct ip_set *set, struct htype *h, u8 cidr, u8 n) 353 303 { 354 304 int i, j; 355 305 306 + spin_lock_bh(&set->lock); 356 307 /* Add in increasing prefix order, so larger cidr first */ 357 308 for (i = 0, j = -1; i < NLEN && h->nets[i].cidr[n]; i++) { 358 309 if (j != -1) { ··· 362 311 j = i; 363 312 } else if (h->nets[i].cidr[n] == cidr) { 364 313 h->nets[CIDR_POS(cidr)].nets[n]++; 365 - return; 314 + goto unlock; 366 315 } 367 316 } 368 317 if (j != -1) { ··· 371 320 } 372 321 h->nets[i].cidr[n] = cidr; 373 322 h->nets[CIDR_POS(cidr)].nets[n] = 1; 323 + unlock: 324 + spin_unlock_bh(&set->lock); 374 325 } 375 326 376 327 static void 377 - mtype_del_cidr(struct htype *h, u8 cidr, u8 n) 328 + mtype_del_cidr(struct ip_set *set, struct htype *h, u8 cidr, u8 n) 378 329 { 379 330 u8 i, j, net_end = NLEN - 1; 380 331 332 + spin_lock_bh(&set->lock); 381 333 for (i = 0; i < NLEN; i++) { 382 334 if (h->nets[i].cidr[n] != cidr) 383 335 continue; 384 336 h->nets[CIDR_POS(cidr)].nets[n]--; 385 337 if (h->nets[CIDR_POS(cidr)].nets[n] > 0) 386 - return; 338 + goto unlock; 387 339 for (j = i; j < net_end && h->nets[j].cidr[n]; j++) 388 340 h->nets[j].cidr[n] = h->nets[j + 1].cidr[n]; 389 341 h->nets[j].cidr[n] = 0; 390 - return; 342 + goto unlock; 391 343 } 344 + unlock: 345 + spin_unlock_bh(&set->lock); 392 346 } 393 347 #endif 394 348 ··· 401 345 static size_t 402 346 mtype_ahash_memsize(const struct htype *h, const struct htable *t) 403 347 { 404 - return sizeof(*h) + sizeof(*t); 348 + return sizeof(*h) + sizeof(*t) + ahash_sizeof_regions(t->htable_bits); 405 349 } 406 350 407 351 /* Get the ith element from the array block n */ ··· 425 369 struct htype *h = set->data; 426 370 struct htable *t; 427 371 struct hbucket *n; 428 - u32 i; 372 + u32 r, i; 429 373 430 - t = ipset_dereference_protected(h->table, set); 431 - for (i = 0; i < jhash_size(t->htable_bits); i++) { 432 - n = __ipset_dereference_protected(hbucket(t, i), 1); 433 - if (!n) 434 - continue; 435 - if (set->extensions & IPSET_EXT_DESTROY) 436 - mtype_ext_cleanup(set, n); 437 - /* FIXME: use slab cache */ 438 - rcu_assign_pointer(hbucket(t, i), NULL); 439 - kfree_rcu(n, rcu); 374 + t = ipset_dereference_nfnl(h->table); 375 + for (r = 0; r < ahash_numof_locks(t->htable_bits); r++) { 376 + spin_lock_bh(&t->hregion[r].lock); 377 + for (i = ahash_bucket_start(r, t->htable_bits); 378 + i < ahash_bucket_end(r, t->htable_bits); i++) { 379 + n = __ipset_dereference(hbucket(t, i)); 380 + if (!n) 381 + continue; 382 + if (set->extensions & IPSET_EXT_DESTROY) 383 + mtype_ext_cleanup(set, n); 384 + /* FIXME: use slab cache */ 385 + rcu_assign_pointer(hbucket(t, i), NULL); 386 + kfree_rcu(n, rcu); 387 + } 388 + t->hregion[r].ext_size = 0; 389 + t->hregion[r].elements = 0; 390 + spin_unlock_bh(&t->hregion[r].lock); 440 391 } 441 392 #ifdef IP_SET_HASH_WITH_NETS 442 393 memset(h->nets, 0, sizeof(h->nets)); 443 394 #endif 444 - set->elements = 0; 445 - set->ext_size = 0; 446 395 } 447 396 448 397 /* Destroy the hashtable part of the set */ ··· 458 397 u32 i; 459 398 460 399 for (i = 0; i < jhash_size(t->htable_bits); i++) { 461 - n = __ipset_dereference_protected(hbucket(t, i), 1); 400 + n = __ipset_dereference(hbucket(t, i)); 462 401 if (!n) 463 402 continue; 464 403 if (set->extensions & IPSET_EXT_DESTROY && ext_destroy) ··· 467 406 kfree(n); 468 407 } 469 408 409 + ip_set_free(t->hregion); 470 410 ip_set_free(t); 471 411 } 472 412 ··· 476 414 mtype_destroy(struct ip_set *set) 477 415 { 478 416 struct htype *h = set->data; 417 + struct list_head *l, *lt; 479 418 480 419 if (SET_WITH_TIMEOUT(set)) 481 - del_timer_sync(&h->gc); 420 + cancel_delayed_work_sync(&h->gc.dwork); 482 421 483 - mtype_ahash_destroy(set, 484 - __ipset_dereference_protected(h->table, 1), true); 422 + mtype_ahash_destroy(set, ipset_dereference_nfnl(h->table), true); 423 + list_for_each_safe(l, lt, &h->ad) { 424 + list_del(l); 425 + kfree(l); 426 + } 485 427 kfree(h); 486 428 487 429 set->data = NULL; 488 - } 489 - 490 - static void 491 - mtype_gc_init(struct ip_set *set, void (*gc)(struct timer_list *t)) 492 - { 493 - struct htype *h = set->data; 494 - 495 - timer_setup(&h->gc, gc, 0); 496 - mod_timer(&h->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ); 497 - pr_debug("gc initialized, run in every %u\n", 498 - IPSET_GC_PERIOD(set->timeout)); 499 430 } 500 431 501 432 static bool ··· 509 454 a->extensions == b->extensions; 510 455 } 511 456 512 - /* Delete expired elements from the hashtable */ 513 457 static void 514 - mtype_expire(struct ip_set *set, struct htype *h) 458 + mtype_gc_do(struct ip_set *set, struct htype *h, struct htable *t, u32 r) 515 459 { 516 - struct htable *t; 517 460 struct hbucket *n, *tmp; 518 461 struct mtype_elem *data; 519 462 u32 i, j, d; ··· 519 466 #ifdef IP_SET_HASH_WITH_NETS 520 467 u8 k; 521 468 #endif 469 + u8 htable_bits = t->htable_bits; 522 470 523 - t = ipset_dereference_protected(h->table, set); 524 - for (i = 0; i < jhash_size(t->htable_bits); i++) { 525 - n = __ipset_dereference_protected(hbucket(t, i), 1); 471 + spin_lock_bh(&t->hregion[r].lock); 472 + for (i = ahash_bucket_start(r, htable_bits); 473 + i < ahash_bucket_end(r, htable_bits); i++) { 474 + n = __ipset_dereference(hbucket(t, i)); 526 475 if (!n) 527 476 continue; 528 477 for (j = 0, d = 0; j < n->pos; j++) { ··· 540 485 smp_mb__after_atomic(); 541 486 #ifdef IP_SET_HASH_WITH_NETS 542 487 for (k = 0; k < IPSET_NET_COUNT; k++) 543 - mtype_del_cidr(h, 488 + mtype_del_cidr(set, h, 544 489 NCIDR_PUT(DCIDR_GET(data->cidr, k)), 545 490 k); 546 491 #endif 492 + t->hregion[r].elements--; 547 493 ip_set_ext_destroy(set, data); 548 - set->elements--; 549 494 d++; 550 495 } 551 496 if (d >= AHASH_INIT_SIZE) { 552 497 if (d >= n->size) { 498 + t->hregion[r].ext_size -= 499 + ext_size(n->size, dsize); 553 500 rcu_assign_pointer(hbucket(t, i), NULL); 554 501 kfree_rcu(n, rcu); 555 502 continue; 556 503 } 557 504 tmp = kzalloc(sizeof(*tmp) + 558 - (n->size - AHASH_INIT_SIZE) * dsize, 559 - GFP_ATOMIC); 505 + (n->size - AHASH_INIT_SIZE) * dsize, 506 + GFP_ATOMIC); 560 507 if (!tmp) 561 - /* Still try to delete expired elements */ 508 + /* Still try to delete expired elements. */ 562 509 continue; 563 510 tmp->size = n->size - AHASH_INIT_SIZE; 564 511 for (j = 0, d = 0; j < n->pos; j++) { 565 512 if (!test_bit(j, n->used)) 566 513 continue; 567 514 data = ahash_data(n, j, dsize); 568 - memcpy(tmp->value + d * dsize, data, dsize); 515 + memcpy(tmp->value + d * dsize, 516 + data, dsize); 569 517 set_bit(d, tmp->used); 570 518 d++; 571 519 } 572 520 tmp->pos = d; 573 - set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize); 521 + t->hregion[r].ext_size -= 522 + ext_size(AHASH_INIT_SIZE, dsize); 574 523 rcu_assign_pointer(hbucket(t, i), tmp); 575 524 kfree_rcu(n, rcu); 576 525 } 577 526 } 527 + spin_unlock_bh(&t->hregion[r].lock); 578 528 } 579 529 580 530 static void 581 - mtype_gc(struct timer_list *t) 531 + mtype_gc(struct work_struct *work) 582 532 { 583 - struct htype *h = from_timer(h, t, gc); 584 - struct ip_set *set = h->set; 533 + struct htable_gc *gc; 534 + struct ip_set *set; 535 + struct htype *h; 536 + struct htable *t; 537 + u32 r, numof_locks; 538 + unsigned int next_run; 585 539 586 - pr_debug("called\n"); 540 + gc = container_of(work, struct htable_gc, dwork.work); 541 + set = gc->set; 542 + h = set->data; 543 + 587 544 spin_lock_bh(&set->lock); 588 - mtype_expire(set, h); 545 + t = ipset_dereference_set(h->table, set); 546 + atomic_inc(&t->uref); 547 + numof_locks = ahash_numof_locks(t->htable_bits); 548 + r = gc->region++; 549 + if (r >= numof_locks) { 550 + r = gc->region = 0; 551 + } 552 + next_run = (IPSET_GC_PERIOD(set->timeout) * HZ) / numof_locks; 553 + if (next_run < HZ/10) 554 + next_run = HZ/10; 589 555 spin_unlock_bh(&set->lock); 590 556 591 - h->gc.expires = jiffies + IPSET_GC_PERIOD(set->timeout) * HZ; 592 - add_timer(&h->gc); 557 + mtype_gc_do(set, h, t, r); 558 + 559 + if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { 560 + pr_debug("Table destroy after resize by expire: %p\n", t); 561 + mtype_ahash_destroy(set, t, false); 562 + } 563 + 564 + queue_delayed_work(system_power_efficient_wq, &gc->dwork, next_run); 565 + 593 566 } 567 + 568 + static void 569 + mtype_gc_init(struct htable_gc *gc) 570 + { 571 + INIT_DEFERRABLE_WORK(&gc->dwork, mtype_gc); 572 + queue_delayed_work(system_power_efficient_wq, &gc->dwork, HZ); 573 + } 574 + 575 + static int 576 + mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext, 577 + struct ip_set_ext *mext, u32 flags); 578 + static int 579 + mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext, 580 + struct ip_set_ext *mext, u32 flags); 594 581 595 582 /* Resize a hash: create a new hash table with doubling the hashsize 596 583 * and inserting the elements to it. Repeat until we succeed or ··· 644 547 struct htype *h = set->data; 645 548 struct htable *t, *orig; 646 549 u8 htable_bits; 647 - size_t extsize, dsize = set->dsize; 550 + size_t dsize = set->dsize; 648 551 #ifdef IP_SET_HASH_WITH_NETS 649 552 u8 flags; 650 553 struct mtype_elem *tmp; ··· 652 555 struct mtype_elem *data; 653 556 struct mtype_elem *d; 654 557 struct hbucket *n, *m; 655 - u32 i, j, key; 558 + struct list_head *l, *lt; 559 + struct mtype_resize_ad *x; 560 + u32 i, j, r, nr, key; 656 561 int ret; 657 562 658 563 #ifdef IP_SET_HASH_WITH_NETS ··· 662 563 if (!tmp) 663 564 return -ENOMEM; 664 565 #endif 665 - rcu_read_lock_bh(); 666 - orig = rcu_dereference_bh_nfnl(h->table); 566 + orig = ipset_dereference_bh_nfnl(h->table); 667 567 htable_bits = orig->htable_bits; 668 - rcu_read_unlock_bh(); 669 568 670 569 retry: 671 570 ret = 0; ··· 680 583 ret = -ENOMEM; 681 584 goto out; 682 585 } 586 + t->hregion = ip_set_alloc(ahash_sizeof_regions(htable_bits)); 587 + if (!t->hregion) { 588 + kfree(t); 589 + ret = -ENOMEM; 590 + goto out; 591 + } 683 592 t->htable_bits = htable_bits; 593 + t->maxelem = h->maxelem / ahash_numof_locks(htable_bits); 594 + for (i = 0; i < ahash_numof_locks(htable_bits); i++) 595 + spin_lock_init(&t->hregion[i].lock); 684 596 685 - spin_lock_bh(&set->lock); 686 - orig = __ipset_dereference_protected(h->table, 1); 687 - /* There can't be another parallel resizing, but dumping is possible */ 597 + /* There can't be another parallel resizing, 598 + * but dumping, gc, kernel side add/del are possible 599 + */ 600 + orig = ipset_dereference_bh_nfnl(h->table); 688 601 atomic_set(&orig->ref, 1); 689 602 atomic_inc(&orig->uref); 690 - extsize = 0; 691 603 pr_debug("attempt to resize set %s from %u to %u, t %p\n", 692 604 set->name, orig->htable_bits, htable_bits, orig); 693 - for (i = 0; i < jhash_size(orig->htable_bits); i++) { 694 - n = __ipset_dereference_protected(hbucket(orig, i), 1); 695 - if (!n) 696 - continue; 697 - for (j = 0; j < n->pos; j++) { 698 - if (!test_bit(j, n->used)) 605 + for (r = 0; r < ahash_numof_locks(orig->htable_bits); r++) { 606 + /* Expire may replace a hbucket with another one */ 607 + rcu_read_lock_bh(); 608 + for (i = ahash_bucket_start(r, orig->htable_bits); 609 + i < ahash_bucket_end(r, orig->htable_bits); i++) { 610 + n = __ipset_dereference(hbucket(orig, i)); 611 + if (!n) 699 612 continue; 700 - data = ahash_data(n, j, dsize); 613 + for (j = 0; j < n->pos; j++) { 614 + if (!test_bit(j, n->used)) 615 + continue; 616 + data = ahash_data(n, j, dsize); 617 + if (SET_ELEM_EXPIRED(set, data)) 618 + continue; 701 619 #ifdef IP_SET_HASH_WITH_NETS 702 - /* We have readers running parallel with us, 703 - * so the live data cannot be modified. 704 - */ 705 - flags = 0; 706 - memcpy(tmp, data, dsize); 707 - data = tmp; 708 - mtype_data_reset_flags(data, &flags); 620 + /* We have readers running parallel with us, 621 + * so the live data cannot be modified. 622 + */ 623 + flags = 0; 624 + memcpy(tmp, data, dsize); 625 + data = tmp; 626 + mtype_data_reset_flags(data, &flags); 709 627 #endif 710 - key = HKEY(data, h->initval, htable_bits); 711 - m = __ipset_dereference_protected(hbucket(t, key), 1); 712 - if (!m) { 713 - m = kzalloc(sizeof(*m) + 628 + key = HKEY(data, h->initval, htable_bits); 629 + m = __ipset_dereference(hbucket(t, key)); 630 + nr = ahash_region(key, htable_bits); 631 + if (!m) { 632 + m = kzalloc(sizeof(*m) + 714 633 AHASH_INIT_SIZE * dsize, 715 634 GFP_ATOMIC); 716 - if (!m) { 717 - ret = -ENOMEM; 718 - goto cleanup; 719 - } 720 - m->size = AHASH_INIT_SIZE; 721 - extsize += ext_size(AHASH_INIT_SIZE, dsize); 722 - RCU_INIT_POINTER(hbucket(t, key), m); 723 - } else if (m->pos >= m->size) { 724 - struct hbucket *ht; 635 + if (!m) { 636 + ret = -ENOMEM; 637 + goto cleanup; 638 + } 639 + m->size = AHASH_INIT_SIZE; 640 + t->hregion[nr].ext_size += 641 + ext_size(AHASH_INIT_SIZE, 642 + dsize); 643 + RCU_INIT_POINTER(hbucket(t, key), m); 644 + } else if (m->pos >= m->size) { 645 + struct hbucket *ht; 725 646 726 - if (m->size >= AHASH_MAX(h)) { 727 - ret = -EAGAIN; 728 - } else { 729 - ht = kzalloc(sizeof(*ht) + 647 + if (m->size >= AHASH_MAX(h)) { 648 + ret = -EAGAIN; 649 + } else { 650 + ht = kzalloc(sizeof(*ht) + 730 651 (m->size + AHASH_INIT_SIZE) 731 652 * dsize, 732 653 GFP_ATOMIC); 733 - if (!ht) 734 - ret = -ENOMEM; 654 + if (!ht) 655 + ret = -ENOMEM; 656 + } 657 + if (ret < 0) 658 + goto cleanup; 659 + memcpy(ht, m, sizeof(struct hbucket) + 660 + m->size * dsize); 661 + ht->size = m->size + AHASH_INIT_SIZE; 662 + t->hregion[nr].ext_size += 663 + ext_size(AHASH_INIT_SIZE, 664 + dsize); 665 + kfree(m); 666 + m = ht; 667 + RCU_INIT_POINTER(hbucket(t, key), ht); 735 668 } 736 - if (ret < 0) 737 - goto cleanup; 738 - memcpy(ht, m, sizeof(struct hbucket) + 739 - m->size * dsize); 740 - ht->size = m->size + AHASH_INIT_SIZE; 741 - extsize += ext_size(AHASH_INIT_SIZE, dsize); 742 - kfree(m); 743 - m = ht; 744 - RCU_INIT_POINTER(hbucket(t, key), ht); 745 - } 746 - d = ahash_data(m, m->pos, dsize); 747 - memcpy(d, data, dsize); 748 - set_bit(m->pos++, m->used); 669 + d = ahash_data(m, m->pos, dsize); 670 + memcpy(d, data, dsize); 671 + set_bit(m->pos++, m->used); 672 + t->hregion[nr].elements++; 749 673 #ifdef IP_SET_HASH_WITH_NETS 750 - mtype_data_reset_flags(d, &flags); 674 + mtype_data_reset_flags(d, &flags); 751 675 #endif 676 + } 752 677 } 678 + rcu_read_unlock_bh(); 753 679 } 754 - rcu_assign_pointer(h->table, t); 755 - set->ext_size = extsize; 756 680 757 - spin_unlock_bh(&set->lock); 681 + /* There can't be any other writer. */ 682 + rcu_assign_pointer(h->table, t); 758 683 759 684 /* Give time to other readers of the set */ 760 685 synchronize_rcu(); 761 686 762 687 pr_debug("set %s resized from %u (%p) to %u (%p)\n", set->name, 763 688 orig->htable_bits, orig, t->htable_bits, t); 764 - /* If there's nobody else dumping the table, destroy it */ 689 + /* Add/delete elements processed by the SET target during resize. 690 + * Kernel-side add cannot trigger a resize and userspace actions 691 + * are serialized by the mutex. 692 + */ 693 + list_for_each_safe(l, lt, &h->ad) { 694 + x = list_entry(l, struct mtype_resize_ad, list); 695 + if (x->ad == IPSET_ADD) { 696 + mtype_add(set, &x->d, &x->ext, &x->mext, x->flags); 697 + } else { 698 + mtype_del(set, &x->d, NULL, NULL, 0); 699 + } 700 + list_del(l); 701 + kfree(l); 702 + } 703 + /* If there's nobody else using the table, destroy it */ 765 704 if (atomic_dec_and_test(&orig->uref)) { 766 705 pr_debug("Table destroy by resize %p\n", orig); 767 706 mtype_ahash_destroy(set, orig, false); ··· 810 677 return ret; 811 678 812 679 cleanup: 680 + rcu_read_unlock_bh(); 813 681 atomic_set(&orig->ref, 0); 814 682 atomic_dec(&orig->uref); 815 - spin_unlock_bh(&set->lock); 816 683 mtype_ahash_destroy(set, t, false); 817 684 if (ret == -EAGAIN) 818 685 goto retry; 819 686 goto out; 687 + } 688 + 689 + /* Get the current number of elements and ext_size in the set */ 690 + static void 691 + mtype_ext_size(struct ip_set *set, u32 *elements, size_t *ext_size) 692 + { 693 + struct htype *h = set->data; 694 + const struct htable *t; 695 + u32 i, j, r; 696 + struct hbucket *n; 697 + struct mtype_elem *data; 698 + 699 + t = rcu_dereference_bh(h->table); 700 + for (r = 0; r < ahash_numof_locks(t->htable_bits); r++) { 701 + for (i = ahash_bucket_start(r, t->htable_bits); 702 + i < ahash_bucket_end(r, t->htable_bits); i++) { 703 + n = rcu_dereference_bh(hbucket(t, i)); 704 + if (!n) 705 + continue; 706 + for (j = 0; j < n->pos; j++) { 707 + if (!test_bit(j, n->used)) 708 + continue; 709 + data = ahash_data(n, j, set->dsize); 710 + if (!SET_ELEM_EXPIRED(set, data)) 711 + (*elements)++; 712 + } 713 + } 714 + *ext_size += t->hregion[r].ext_size; 715 + } 820 716 } 821 717 822 718 /* Add an element to a hash and update the internal counters when succeeded, ··· 860 698 const struct mtype_elem *d = value; 861 699 struct mtype_elem *data; 862 700 struct hbucket *n, *old = ERR_PTR(-ENOENT); 863 - int i, j = -1; 701 + int i, j = -1, ret; 864 702 bool flag_exist = flags & IPSET_FLAG_EXIST; 865 703 bool deleted = false, forceadd = false, reuse = false; 866 - u32 key, multi = 0; 704 + u32 r, key, multi = 0, elements, maxelem; 867 705 868 - if (set->elements >= h->maxelem) { 869 - if (SET_WITH_TIMEOUT(set)) 870 - /* FIXME: when set is full, we slow down here */ 871 - mtype_expire(set, h); 872 - if (set->elements >= h->maxelem && SET_WITH_FORCEADD(set)) 706 + rcu_read_lock_bh(); 707 + t = rcu_dereference_bh(h->table); 708 + key = HKEY(value, h->initval, t->htable_bits); 709 + r = ahash_region(key, t->htable_bits); 710 + atomic_inc(&t->uref); 711 + elements = t->hregion[r].elements; 712 + maxelem = t->maxelem; 713 + if (elements >= maxelem) { 714 + u32 e; 715 + if (SET_WITH_TIMEOUT(set)) { 716 + rcu_read_unlock_bh(); 717 + mtype_gc_do(set, h, t, r); 718 + rcu_read_lock_bh(); 719 + } 720 + maxelem = h->maxelem; 721 + elements = 0; 722 + for (e = 0; e < ahash_numof_locks(t->htable_bits); e++) 723 + elements += t->hregion[e].elements; 724 + if (elements >= maxelem && SET_WITH_FORCEADD(set)) 873 725 forceadd = true; 874 726 } 727 + rcu_read_unlock_bh(); 875 728 876 - t = ipset_dereference_protected(h->table, set); 877 - key = HKEY(value, h->initval, t->htable_bits); 878 - n = __ipset_dereference_protected(hbucket(t, key), 1); 729 + spin_lock_bh(&t->hregion[r].lock); 730 + n = rcu_dereference_bh(hbucket(t, key)); 879 731 if (!n) { 880 - if (forceadd || set->elements >= h->maxelem) 732 + if (forceadd || elements >= maxelem) 881 733 goto set_full; 882 734 old = NULL; 883 735 n = kzalloc(sizeof(*n) + AHASH_INIT_SIZE * set->dsize, 884 736 GFP_ATOMIC); 885 - if (!n) 886 - return -ENOMEM; 737 + if (!n) { 738 + ret = -ENOMEM; 739 + goto unlock; 740 + } 887 741 n->size = AHASH_INIT_SIZE; 888 - set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize); 742 + t->hregion[r].ext_size += 743 + ext_size(AHASH_INIT_SIZE, set->dsize); 889 744 goto copy_elem; 890 745 } 891 746 for (i = 0; i < n->pos; i++) { ··· 916 737 } 917 738 data = ahash_data(n, i, set->dsize); 918 739 if (mtype_data_equal(data, d, &multi)) { 919 - if (flag_exist || 920 - (SET_WITH_TIMEOUT(set) && 921 - ip_set_timeout_expired(ext_timeout(data, set)))) { 740 + if (flag_exist || SET_ELEM_EXPIRED(set, data)) { 922 741 /* Just the extensions could be overwritten */ 923 742 j = i; 924 743 goto overwrite_extensions; 925 744 } 926 - return -IPSET_ERR_EXIST; 745 + ret = -IPSET_ERR_EXIST; 746 + goto unlock; 927 747 } 928 748 /* Reuse first timed out entry */ 929 - if (SET_WITH_TIMEOUT(set) && 930 - ip_set_timeout_expired(ext_timeout(data, set)) && 931 - j == -1) { 749 + if (SET_ELEM_EXPIRED(set, data) && j == -1) { 932 750 j = i; 933 751 reuse = true; 934 752 } 935 753 } 936 754 if (reuse || forceadd) { 755 + if (j == -1) 756 + j = 0; 937 757 data = ahash_data(n, j, set->dsize); 938 758 if (!deleted) { 939 759 #ifdef IP_SET_HASH_WITH_NETS 940 760 for (i = 0; i < IPSET_NET_COUNT; i++) 941 - mtype_del_cidr(h, 761 + mtype_del_cidr(set, h, 942 762 NCIDR_PUT(DCIDR_GET(data->cidr, i)), 943 763 i); 944 764 #endif 945 765 ip_set_ext_destroy(set, data); 946 - set->elements--; 766 + t->hregion[r].elements--; 947 767 } 948 768 goto copy_data; 949 769 } 950 - if (set->elements >= h->maxelem) 770 + if (elements >= maxelem) 951 771 goto set_full; 952 772 /* Create a new slot */ 953 773 if (n->pos >= n->size) { ··· 954 776 if (n->size >= AHASH_MAX(h)) { 955 777 /* Trigger rehashing */ 956 778 mtype_data_next(&h->next, d); 957 - return -EAGAIN; 779 + ret = -EAGAIN; 780 + goto resize; 958 781 } 959 782 old = n; 960 783 n = kzalloc(sizeof(*n) + 961 784 (old->size + AHASH_INIT_SIZE) * set->dsize, 962 785 GFP_ATOMIC); 963 - if (!n) 964 - return -ENOMEM; 786 + if (!n) { 787 + ret = -ENOMEM; 788 + goto unlock; 789 + } 965 790 memcpy(n, old, sizeof(struct hbucket) + 966 791 old->size * set->dsize); 967 792 n->size = old->size + AHASH_INIT_SIZE; 968 - set->ext_size += ext_size(AHASH_INIT_SIZE, set->dsize); 793 + t->hregion[r].ext_size += 794 + ext_size(AHASH_INIT_SIZE, set->dsize); 969 795 } 970 796 971 797 copy_elem: 972 798 j = n->pos++; 973 799 data = ahash_data(n, j, set->dsize); 974 800 copy_data: 975 - set->elements++; 801 + t->hregion[r].elements++; 976 802 #ifdef IP_SET_HASH_WITH_NETS 977 803 for (i = 0; i < IPSET_NET_COUNT; i++) 978 - mtype_add_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, i)), i); 804 + mtype_add_cidr(set, h, NCIDR_PUT(DCIDR_GET(d->cidr, i)), i); 979 805 #endif 980 806 memcpy(data, d, sizeof(struct mtype_elem)); 981 807 overwrite_extensions: ··· 1002 820 if (old) 1003 821 kfree_rcu(old, rcu); 1004 822 } 823 + ret = 0; 824 + resize: 825 + spin_unlock_bh(&t->hregion[r].lock); 826 + if (atomic_read(&t->ref) && ext->target) { 827 + /* Resize is in process and kernel side add, save values */ 828 + struct mtype_resize_ad *x; 1005 829 1006 - return 0; 830 + x = kzalloc(sizeof(struct mtype_resize_ad), GFP_ATOMIC); 831 + if (!x) 832 + /* Don't bother */ 833 + goto out; 834 + x->ad = IPSET_ADD; 835 + memcpy(&x->d, value, sizeof(struct mtype_elem)); 836 + memcpy(&x->ext, ext, sizeof(struct ip_set_ext)); 837 + memcpy(&x->mext, mext, sizeof(struct ip_set_ext)); 838 + x->flags = flags; 839 + spin_lock_bh(&set->lock); 840 + list_add_tail(&x->list, &h->ad); 841 + spin_unlock_bh(&set->lock); 842 + } 843 + goto out; 844 + 1007 845 set_full: 1008 846 if (net_ratelimit()) 1009 847 pr_warn("Set %s is full, maxelem %u reached\n", 1010 - set->name, h->maxelem); 1011 - return -IPSET_ERR_HASH_FULL; 848 + set->name, maxelem); 849 + ret = -IPSET_ERR_HASH_FULL; 850 + unlock: 851 + spin_unlock_bh(&t->hregion[r].lock); 852 + out: 853 + if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { 854 + pr_debug("Table destroy after resize by add: %p\n", t); 855 + mtype_ahash_destroy(set, t, false); 856 + } 857 + return ret; 1012 858 } 1013 859 1014 860 /* Delete an element from the hash and free up space if possible. ··· 1050 840 const struct mtype_elem *d = value; 1051 841 struct mtype_elem *data; 1052 842 struct hbucket *n; 1053 - int i, j, k, ret = -IPSET_ERR_EXIST; 843 + struct mtype_resize_ad *x = NULL; 844 + int i, j, k, r, ret = -IPSET_ERR_EXIST; 1054 845 u32 key, multi = 0; 1055 846 size_t dsize = set->dsize; 1056 847 1057 - t = ipset_dereference_protected(h->table, set); 848 + /* Userspace add and resize is excluded by the mutex. 849 + * Kernespace add does not trigger resize. 850 + */ 851 + rcu_read_lock_bh(); 852 + t = rcu_dereference_bh(h->table); 1058 853 key = HKEY(value, h->initval, t->htable_bits); 1059 - n = __ipset_dereference_protected(hbucket(t, key), 1); 854 + r = ahash_region(key, t->htable_bits); 855 + atomic_inc(&t->uref); 856 + rcu_read_unlock_bh(); 857 + 858 + spin_lock_bh(&t->hregion[r].lock); 859 + n = rcu_dereference_bh(hbucket(t, key)); 1060 860 if (!n) 1061 861 goto out; 1062 862 for (i = 0, k = 0; i < n->pos; i++) { ··· 1077 857 data = ahash_data(n, i, dsize); 1078 858 if (!mtype_data_equal(data, d, &multi)) 1079 859 continue; 1080 - if (SET_WITH_TIMEOUT(set) && 1081 - ip_set_timeout_expired(ext_timeout(data, set))) 860 + if (SET_ELEM_EXPIRED(set, data)) 1082 861 goto out; 1083 862 1084 863 ret = 0; ··· 1085 866 smp_mb__after_atomic(); 1086 867 if (i + 1 == n->pos) 1087 868 n->pos--; 1088 - set->elements--; 869 + t->hregion[r].elements--; 1089 870 #ifdef IP_SET_HASH_WITH_NETS 1090 871 for (j = 0; j < IPSET_NET_COUNT; j++) 1091 - mtype_del_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, j)), 1092 - j); 872 + mtype_del_cidr(set, h, 873 + NCIDR_PUT(DCIDR_GET(d->cidr, j)), j); 1093 874 #endif 1094 875 ip_set_ext_destroy(set, data); 1095 876 877 + if (atomic_read(&t->ref) && ext->target) { 878 + /* Resize is in process and kernel side del, 879 + * save values 880 + */ 881 + x = kzalloc(sizeof(struct mtype_resize_ad), 882 + GFP_ATOMIC); 883 + if (x) { 884 + x->ad = IPSET_DEL; 885 + memcpy(&x->d, value, 886 + sizeof(struct mtype_elem)); 887 + x->flags = flags; 888 + } 889 + } 1096 890 for (; i < n->pos; i++) { 1097 891 if (!test_bit(i, n->used)) 1098 892 k++; 1099 893 } 1100 894 if (n->pos == 0 && k == 0) { 1101 - set->ext_size -= ext_size(n->size, dsize); 895 + t->hregion[r].ext_size -= ext_size(n->size, dsize); 1102 896 rcu_assign_pointer(hbucket(t, key), NULL); 1103 897 kfree_rcu(n, rcu); 1104 898 } else if (k >= AHASH_INIT_SIZE) { ··· 1130 898 k++; 1131 899 } 1132 900 tmp->pos = k; 1133 - set->ext_size -= ext_size(AHASH_INIT_SIZE, dsize); 901 + t->hregion[r].ext_size -= 902 + ext_size(AHASH_INIT_SIZE, dsize); 1134 903 rcu_assign_pointer(hbucket(t, key), tmp); 1135 904 kfree_rcu(n, rcu); 1136 905 } ··· 1139 906 } 1140 907 1141 908 out: 909 + spin_unlock_bh(&t->hregion[r].lock); 910 + if (x) { 911 + spin_lock_bh(&set->lock); 912 + list_add(&x->list, &h->ad); 913 + spin_unlock_bh(&set->lock); 914 + } 915 + if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { 916 + pr_debug("Table destroy after resize by del: %p\n", t); 917 + mtype_ahash_destroy(set, t, false); 918 + } 1142 919 return ret; 1143 920 } 1144 921 ··· 1234 991 int i, ret = 0; 1235 992 u32 key, multi = 0; 1236 993 994 + rcu_read_lock_bh(); 1237 995 t = rcu_dereference_bh(h->table); 1238 996 #ifdef IP_SET_HASH_WITH_NETS 1239 997 /* If we test an IP address and not a network address, ··· 1266 1022 goto out; 1267 1023 } 1268 1024 out: 1025 + rcu_read_unlock_bh(); 1269 1026 return ret; 1270 1027 } 1271 1028 ··· 1278 1033 const struct htable *t; 1279 1034 struct nlattr *nested; 1280 1035 size_t memsize; 1036 + u32 elements = 0; 1037 + size_t ext_size = 0; 1281 1038 u8 htable_bits; 1282 1039 1283 - /* If any members have expired, set->elements will be wrong 1284 - * mytype_expire function will update it with the right count. 1285 - * we do not hold set->lock here, so grab it first. 1286 - * set->elements can still be incorrect in the case of a huge set, 1287 - * because elements might time out during the listing. 1288 - */ 1289 - if (SET_WITH_TIMEOUT(set)) { 1290 - spin_lock_bh(&set->lock); 1291 - mtype_expire(set, h); 1292 - spin_unlock_bh(&set->lock); 1293 - } 1294 - 1295 1040 rcu_read_lock_bh(); 1296 - t = rcu_dereference_bh_nfnl(h->table); 1297 - memsize = mtype_ahash_memsize(h, t) + set->ext_size; 1041 + t = rcu_dereference_bh(h->table); 1042 + mtype_ext_size(set, &elements, &ext_size); 1043 + memsize = mtype_ahash_memsize(h, t) + ext_size + set->ext_size; 1298 1044 htable_bits = t->htable_bits; 1299 1045 rcu_read_unlock_bh(); 1300 1046 ··· 1307 1071 #endif 1308 1072 if (nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) || 1309 1073 nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) || 1310 - nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements))) 1074 + nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(elements))) 1311 1075 goto nla_put_failure; 1312 1076 if (unlikely(ip_set_put_flags(skb, set))) 1313 1077 goto nla_put_failure; ··· 1327 1091 1328 1092 if (start) { 1329 1093 rcu_read_lock_bh(); 1330 - t = rcu_dereference_bh_nfnl(h->table); 1094 + t = ipset_dereference_bh_nfnl(h->table); 1331 1095 atomic_inc(&t->uref); 1332 1096 cb->args[IPSET_CB_PRIVATE] = (unsigned long)t; 1333 1097 rcu_read_unlock_bh(); 1334 1098 } else if (cb->args[IPSET_CB_PRIVATE]) { 1335 1099 t = (struct htable *)cb->args[IPSET_CB_PRIVATE]; 1336 1100 if (atomic_dec_and_test(&t->uref) && atomic_read(&t->ref)) { 1337 - /* Resizing didn't destroy the hash table */ 1338 - pr_debug("Table destroy by dump: %p\n", t); 1101 + pr_debug("Table destroy after resize " 1102 + " by dump: %p\n", t); 1339 1103 mtype_ahash_destroy(set, t, false); 1340 1104 } 1341 1105 cb->args[IPSET_CB_PRIVATE] = 0; ··· 1377 1141 if (!test_bit(i, n->used)) 1378 1142 continue; 1379 1143 e = ahash_data(n, i, set->dsize); 1380 - if (SET_WITH_TIMEOUT(set) && 1381 - ip_set_timeout_expired(ext_timeout(e, set))) 1144 + if (SET_ELEM_EXPIRED(set, e)) 1382 1145 continue; 1383 1146 pr_debug("list hash %lu hbucket %p i %u, data %p\n", 1384 1147 cb->args[IPSET_CB_ARG0], n, i, e); ··· 1443 1208 .uref = mtype_uref, 1444 1209 .resize = mtype_resize, 1445 1210 .same_set = mtype_same_set, 1211 + .region_lock = true, 1446 1212 }; 1447 1213 1448 1214 #ifdef IP_SET_EMIT_CREATE ··· 1462 1226 size_t hsize; 1463 1227 struct htype *h; 1464 1228 struct htable *t; 1229 + u32 i; 1465 1230 1466 1231 pr_debug("Create set %s with family %s\n", 1467 1232 set->name, set->family == NFPROTO_IPV4 ? "inet" : "inet6"); ··· 1531 1294 kfree(h); 1532 1295 return -ENOMEM; 1533 1296 } 1297 + t->hregion = ip_set_alloc(ahash_sizeof_regions(hbits)); 1298 + if (!t->hregion) { 1299 + kfree(t); 1300 + kfree(h); 1301 + return -ENOMEM; 1302 + } 1303 + h->gc.set = set; 1304 + for (i = 0; i < ahash_numof_locks(hbits); i++) 1305 + spin_lock_init(&t->hregion[i].lock); 1534 1306 h->maxelem = maxelem; 1535 1307 #ifdef IP_SET_HASH_WITH_NETMASK 1536 1308 h->netmask = netmask; ··· 1550 1304 get_random_bytes(&h->initval, sizeof(h->initval)); 1551 1305 1552 1306 t->htable_bits = hbits; 1307 + t->maxelem = h->maxelem / ahash_numof_locks(hbits); 1553 1308 RCU_INIT_POINTER(h->table, t); 1554 1309 1555 - h->set = set; 1310 + INIT_LIST_HEAD(&h->ad); 1556 1311 set->data = h; 1557 1312 #ifndef IP_SET_PROTO_UNDEF 1558 1313 if (set->family == NFPROTO_IPV4) { ··· 1576 1329 #ifndef IP_SET_PROTO_UNDEF 1577 1330 if (set->family == NFPROTO_IPV4) 1578 1331 #endif 1579 - IPSET_TOKEN(HTYPE, 4_gc_init)(set, 1580 - IPSET_TOKEN(HTYPE, 4_gc)); 1332 + IPSET_TOKEN(HTYPE, 4_gc_init)(&h->gc); 1581 1333 #ifndef IP_SET_PROTO_UNDEF 1582 1334 else 1583 - IPSET_TOKEN(HTYPE, 6_gc_init)(set, 1584 - IPSET_TOKEN(HTYPE, 6_gc)); 1335 + IPSET_TOKEN(HTYPE, 6_gc_init)(&h->gc); 1585 1336 #endif 1586 1337 } 1587 1338 pr_debug("create %s hashsize %u (%u) maxelem %u: %p(%p)\n",
+4 -2
net/netfilter/nft_set_pipapo.c
··· 1766 1766 static void nft_pipapo_remove(const struct net *net, const struct nft_set *set, 1767 1767 const struct nft_set_elem *elem) 1768 1768 { 1769 - const u8 *data = (const u8 *)elem->key.val.data; 1770 1769 struct nft_pipapo *priv = nft_set_priv(set); 1771 1770 struct nft_pipapo_match *m = priv->clone; 1771 + struct nft_pipapo_elem *e = elem->priv; 1772 1772 int rules_f0, first_rule = 0; 1773 - struct nft_pipapo_elem *e; 1773 + const u8 *data; 1774 + 1775 + data = (const u8 *)nft_set_ext_key(&e->ext); 1774 1776 1775 1777 e = pipapo_get(net, set, data, 0); 1776 1778 if (IS_ERR(e))
+6 -10
net/netfilter/xt_hashlimit.c
··· 402 402 remove_proc_entry(hinfo->name, parent); 403 403 } 404 404 405 - static void htable_destroy(struct xt_hashlimit_htable *hinfo) 406 - { 407 - cancel_delayed_work_sync(&hinfo->gc_work); 408 - htable_remove_proc_entry(hinfo); 409 - htable_selective_cleanup(hinfo, true); 410 - kfree(hinfo->name); 411 - vfree(hinfo); 412 - } 413 - 414 405 static struct xt_hashlimit_htable *htable_find_get(struct net *net, 415 406 const char *name, 416 407 u_int8_t family) ··· 423 432 { 424 433 if (refcount_dec_and_mutex_lock(&hinfo->use, &hashlimit_mutex)) { 425 434 hlist_del(&hinfo->node); 435 + htable_remove_proc_entry(hinfo); 426 436 mutex_unlock(&hashlimit_mutex); 427 - htable_destroy(hinfo); 437 + 438 + cancel_delayed_work_sync(&hinfo->gc_work); 439 + htable_selective_cleanup(hinfo, true); 440 + kfree(hinfo->name); 441 + vfree(hinfo); 428 442 } 429 443 } 430 444
+3 -2
net/netlink/genetlink.c
··· 497 497 498 498 err = __nlmsg_parse(nlh, hdrlen, attrbuf, family->maxattr, 499 499 family->policy, validate, extack); 500 - if (err && parallel) { 501 - kfree(attrbuf); 500 + if (err) { 501 + if (parallel) 502 + kfree(attrbuf); 502 503 return ERR_PTR(err); 503 504 } 504 505 return attrbuf;
+1
net/sched/act_api.c
··· 186 186 + nla_total_size(IFNAMSIZ) /* TCA_ACT_KIND */ 187 187 + cookie_len /* TCA_ACT_COOKIE */ 188 188 + nla_total_size(0) /* TCA_ACT_STATS nested */ 189 + + nla_total_size(sizeof(struct nla_bitfield32)) /* TCA_ACT_FLAGS */ 189 190 /* TCA_STATS_BASIC */ 190 191 + nla_total_size_64bit(sizeof(struct gnet_stats_basic)) 191 192 /* TCA_STATS_PKT64 */
+15 -10
net/smc/af_smc.c
··· 512 512 static int smc_connect_abort(struct smc_sock *smc, int reason_code, 513 513 int local_contact) 514 514 { 515 + bool is_smcd = smc->conn.lgr->is_smcd; 516 + 515 517 if (local_contact == SMC_FIRST_CONTACT) 516 - smc_lgr_forget(smc->conn.lgr); 517 - if (smc->conn.lgr->is_smcd) 518 + smc_lgr_cleanup_early(&smc->conn); 519 + else 520 + smc_conn_free(&smc->conn); 521 + if (is_smcd) 518 522 /* there is only one lgr role for SMC-D; use server lock */ 519 523 mutex_unlock(&smc_server_lgr_pending); 520 524 else 521 525 mutex_unlock(&smc_client_lgr_pending); 522 526 523 - smc_conn_free(&smc->conn); 524 527 smc->connect_nonblock = 0; 525 528 return reason_code; 526 529 } ··· 1094 1091 if (newsmcsk->sk_state == SMC_INIT) 1095 1092 sock_put(&new_smc->sk); /* passive closing */ 1096 1093 newsmcsk->sk_state = SMC_CLOSED; 1097 - smc_conn_free(&new_smc->conn); 1098 1094 1099 1095 smc_listen_out(new_smc); 1100 1096 } ··· 1104 1102 { 1105 1103 /* RDMA setup failed, switch back to TCP */ 1106 1104 if (local_contact == SMC_FIRST_CONTACT) 1107 - smc_lgr_forget(new_smc->conn.lgr); 1105 + smc_lgr_cleanup_early(&new_smc->conn); 1106 + else 1107 + smc_conn_free(&new_smc->conn); 1108 1108 if (reason_code < 0) { /* error, no fallback possible */ 1109 1109 smc_listen_out_err(new_smc); 1110 1110 return; 1111 1111 } 1112 - smc_conn_free(&new_smc->conn); 1113 1112 smc_switch_to_fallback(new_smc); 1114 1113 new_smc->fallback_rsn = reason_code; 1115 1114 if (reason_code && reason_code != SMC_CLC_DECL_PEERDECL) { ··· 1173 1170 new_smc->conn.lgr->vlan_id, 1174 1171 new_smc->conn.lgr->smcd)) { 1175 1172 if (ini->cln_first_contact == SMC_FIRST_CONTACT) 1176 - smc_lgr_forget(new_smc->conn.lgr); 1177 - smc_conn_free(&new_smc->conn); 1173 + smc_lgr_cleanup_early(&new_smc->conn); 1174 + else 1175 + smc_conn_free(&new_smc->conn); 1178 1176 return SMC_CLC_DECL_SMCDNOTALK; 1179 1177 } 1180 1178 1181 1179 /* Create send and receive buffers */ 1182 1180 if (smc_buf_create(new_smc, true)) { 1183 1181 if (ini->cln_first_contact == SMC_FIRST_CONTACT) 1184 - smc_lgr_forget(new_smc->conn.lgr); 1185 - smc_conn_free(&new_smc->conn); 1182 + smc_lgr_cleanup_early(&new_smc->conn); 1183 + else 1184 + smc_conn_free(&new_smc->conn); 1186 1185 return SMC_CLC_DECL_MEM; 1187 1186 } 1188 1187
+12
net/smc/smc_core.c
··· 162 162 conn->lgr = NULL; 163 163 } 164 164 165 + void smc_lgr_cleanup_early(struct smc_connection *conn) 166 + { 167 + struct smc_link_group *lgr = conn->lgr; 168 + 169 + if (!lgr) 170 + return; 171 + 172 + smc_conn_free(conn); 173 + smc_lgr_forget(lgr); 174 + smc_lgr_schedule_free_work_fast(lgr); 175 + } 176 + 165 177 /* Send delete link, either as client to request the initiation 166 178 * of the DELETE LINK sequence from server; or as server to 167 179 * initiate the delete processing. See smc_llc_rx_delete_link().
+1 -1
net/smc/smc_core.h
··· 296 296 struct smc_clc_msg_local; 297 297 298 298 void smc_lgr_forget(struct smc_link_group *lgr); 299 + void smc_lgr_cleanup_early(struct smc_connection *conn); 299 300 void smc_lgr_terminate(struct smc_link_group *lgr, bool soft); 300 301 void smc_port_terminate(struct smc_ib_device *smcibdev, u8 ibport); 301 302 void smc_smcd_terminate(struct smcd_dev *dev, u64 peer_gid, ··· 317 316 318 317 void smc_conn_free(struct smc_connection *conn); 319 318 int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini); 320 - void smcd_conn_free(struct smc_connection *conn); 321 319 void smc_lgr_schedule_free_work_fast(struct smc_link_group *lgr); 322 320 int smc_core_init(void); 323 321 void smc_core_exit(void);
+2
net/smc/smc_ib.c
··· 573 573 struct smc_ib_device *smcibdev; 574 574 575 575 smcibdev = ib_get_client_data(ibdev, &smc_ib_client); 576 + if (!smcibdev || smcibdev->ibdev != ibdev) 577 + return; 576 578 ib_set_client_data(ibdev, &smc_ib_client, NULL); 577 579 spin_lock(&smc_ib_devices.lock); 578 580 list_del_init(&smcibdev->list); /* remove from smc_ib_devices */
+4
net/unix/af_unix.c
··· 682 682 return 0; 683 683 } 684 684 685 + #ifdef CONFIG_PROC_FS 685 686 static void unix_show_fdinfo(struct seq_file *m, struct socket *sock) 686 687 { 687 688 struct sock *sk = sock->sk; ··· 693 692 seq_printf(m, "scm_fds: %u\n", READ_ONCE(u->scm_stat.nr_fds)); 694 693 } 695 694 } 695 + #else 696 + #define unix_show_fdinfo NULL 697 + #endif 696 698 697 699 static const struct proto_ops unix_stream_ops = { 698 700 .family = PF_UNIX,
+12 -8
net/vmw_vsock/af_vsock.c
··· 451 451 if (vsk->transport == new_transport) 452 452 return 0; 453 453 454 + /* transport->release() must be called with sock lock acquired. 455 + * This path can only be taken during vsock_stream_connect(), 456 + * where we have already held the sock lock. 457 + * In the other cases, this function is called on a new socket 458 + * which is not assigned to any transport. 459 + */ 454 460 vsk->transport->release(vsk); 455 461 vsock_deassign_transport(vsk); 456 462 } ··· 759 753 vsk = vsock_sk(sk); 760 754 pending = NULL; /* Compiler warning. */ 761 755 762 - /* The release call is supposed to use lock_sock_nested() 763 - * rather than lock_sock(), if a sock lock should be acquired. 764 - */ 765 - if (vsk->transport) 766 - vsk->transport->release(vsk); 767 - else if (sk->sk_type == SOCK_STREAM) 768 - vsock_remove_sock(vsk); 769 - 770 756 /* When "level" is SINGLE_DEPTH_NESTING, use the nested 771 757 * version to avoid the warning "possible recursive locking 772 758 * detected". When "level" is 0, lock_sock_nested(sk, level) 773 759 * is the same as lock_sock(sk). 774 760 */ 775 761 lock_sock_nested(sk, level); 762 + 763 + if (vsk->transport) 764 + vsk->transport->release(vsk); 765 + else if (sk->sk_type == SOCK_STREAM) 766 + vsock_remove_sock(vsk); 767 + 776 768 sock_orphan(sk); 777 769 sk->sk_shutdown = SHUTDOWN_MASK; 778 770
-3
net/vmw_vsock/hyperv_transport.c
··· 526 526 527 527 static void hvs_release(struct vsock_sock *vsk) 528 528 { 529 - struct sock *sk = sk_vsock(vsk); 530 529 bool remove_sock; 531 530 532 - lock_sock_nested(sk, SINGLE_DEPTH_NESTING); 533 531 remove_sock = hvs_close_lock_held(vsk); 534 - release_sock(sk); 535 532 if (remove_sock) 536 533 vsock_remove_sock(vsk); 537 534 }
-2
net/vmw_vsock/virtio_transport_common.c
··· 829 829 struct sock *sk = &vsk->sk; 830 830 bool remove_sock = true; 831 831 832 - lock_sock_nested(sk, SINGLE_DEPTH_NESTING); 833 832 if (sk->sk_type == SOCK_STREAM) 834 833 remove_sock = virtio_transport_close(vsk); 835 834 ··· 836 837 list_del(&pkt->list); 837 838 virtio_transport_free_pkt(pkt); 838 839 } 839 - release_sock(sk); 840 840 841 841 if (remove_sock) 842 842 vsock_remove_sock(vsk);
+3 -2
net/wireless/nl80211.c
··· 20 20 #include <linux/netlink.h> 21 21 #include <linux/nospec.h> 22 22 #include <linux/etherdevice.h> 23 + #include <linux/if_vlan.h> 23 24 #include <net/net_namespace.h> 24 25 #include <net/genetlink.h> 25 26 #include <net/cfg80211.h> ··· 4801 4800 err = nl80211_parse_he_obss_pd( 4802 4801 info->attrs[NL80211_ATTR_HE_OBSS_PD], 4803 4802 &params.he_obss_pd); 4804 - if (err) 4805 - return err; 4803 + goto out; 4806 4804 } 4807 4805 4808 4806 nl80211_calculate_ap_params(&params); ··· 4823 4823 } 4824 4824 wdev_unlock(wdev); 4825 4825 4826 + out: 4826 4827 kfree(params.acl); 4827 4828 4828 4829 return err;
+1 -1
net/wireless/reg.c
··· 2276 2276 break; 2277 2277 } 2278 2278 2279 - if (IS_ERR(reg_rule)) { 2279 + if (IS_ERR_OR_NULL(reg_rule)) { 2280 2280 pr_debug("Disabling freq %d MHz as custom regd has no rule that fits it\n", 2281 2281 chan->center_freq); 2282 2282 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
+45 -10
tools/testing/selftests/netfilter/nft_concat_range.sh
··· 13 13 KSELFTEST_SKIP=4 14 14 15 15 # Available test groups: 16 + # - reported_issues: check for issues that were reported in the past 16 17 # - correctness: check that packets match given entries, and only those 17 18 # - concurrency: attempt races between insertion, deletion and lookup 18 19 # - timeout: check that packets match entries until they expire 19 20 # - performance: estimate matching rate, compare with rbtree and hash baselines 20 - TESTS="correctness concurrency timeout" 21 + TESTS="reported_issues correctness concurrency timeout" 21 22 [ "${quicktest}" != "1" ] && TESTS="${TESTS} performance" 22 23 23 24 # Set types, defined by TYPE_ variables below 24 25 TYPES="net_port port_net net6_port port_proto net6_port_mac net6_port_mac_proto 25 26 net_port_net net_mac net_mac_icmp net6_mac_icmp net6_port_net6_port 26 27 net_port_mac_proto_net" 28 + 29 + # Reported bugs, also described by TYPE_ variables below 30 + BUGS="flush_remove_add" 27 31 28 32 # List of possible paths to pktgen script from kernel tree for performance tests 29 33 PKTGEN_SCRIPT_PATHS=" ··· 331 327 perf_duration 0 332 328 " 333 329 330 + # Definition of tests for bugs reported in the past: 331 + # display display text for test report 332 + TYPE_flush_remove_add=" 333 + display Add two elements, flush, re-add 334 + " 335 + 334 336 # Set template for all tests, types and rules are filled in depending on test 335 337 set_template=' 336 338 flush ruleset ··· 450 440 451 441 # Check that at least one of the needed tools is available 452 442 check_tools() { 443 + [ -z "${tools}" ] && return 0 444 + 453 445 __tools= 454 446 for tool in ${tools}; do 455 447 if [ "${tool}" = "nc" ] && [ "${proto}" = "udp6" ] && \ ··· 1037 1025 add() { 1038 1026 if ! nft add element inet filter test "${1}"; then 1039 1027 err "Failed to add ${1} given ruleset:" 1040 - err "$(nft list ruleset -a)" 1028 + err "$(nft -a list ruleset)" 1041 1029 return 1 1042 1030 fi 1043 1031 } ··· 1057 1045 add_perf_norange() { 1058 1046 if ! nft add element netdev perf norange "${1}"; then 1059 1047 err "Failed to add ${1} given ruleset:" 1060 - err "$(nft list ruleset -a)" 1048 + err "$(nft -a list ruleset)" 1061 1049 return 1 1062 1050 fi 1063 1051 } ··· 1066 1054 add_perf_noconcat() { 1067 1055 if ! nft add element netdev perf noconcat "${1}"; then 1068 1056 err "Failed to add ${1} given ruleset:" 1069 - err "$(nft list ruleset -a)" 1057 + err "$(nft -a list ruleset)" 1070 1058 return 1 1071 1059 fi 1072 1060 } ··· 1075 1063 del() { 1076 1064 if ! nft delete element inet filter test "${1}"; then 1077 1065 err "Failed to delete ${1} given ruleset:" 1078 - err "$(nft list ruleset -a)" 1066 + err "$(nft -a list ruleset)" 1079 1067 return 1 1080 1068 fi 1081 1069 } ··· 1146 1134 err " $(for f in ${src}; do 1147 1135 eval format_\$f "${2}"; printf ' '; done)" 1148 1136 err "should have matched ruleset:" 1149 - err "$(nft list ruleset -a)" 1137 + err "$(nft -a list ruleset)" 1150 1138 return 1 1151 1139 fi 1152 1140 nft reset counter inet filter test >/dev/null ··· 1172 1160 err " $(for f in ${src}; do 1173 1161 eval format_\$f "${2}"; printf ' '; done)" 1174 1162 err "should not have matched ruleset:" 1175 - err "$(nft list ruleset -a)" 1163 + err "$(nft -a list ruleset)" 1176 1164 return 1 1177 1165 fi 1178 1166 } ··· 1442 1430 kill "${perf_pid}" 1443 1431 } 1444 1432 1433 + test_bug_flush_remove_add() { 1434 + set_cmd='{ set s { type ipv4_addr . inet_service; flags interval; }; }' 1435 + elem1='{ 10.0.0.1 . 22-25, 10.0.0.1 . 10-20 }' 1436 + elem2='{ 10.0.0.1 . 10-20, 10.0.0.1 . 22-25 }' 1437 + for i in `seq 1 100`; do 1438 + nft add table t ${set_cmd} || return ${KSELFTEST_SKIP} 1439 + nft add element t s ${elem1} 2>/dev/null || return 1 1440 + nft flush set t s 2>/dev/null || return 1 1441 + nft add element t s ${elem2} 2>/dev/null || return 1 1442 + done 1443 + nft flush ruleset 1444 + } 1445 + 1446 + test_reported_issues() { 1447 + eval test_bug_"${subtest}" 1448 + } 1449 + 1445 1450 # Run everything in a separate network namespace 1446 1451 [ "${1}" != "run" ] && { unshare -n "${0}" run; exit $?; } 1447 1452 tmp="$(mktemp)" ··· 1467 1438 # Entry point for test runs 1468 1439 passed=0 1469 1440 for name in ${TESTS}; do 1470 - printf "TEST: %s\n" "${name}" 1471 - for type in ${TYPES}; do 1472 - eval desc=\$TYPE_"${type}" 1441 + printf "TEST: %s\n" "$(echo ${name} | tr '_' ' ')" 1442 + if [ "${name}" = "reported_issues" ]; then 1443 + SUBTESTS="${BUGS}" 1444 + else 1445 + SUBTESTS="${TYPES}" 1446 + fi 1447 + 1448 + for subtest in ${SUBTESTS}; do 1449 + eval desc=\$TYPE_"${subtest}" 1473 1450 IFS=' 1474 1451 ' 1475 1452 for __line in ${desc}; do