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

Merge branches 'core', 'ipoib', 'iser', 'mlx4', 'ocrdma' and 'qib' into for-next

+263 -149
+4
drivers/infiniband/core/uverbs_marshall.c
··· 140 140 dst->packet_life_time = src->packet_life_time; 141 141 dst->preference = src->preference; 142 142 dst->packet_life_time_selector = src->packet_life_time_selector; 143 + 144 + memset(dst->smac, 0, sizeof(dst->smac)); 145 + memset(dst->dmac, 0, sizeof(dst->dmac)); 146 + dst->vlan_id = 0xffff; 143 147 } 144 148 EXPORT_SYMBOL(ib_copy_path_rec_from_user);
+3 -3
drivers/infiniband/hw/ipath/ipath_user_pages.c
··· 54 54 55 55 /* call with current->mm->mmap_sem held */ 56 56 static int __ipath_get_user_pages(unsigned long start_page, size_t num_pages, 57 - struct page **p, struct vm_area_struct **vma) 57 + struct page **p) 58 58 { 59 59 unsigned long lock_limit; 60 60 size_t got; ··· 74 74 ret = get_user_pages(current, current->mm, 75 75 start_page + got * PAGE_SIZE, 76 76 num_pages - got, 1, 1, 77 - p + got, vma); 77 + p + got, NULL); 78 78 if (ret < 0) 79 79 goto bail_release; 80 80 } ··· 165 165 166 166 down_write(&current->mm->mmap_sem); 167 167 168 - ret = __ipath_get_user_pages(start_page, num_pages, p, NULL); 168 + ret = __ipath_get_user_pages(start_page, num_pages, p); 169 169 170 170 up_write(&current->mm->mmap_sem); 171 171
+115 -54
drivers/infiniband/hw/mlx4/main.c
··· 59 59 60 60 #define MLX4_IB_FLOW_MAX_PRIO 0xFFF 61 61 #define MLX4_IB_FLOW_QPN_MASK 0xFFFFFF 62 + #define MLX4_IB_CARD_REV_A0 0xA0 62 63 63 64 MODULE_AUTHOR("Roland Dreier"); 64 65 MODULE_DESCRIPTION("Mellanox ConnectX HCA InfiniBand driver"); ··· 120 119 return dmfs; 121 120 } 122 121 122 + static int num_ib_ports(struct mlx4_dev *dev) 123 + { 124 + int ib_ports = 0; 125 + int i; 126 + 127 + mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB) 128 + ib_ports++; 129 + 130 + return ib_ports; 131 + } 132 + 123 133 static int mlx4_ib_query_device(struct ib_device *ibdev, 124 134 struct ib_device_attr *props) 125 135 { ··· 138 126 struct ib_smp *in_mad = NULL; 139 127 struct ib_smp *out_mad = NULL; 140 128 int err = -ENOMEM; 129 + int have_ib_ports; 141 130 142 131 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 143 132 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL); ··· 155 142 156 143 memset(props, 0, sizeof *props); 157 144 145 + have_ib_ports = num_ib_ports(dev->dev); 146 + 158 147 props->fw_ver = dev->dev->caps.fw_ver; 159 148 props->device_cap_flags = IB_DEVICE_CHANGE_PHY_PORT | 160 149 IB_DEVICE_PORT_ACTIVE_EVENT | ··· 167 152 props->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR; 168 153 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BAD_QKEY_CNTR) 169 154 props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR; 170 - if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_APM) 155 + if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_APM && have_ib_ports) 171 156 props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG; 172 157 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_UD_AV_PORT) 173 158 props->device_cap_flags |= IB_DEVICE_UD_AV_PORT_ENFORCE; 174 159 if (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_IPOIB_CSUM) 175 160 props->device_cap_flags |= IB_DEVICE_UD_IP_CSUM; 176 - if (dev->dev->caps.max_gso_sz && dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BLH) 161 + if (dev->dev->caps.max_gso_sz && 162 + (dev->dev->rev_id != MLX4_IB_CARD_REV_A0) && 163 + (dev->dev->caps.flags & MLX4_DEV_CAP_FLAG_BLH)) 177 164 props->device_cap_flags |= IB_DEVICE_UD_TSO; 178 165 if (dev->dev->caps.bmme_flags & MLX4_BMME_FLAG_RESERVED_LKEY) 179 166 props->device_cap_flags |= IB_DEVICE_LOCAL_DMA_LKEY; ··· 374 357 props->state = IB_PORT_DOWN; 375 358 props->phys_state = state_to_phys_state(props->state); 376 359 props->active_mtu = IB_MTU_256; 377 - spin_lock(&iboe->lock); 360 + spin_lock_bh(&iboe->lock); 378 361 ndev = iboe->netdevs[port - 1]; 379 362 if (!ndev) 380 363 goto out_unlock; ··· 386 369 IB_PORT_ACTIVE : IB_PORT_DOWN; 387 370 props->phys_state = state_to_phys_state(props->state); 388 371 out_unlock: 389 - spin_unlock(&iboe->lock); 372 + spin_unlock_bh(&iboe->lock); 390 373 out: 391 374 mlx4_free_cmd_mailbox(mdev->dev, mailbox); 392 375 return err; ··· 828 811 if (!mqp->port) 829 812 return 0; 830 813 831 - spin_lock(&mdev->iboe.lock); 814 + spin_lock_bh(&mdev->iboe.lock); 832 815 ndev = mdev->iboe.netdevs[mqp->port - 1]; 833 816 if (ndev) 834 817 dev_hold(ndev); 835 - spin_unlock(&mdev->iboe.lock); 818 + spin_unlock_bh(&mdev->iboe.lock); 836 819 837 820 if (ndev) { 838 821 ret = 1; ··· 1279 1262 mutex_lock(&mqp->mutex); 1280 1263 ge = find_gid_entry(mqp, gid->raw); 1281 1264 if (ge) { 1282 - spin_lock(&mdev->iboe.lock); 1265 + spin_lock_bh(&mdev->iboe.lock); 1283 1266 ndev = ge->added ? mdev->iboe.netdevs[ge->port - 1] : NULL; 1284 1267 if (ndev) 1285 1268 dev_hold(ndev); 1286 - spin_unlock(&mdev->iboe.lock); 1269 + spin_unlock_bh(&mdev->iboe.lock); 1287 1270 if (ndev) 1288 1271 dev_put(ndev); 1289 1272 list_del(&ge->list); ··· 1404 1387 int err; 1405 1388 struct mlx4_dev *dev = gw->dev->dev; 1406 1389 1390 + if (!gw->dev->ib_active) 1391 + return; 1392 + 1407 1393 mailbox = mlx4_alloc_cmd_mailbox(dev); 1408 1394 if (IS_ERR(mailbox)) { 1409 1395 pr_warn("update gid table failed %ld\n", PTR_ERR(mailbox)); ··· 1436 1416 union ib_gid *gids; 1437 1417 int err; 1438 1418 struct mlx4_dev *dev = gw->dev->dev; 1419 + 1420 + if (!gw->dev->ib_active) 1421 + return; 1439 1422 1440 1423 mailbox = mlx4_alloc_cmd_mailbox(dev); 1441 1424 if (IS_ERR(mailbox)) { ··· 1574 1551 return 0; 1575 1552 1576 1553 iboe = &ibdev->iboe; 1577 - spin_lock(&iboe->lock); 1554 + spin_lock_bh(&iboe->lock); 1578 1555 1579 1556 for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) 1580 1557 if ((netif_is_bond_master(real_dev) && ··· 1584 1561 update_gid_table(ibdev, port, gid, 1585 1562 event == NETDEV_DOWN, 0); 1586 1563 1587 - spin_unlock(&iboe->lock); 1564 + spin_unlock_bh(&iboe->lock); 1588 1565 return 0; 1589 1566 1590 1567 } ··· 1657 1634 new_smac = mlx4_mac_to_u64(dev->dev_addr); 1658 1635 read_unlock(&dev_base_lock); 1659 1636 1637 + atomic64_set(&ibdev->iboe.mac[port - 1], new_smac); 1638 + 1639 + /* no need for update QP1 and mac registration in non-SRIOV */ 1640 + if (!mlx4_is_mfunc(ibdev->dev)) 1641 + return; 1642 + 1660 1643 mutex_lock(&ibdev->qp1_proxy_lock[port - 1]); 1661 1644 qp = ibdev->qp1_proxy[port - 1]; 1662 1645 if (qp) { 1663 1646 int new_smac_index; 1664 - u64 old_smac = qp->pri.smac; 1647 + u64 old_smac; 1665 1648 struct mlx4_update_qp_params update_params; 1666 1649 1650 + mutex_lock(&qp->mutex); 1651 + old_smac = qp->pri.smac; 1667 1652 if (new_smac == old_smac) 1668 1653 goto unlock; 1669 1654 ··· 1686 1655 release_mac = new_smac; 1687 1656 goto unlock; 1688 1657 } 1689 - 1658 + /* if old port was zero, no mac was yet registered for this QP */ 1659 + if (qp->pri.smac_port) 1660 + release_mac = old_smac; 1690 1661 qp->pri.smac = new_smac; 1662 + qp->pri.smac_port = port; 1691 1663 qp->pri.smac_index = new_smac_index; 1692 - 1693 - release_mac = old_smac; 1694 1664 } 1695 1665 1696 1666 unlock: 1697 - mutex_unlock(&ibdev->qp1_proxy_lock[port - 1]); 1698 1667 if (release_mac != MLX4_IB_INVALID_MAC) 1699 1668 mlx4_unregister_mac(ibdev->dev, port, release_mac); 1669 + if (qp) 1670 + mutex_unlock(&qp->mutex); 1671 + mutex_unlock(&ibdev->qp1_proxy_lock[port - 1]); 1700 1672 } 1701 1673 1702 1674 static void mlx4_ib_get_dev_addr(struct net_device *dev, ··· 1710 1676 struct inet6_dev *in6_dev; 1711 1677 union ib_gid *pgid; 1712 1678 struct inet6_ifaddr *ifp; 1679 + union ib_gid default_gid; 1713 1680 #endif 1714 1681 union ib_gid gid; 1715 1682 ··· 1731 1696 in_dev_put(in_dev); 1732 1697 } 1733 1698 #if IS_ENABLED(CONFIG_IPV6) 1699 + mlx4_make_default_gid(dev, &default_gid); 1734 1700 /* IPv6 gids */ 1735 1701 in6_dev = in6_dev_get(dev); 1736 1702 if (in6_dev) { 1737 1703 read_lock_bh(&in6_dev->lock); 1738 1704 list_for_each_entry(ifp, &in6_dev->addr_list, if_list) { 1739 1705 pgid = (union ib_gid *)&ifp->addr; 1706 + if (!memcmp(pgid, &default_gid, sizeof(*pgid))) 1707 + continue; 1740 1708 update_gid_table(ibdev, port, pgid, 0, 0); 1741 1709 } 1742 1710 read_unlock_bh(&in6_dev->lock); ··· 1761 1723 struct net_device *dev; 1762 1724 struct mlx4_ib_iboe *iboe = &ibdev->iboe; 1763 1725 int i; 1726 + int err = 0; 1764 1727 1765 - for (i = 1; i <= ibdev->num_ports; ++i) 1766 - if (reset_gid_table(ibdev, i)) 1767 - return -1; 1728 + for (i = 1; i <= ibdev->num_ports; ++i) { 1729 + if (rdma_port_get_link_layer(&ibdev->ib_dev, i) == 1730 + IB_LINK_LAYER_ETHERNET) { 1731 + err = reset_gid_table(ibdev, i); 1732 + if (err) 1733 + goto out; 1734 + } 1735 + } 1768 1736 1769 1737 read_lock(&dev_base_lock); 1770 - spin_lock(&iboe->lock); 1738 + spin_lock_bh(&iboe->lock); 1771 1739 1772 1740 for_each_netdev(&init_net, dev) { 1773 1741 u8 port = mlx4_ib_get_dev_port(dev, ibdev); 1774 - if (port) 1742 + /* port will be non-zero only for ETH ports */ 1743 + if (port) { 1744 + mlx4_ib_set_default_gid(ibdev, dev, port); 1775 1745 mlx4_ib_get_dev_addr(dev, ibdev, port); 1746 + } 1776 1747 } 1777 1748 1778 - spin_unlock(&iboe->lock); 1749 + spin_unlock_bh(&iboe->lock); 1779 1750 read_unlock(&dev_base_lock); 1780 - 1781 - return 0; 1751 + out: 1752 + return err; 1782 1753 } 1783 1754 1784 1755 static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev, ··· 1801 1754 1802 1755 iboe = &ibdev->iboe; 1803 1756 1804 - spin_lock(&iboe->lock); 1757 + spin_lock_bh(&iboe->lock); 1805 1758 mlx4_foreach_ib_transport_port(port, ibdev->dev) { 1806 1759 enum ib_port_state port_state = IB_PORT_NOP; 1807 1760 struct net_device *old_master = iboe->masters[port - 1]; ··· 1833 1786 port_state = (netif_running(curr_netdev) && netif_carrier_ok(curr_netdev)) ? 1834 1787 IB_PORT_ACTIVE : IB_PORT_DOWN; 1835 1788 mlx4_ib_set_default_gid(ibdev, curr_netdev, port); 1789 + if (curr_master) { 1790 + /* if using bonding/team and a slave port is down, we 1791 + * don't want the bond IP based gids in the table since 1792 + * flows that select port by gid may get the down port. 1793 + */ 1794 + if (port_state == IB_PORT_DOWN) { 1795 + reset_gid_table(ibdev, port); 1796 + mlx4_ib_set_default_gid(ibdev, 1797 + curr_netdev, 1798 + port); 1799 + } else { 1800 + /* gids from the upper dev (bond/team) 1801 + * should appear in port's gid table 1802 + */ 1803 + mlx4_ib_get_dev_addr(curr_master, 1804 + ibdev, port); 1805 + } 1806 + } 1807 + /* if bonding is used it is possible that we add it to 1808 + * masters only after IP address is assigned to the 1809 + * net bonding interface. 1810 + */ 1811 + if (curr_master && (old_master != curr_master)) { 1812 + reset_gid_table(ibdev, port); 1813 + mlx4_ib_set_default_gid(ibdev, 1814 + curr_netdev, port); 1815 + mlx4_ib_get_dev_addr(curr_master, ibdev, port); 1816 + } 1817 + 1818 + if (!curr_master && (old_master != curr_master)) { 1819 + reset_gid_table(ibdev, port); 1820 + mlx4_ib_set_default_gid(ibdev, 1821 + curr_netdev, port); 1822 + mlx4_ib_get_dev_addr(curr_netdev, ibdev, port); 1823 + } 1836 1824 } else { 1837 1825 reset_gid_table(ibdev, port); 1838 1826 } 1839 - /* if using bonding/team and a slave port is down, we don't the bond IP 1840 - * based gids in the table since flows that select port by gid may get 1841 - * the down port. 1842 - */ 1843 - if (curr_master && (port_state == IB_PORT_DOWN)) { 1844 - reset_gid_table(ibdev, port); 1845 - mlx4_ib_set_default_gid(ibdev, curr_netdev, port); 1846 - } 1847 - /* if bonding is used it is possible that we add it to masters 1848 - * only after IP address is assigned to the net bonding 1849 - * interface. 1850 - */ 1851 - if (curr_master && (old_master != curr_master)) { 1852 - reset_gid_table(ibdev, port); 1853 - mlx4_ib_set_default_gid(ibdev, curr_netdev, port); 1854 - mlx4_ib_get_dev_addr(curr_master, ibdev, port); 1855 - } 1856 - 1857 - if (!curr_master && (old_master != curr_master)) { 1858 - reset_gid_table(ibdev, port); 1859 - mlx4_ib_set_default_gid(ibdev, curr_netdev, port); 1860 - mlx4_ib_get_dev_addr(curr_netdev, ibdev, port); 1861 - } 1862 1827 } 1863 1828 1864 - spin_unlock(&iboe->lock); 1829 + spin_unlock_bh(&iboe->lock); 1865 1830 1866 1831 if (update_qps_port > 0) 1867 1832 mlx4_ib_update_qps(ibdev, dev, update_qps_port); ··· 2215 2156 goto err_steer_free_bitmap; 2216 2157 } 2217 2158 2159 + for (j = 1; j <= ibdev->dev->caps.num_ports; j++) 2160 + atomic64_set(&iboe->mac[j - 1], ibdev->dev->caps.def_mac[j]); 2161 + 2218 2162 if (ib_register_device(&ibdev->ib_dev, NULL)) 2219 2163 goto err_steer_free_bitmap; 2220 2164 ··· 2254 2192 } 2255 2193 } 2256 2194 #endif 2257 - for (i = 1 ; i <= ibdev->num_ports ; ++i) 2258 - reset_gid_table(ibdev, i); 2259 - rtnl_lock(); 2260 - mlx4_ib_scan_netdevs(ibdev, NULL, 0); 2261 - rtnl_unlock(); 2262 - mlx4_ib_init_gid_table(ibdev); 2195 + if (mlx4_ib_init_gid_table(ibdev)) 2196 + goto err_notif; 2263 2197 } 2264 2198 2265 2199 for (j = 0; j < ARRAY_SIZE(mlx4_class_attributes); ++j) { ··· 2402 2344 { 2403 2345 struct mlx4_ib_dev *ibdev = ibdev_ptr; 2404 2346 int p; 2347 + 2348 + ibdev->ib_active = false; 2349 + flush_workqueue(wq); 2405 2350 2406 2351 mlx4_ib_close_sriov(ibdev); 2407 2352 mlx4_ib_mad_cleanup(ibdev);
+1
drivers/infiniband/hw/mlx4/mlx4_ib.h
··· 451 451 spinlock_t lock; 452 452 struct net_device *netdevs[MLX4_MAX_PORTS]; 453 453 struct net_device *masters[MLX4_MAX_PORTS]; 454 + atomic64_t mac[MLX4_MAX_PORTS]; 454 455 struct notifier_block nb; 455 456 struct notifier_block nb_inet; 456 457 struct notifier_block nb_inet6;
+5 -2
drivers/infiniband/hw/mlx4/mr.c
··· 234 234 0); 235 235 if (IS_ERR(mmr->umem)) { 236 236 err = PTR_ERR(mmr->umem); 237 + /* Prevent mlx4_ib_dereg_mr from free'ing invalid pointer */ 237 238 mmr->umem = NULL; 238 239 goto release_mpt_entry; 239 240 } 240 241 n = ib_umem_page_count(mmr->umem); 241 242 shift = ilog2(mmr->umem->page_size); 242 243 243 - mmr->mmr.iova = virt_addr; 244 - mmr->mmr.size = length; 245 244 err = mlx4_mr_rereg_mem_write(dev->dev, &mmr->mmr, 246 245 virt_addr, length, n, shift, 247 246 *pmpt_entry); ··· 248 249 ib_umem_release(mmr->umem); 249 250 goto release_mpt_entry; 250 251 } 252 + mmr->mmr.iova = virt_addr; 253 + mmr->mmr.size = length; 251 254 252 255 err = mlx4_ib_umem_write_mtt(dev, &mmr->mmr.mtt, mmr->umem); 253 256 if (err) { ··· 263 262 * return a failure. But dereg_mr will free the resources. 264 263 */ 265 264 err = mlx4_mr_hw_write_mpt(dev->dev, &mmr->mmr, pmpt_entry); 265 + if (!err && flags & IB_MR_REREG_ACCESS) 266 + mmr->mmr.access = mr_access_flags; 266 267 267 268 release_mpt_entry: 268 269 mlx4_mr_hw_put_mpt(dev->dev, pmpt_entry);
+38 -22
drivers/infiniband/hw/mlx4/qp.c
··· 964 964 MLX4_QP_STATE_RST, NULL, 0, 0, &qp->mqp)) 965 965 pr_warn("modify QP %06x to RESET failed.\n", 966 966 qp->mqp.qpn); 967 - if (qp->pri.smac) { 967 + if (qp->pri.smac || (!qp->pri.smac && qp->pri.smac_port)) { 968 968 mlx4_unregister_mac(dev->dev, qp->pri.smac_port, qp->pri.smac); 969 969 qp->pri.smac = 0; 970 + qp->pri.smac_port = 0; 970 971 } 971 972 if (qp->alt.smac) { 972 973 mlx4_unregister_mac(dev->dev, qp->alt.smac_port, qp->alt.smac); ··· 1326 1325 * If one was already assigned, but the new mac differs, 1327 1326 * unregister the old one and register the new one. 1328 1327 */ 1329 - if (!smac_info->smac || smac_info->smac != smac) { 1328 + if ((!smac_info->smac && !smac_info->smac_port) || 1329 + smac_info->smac != smac) { 1330 1330 /* register candidate now, unreg if needed, after success */ 1331 1331 smac_index = mlx4_register_mac(dev->dev, port, smac); 1332 1332 if (smac_index >= 0) { ··· 1392 1390 static int handle_eth_ud_smac_index(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp, u8 *smac, 1393 1391 struct mlx4_qp_context *context) 1394 1392 { 1395 - struct net_device *ndev; 1396 1393 u64 u64_mac; 1397 1394 int smac_index; 1398 1395 1399 - 1400 - ndev = dev->iboe.netdevs[qp->port - 1]; 1401 - if (ndev) { 1402 - smac = ndev->dev_addr; 1403 - u64_mac = mlx4_mac_to_u64(smac); 1404 - } else { 1405 - u64_mac = dev->dev->caps.def_mac[qp->port]; 1406 - } 1396 + u64_mac = atomic64_read(&dev->iboe.mac[qp->port - 1]); 1407 1397 1408 1398 context->pri_path.sched_queue = MLX4_IB_DEFAULT_SCHED_QUEUE | ((qp->port - 1) << 6); 1409 - if (!qp->pri.smac) { 1399 + if (!qp->pri.smac && !qp->pri.smac_port) { 1410 1400 smac_index = mlx4_register_mac(dev->dev, qp->port, u64_mac); 1411 1401 if (smac_index >= 0) { 1412 1402 qp->pri.candidate_smac_index = smac_index; ··· 1425 1431 int sqd_event; 1426 1432 int steer_qp = 0; 1427 1433 int err = -EINVAL; 1434 + 1435 + /* APM is not supported under RoCE */ 1436 + if (attr_mask & IB_QP_ALT_PATH && 1437 + rdma_port_get_link_layer(&dev->ib_dev, qp->port) == 1438 + IB_LINK_LAYER_ETHERNET) 1439 + return -ENOTSUPP; 1428 1440 1429 1441 context = kzalloc(sizeof *context, GFP_KERNEL); 1430 1442 if (!context) ··· 1780 1780 if (qp->flags & MLX4_IB_QP_NETIF) 1781 1781 mlx4_ib_steer_qp_reg(dev, qp, 0); 1782 1782 } 1783 - if (qp->pri.smac) { 1783 + if (qp->pri.smac || (!qp->pri.smac && qp->pri.smac_port)) { 1784 1784 mlx4_unregister_mac(dev->dev, qp->pri.smac_port, qp->pri.smac); 1785 1785 qp->pri.smac = 0; 1786 + qp->pri.smac_port = 0; 1786 1787 } 1787 1788 if (qp->alt.smac) { 1788 1789 mlx4_unregister_mac(dev->dev, qp->alt.smac_port, qp->alt.smac); ··· 1807 1806 if (err && steer_qp) 1808 1807 mlx4_ib_steer_qp_reg(dev, qp, 0); 1809 1808 kfree(context); 1810 - if (qp->pri.candidate_smac) { 1809 + if (qp->pri.candidate_smac || 1810 + (!qp->pri.candidate_smac && qp->pri.candidate_smac_port)) { 1811 1811 if (err) { 1812 1812 mlx4_unregister_mac(dev->dev, qp->pri.candidate_smac_port, qp->pri.candidate_smac); 1813 1813 } else { 1814 - if (qp->pri.smac) 1814 + if (qp->pri.smac || (!qp->pri.smac && qp->pri.smac_port)) 1815 1815 mlx4_unregister_mac(dev->dev, qp->pri.smac_port, qp->pri.smac); 1816 1816 qp->pri.smac = qp->pri.candidate_smac; 1817 1817 qp->pri.smac_index = qp->pri.candidate_smac_index; ··· 2085 2083 return 0; 2086 2084 } 2087 2085 2086 + static void mlx4_u64_to_smac(u8 *dst_mac, u64 src_mac) 2087 + { 2088 + int i; 2089 + 2090 + for (i = ETH_ALEN; i; i--) { 2091 + dst_mac[i - 1] = src_mac & 0xff; 2092 + src_mac >>= 8; 2093 + } 2094 + } 2095 + 2088 2096 static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr, 2089 2097 void *wqe, unsigned *mlx_seg_len) 2090 2098 { ··· 2209 2197 } 2210 2198 2211 2199 if (is_eth) { 2212 - u8 *smac; 2213 2200 struct in6_addr in6; 2214 2201 2215 2202 u16 pcp = (be32_to_cpu(ah->av.ib.sl_tclass_flowlabel) >> 29) << 13; ··· 2221 2210 memcpy(&ctrl->imm, ah->av.eth.mac + 2, 4); 2222 2211 memcpy(&in6, sgid.raw, sizeof(in6)); 2223 2212 2224 - if (!mlx4_is_mfunc(to_mdev(ib_dev)->dev)) 2225 - smac = to_mdev(sqp->qp.ibqp.device)-> 2226 - iboe.netdevs[sqp->qp.port - 1]->dev_addr; 2227 - else /* use the src mac of the tunnel */ 2228 - smac = ah->av.eth.s_mac; 2229 - memcpy(sqp->ud_header.eth.smac_h, smac, 6); 2213 + if (!mlx4_is_mfunc(to_mdev(ib_dev)->dev)) { 2214 + u64 mac = atomic64_read(&to_mdev(ib_dev)->iboe.mac[sqp->qp.port - 1]); 2215 + u8 smac[ETH_ALEN]; 2216 + 2217 + mlx4_u64_to_smac(smac, mac); 2218 + memcpy(sqp->ud_header.eth.smac_h, smac, ETH_ALEN); 2219 + } else { 2220 + /* use the src mac of the tunnel */ 2221 + memcpy(sqp->ud_header.eth.smac_h, ah->av.eth.s_mac, ETH_ALEN); 2222 + } 2223 + 2230 2224 if (!memcmp(sqp->ud_header.eth.smac_h, sqp->ud_header.eth.dmac_h, 6)) 2231 2225 mlx->flags |= cpu_to_be32(MLX4_WQE_CTRL_FORCE_LOOPBACK); 2232 2226 if (!is_vlan) {
+31 -12
drivers/infiniband/hw/ocrdma/ocrdma_ah.c
··· 38 38 #define OCRDMA_VID_PCP_SHIFT 0xD 39 39 40 40 static inline int set_av_attr(struct ocrdma_dev *dev, struct ocrdma_ah *ah, 41 - struct ib_ah_attr *attr, int pdid) 41 + struct ib_ah_attr *attr, union ib_gid *sgid, int pdid) 42 42 { 43 43 int status = 0; 44 44 u16 vlan_tag; bool vlan_enabled = false; ··· 49 49 memset(&eth, 0, sizeof(eth)); 50 50 memset(&grh, 0, sizeof(grh)); 51 51 52 - ah->sgid_index = attr->grh.sgid_index; 53 - 52 + /* VLAN */ 54 53 vlan_tag = attr->vlan_id; 55 54 if (!vlan_tag || (vlan_tag > 0xFFF)) 56 55 vlan_tag = dev->pvid; ··· 64 65 eth.eth_type = cpu_to_be16(OCRDMA_ROCE_ETH_TYPE); 65 66 eth_sz = sizeof(struct ocrdma_eth_basic); 66 67 } 68 + /* MAC */ 67 69 memcpy(&eth.smac[0], &dev->nic_info.mac_addr[0], ETH_ALEN); 68 - memcpy(&eth.dmac[0], attr->dmac, ETH_ALEN); 69 70 status = ocrdma_resolve_dmac(dev, attr, &eth.dmac[0]); 70 71 if (status) 71 72 return status; 72 - status = ocrdma_query_gid(&dev->ibdev, 1, attr->grh.sgid_index, 73 - (union ib_gid *)&grh.sgid[0]); 74 - if (status) 75 - return status; 73 + ah->sgid_index = attr->grh.sgid_index; 74 + memcpy(&grh.sgid[0], sgid->raw, sizeof(union ib_gid)); 75 + memcpy(&grh.dgid[0], attr->grh.dgid.raw, sizeof(attr->grh.dgid.raw)); 76 76 77 77 grh.tclass_flow = cpu_to_be32((6 << 28) | 78 78 (attr->grh.traffic_class << 24) | ··· 79 81 /* 0x1b is next header value in GRH */ 80 82 grh.pdid_hoplimit = cpu_to_be32((pdid << 16) | 81 83 (0x1b << 8) | attr->grh.hop_limit); 82 - 83 - memcpy(&grh.dgid[0], attr->grh.dgid.raw, sizeof(attr->grh.dgid.raw)); 84 + /* Eth HDR */ 84 85 memcpy(&ah->av->eth_hdr, &eth, eth_sz); 85 86 memcpy((u8 *)ah->av + eth_sz, &grh, sizeof(struct ocrdma_grh)); 86 87 if (vlan_enabled) ··· 95 98 struct ocrdma_ah *ah; 96 99 struct ocrdma_pd *pd = get_ocrdma_pd(ibpd); 97 100 struct ocrdma_dev *dev = get_ocrdma_dev(ibpd->device); 101 + union ib_gid sgid; 102 + u8 zmac[ETH_ALEN]; 98 103 99 104 if (!(attr->ah_flags & IB_AH_GRH)) 100 105 return ERR_PTR(-EINVAL); ··· 110 111 status = ocrdma_alloc_av(dev, ah); 111 112 if (status) 112 113 goto av_err; 113 - status = set_av_attr(dev, ah, attr, pd->id); 114 + 115 + status = ocrdma_query_gid(&dev->ibdev, 1, attr->grh.sgid_index, &sgid); 116 + if (status) { 117 + pr_err("%s(): Failed to query sgid, status = %d\n", 118 + __func__, status); 119 + goto av_conf_err; 120 + } 121 + 122 + memset(&zmac, 0, ETH_ALEN); 123 + if (pd->uctx && 124 + memcmp(attr->dmac, &zmac, ETH_ALEN)) { 125 + status = rdma_addr_find_dmac_by_grh(&sgid, &attr->grh.dgid, 126 + attr->dmac, &attr->vlan_id); 127 + if (status) { 128 + pr_err("%s(): Failed to resolve dmac from gid." 129 + "status = %d\n", __func__, status); 130 + goto av_conf_err; 131 + } 132 + } 133 + 134 + status = set_av_attr(dev, ah, attr, &sgid, pd->id); 114 135 if (status) 115 136 goto av_conf_err; 116 137 ··· 164 145 struct ocrdma_av *av = ah->av; 165 146 struct ocrdma_grh *grh; 166 147 attr->ah_flags |= IB_AH_GRH; 167 - if (ah->av->valid & Bit(1)) { 148 + if (ah->av->valid & OCRDMA_AV_VALID) { 168 149 grh = (struct ocrdma_grh *)((u8 *)ah->av + 169 150 sizeof(struct ocrdma_eth_vlan)); 170 151 attr->sl = be16_to_cpu(av->eth_hdr.vlan_tag) >> 13;
+2 -4
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
··· 101 101 attr->max_srq_sge = dev->attr.max_srq_sge; 102 102 attr->max_srq_wr = dev->attr.max_rqe; 103 103 attr->local_ca_ack_delay = dev->attr.local_ca_ack_delay; 104 - attr->max_fast_reg_page_list_len = 0; 104 + attr->max_fast_reg_page_list_len = dev->attr.max_pages_per_frmr; 105 105 attr->max_pkeys = 1; 106 106 return 0; 107 107 } ··· 2846 2846 if (cq->first_arm) { 2847 2847 ocrdma_ring_cq_db(dev, cq_id, arm_needed, sol_needed, 0); 2848 2848 cq->first_arm = false; 2849 - goto skip_defer; 2850 2849 } 2851 - cq->deferred_arm = true; 2852 2850 2853 - skip_defer: 2851 + cq->deferred_arm = true; 2854 2852 cq->deferred_sol = sol_needed; 2855 2853 spin_unlock_irqrestore(&cq->cq_lock, flags); 2856 2854
+2 -1
drivers/infiniband/hw/qib/qib_debugfs.c
··· 193 193 struct qib_qp_iter *iter; 194 194 loff_t n = *pos; 195 195 196 + rcu_read_lock(); 196 197 iter = qib_qp_iter_init(s->private); 197 198 if (!iter) 198 199 return NULL; ··· 225 224 226 225 static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) 227 226 { 228 - /* nothing for now */ 227 + rcu_read_unlock(); 229 228 } 230 229 231 230 static int _qp_stats_seq_show(struct seq_file *s, void *iter_ptr)
-8
drivers/infiniband/hw/qib/qib_qp.c
··· 1325 1325 struct qib_qp *pqp = iter->qp; 1326 1326 struct qib_qp *qp; 1327 1327 1328 - rcu_read_lock(); 1329 1328 for (; n < dev->qp_table_size; n++) { 1330 1329 if (pqp) 1331 1330 qp = rcu_dereference(pqp->next); ··· 1332 1333 qp = rcu_dereference(dev->qp_table[n]); 1333 1334 pqp = qp; 1334 1335 if (qp) { 1335 - if (iter->qp) 1336 - atomic_dec(&iter->qp->refcount); 1337 - atomic_inc(&qp->refcount); 1338 - rcu_read_unlock(); 1339 1336 iter->qp = qp; 1340 1337 iter->n = n; 1341 1338 return 0; 1342 1339 } 1343 1340 } 1344 - rcu_read_unlock(); 1345 - if (iter->qp) 1346 - atomic_dec(&iter->qp->refcount); 1347 1341 return ret; 1348 1342 } 1349 1343
+3 -3
drivers/infiniband/hw/qib/qib_user_pages.c
··· 52 52 * Call with current->mm->mmap_sem held. 53 53 */ 54 54 static int __qib_get_user_pages(unsigned long start_page, size_t num_pages, 55 - struct page **p, struct vm_area_struct **vma) 55 + struct page **p) 56 56 { 57 57 unsigned long lock_limit; 58 58 size_t got; ··· 69 69 ret = get_user_pages(current, current->mm, 70 70 start_page + got * PAGE_SIZE, 71 71 num_pages - got, 1, 1, 72 - p + got, vma); 72 + p + got, NULL); 73 73 if (ret < 0) 74 74 goto bail_release; 75 75 } ··· 136 136 137 137 down_write(&current->mm->mmap_sem); 138 138 139 - ret = __qib_get_user_pages(start_page, num_pages, p, NULL); 139 + ret = __qib_get_user_pages(start_page, num_pages, p); 140 140 141 141 up_write(&current->mm->mmap_sem); 142 142
+1 -9
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
··· 529 529 port_attr.state); 530 530 return; 531 531 } 532 + priv->local_lid = port_attr.lid; 532 533 533 534 if (ib_query_gid(priv->ca, priv->port, 0, &priv->local_gid)) 534 535 ipoib_warn(priv, "ib_query_gid() failed\n"); 535 536 else 536 537 memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, sizeof (union ib_gid)); 537 - 538 - { 539 - struct ib_port_attr attr; 540 - 541 - if (!ib_query_port(priv->ca, priv->port, &attr)) 542 - priv->local_lid = attr.lid; 543 - else 544 - ipoib_warn(priv, "ib_query_port failed\n"); 545 - } 546 538 547 539 if (!priv->broadcast) { 548 540 struct ipoib_mcast *broadcast;
+14 -5
drivers/infiniband/ulp/iser/iscsi_iser.c
··· 344 344 int is_leading) 345 345 { 346 346 struct iscsi_conn *conn = cls_conn->dd_data; 347 - struct iscsi_session *session; 348 347 struct iser_conn *ib_conn; 349 348 struct iscsi_endpoint *ep; 350 349 int error; ··· 362 363 } 363 364 ib_conn = ep->dd_data; 364 365 365 - session = conn->session; 366 - if (iser_alloc_rx_descriptors(ib_conn, session)) 367 - return -ENOMEM; 366 + mutex_lock(&ib_conn->state_mutex); 367 + if (ib_conn->state != ISER_CONN_UP) { 368 + error = -EINVAL; 369 + iser_err("iser_conn %p state is %d, teardown started\n", 370 + ib_conn, ib_conn->state); 371 + goto out; 372 + } 373 + 374 + error = iser_alloc_rx_descriptors(ib_conn, conn->session); 375 + if (error) 376 + goto out; 368 377 369 378 /* binds the iSER connection retrieved from the previously 370 379 * connected ep_handle to the iSCSI layer connection. exchanges ··· 382 375 conn->dd_data = ib_conn; 383 376 ib_conn->iscsi_conn = conn; 384 377 385 - return 0; 378 + out: 379 + mutex_unlock(&ib_conn->state_mutex); 380 + return error; 386 381 } 387 382 388 383 static int
+1 -1
drivers/infiniband/ulp/iser/iscsi_iser.h
··· 69 69 70 70 #define DRV_NAME "iser" 71 71 #define PFX DRV_NAME ": " 72 - #define DRV_VER "1.4" 72 + #define DRV_VER "1.4.1" 73 73 74 74 #define iser_dbg(fmt, arg...) \ 75 75 do { \
+14 -10
drivers/infiniband/ulp/iser/iser_verbs.c
··· 73 73 { 74 74 struct iser_cq_desc *cq_desc; 75 75 struct ib_device_attr *dev_attr = &device->dev_attr; 76 - int ret, i, j; 76 + int ret, i; 77 77 78 78 ret = ib_query_device(device->ib_device, dev_attr); 79 79 if (ret) { ··· 125 125 iser_cq_event_callback, 126 126 (void *)&cq_desc[i], 127 127 ISER_MAX_RX_CQ_LEN, i); 128 - if (IS_ERR(device->rx_cq[i])) 128 + if (IS_ERR(device->rx_cq[i])) { 129 + device->rx_cq[i] = NULL; 129 130 goto cq_err; 131 + } 130 132 131 133 device->tx_cq[i] = ib_create_cq(device->ib_device, 132 134 NULL, iser_cq_event_callback, 133 135 (void *)&cq_desc[i], 134 136 ISER_MAX_TX_CQ_LEN, i); 135 137 136 - if (IS_ERR(device->tx_cq[i])) 138 + if (IS_ERR(device->tx_cq[i])) { 139 + device->tx_cq[i] = NULL; 137 140 goto cq_err; 141 + } 138 142 139 143 if (ib_req_notify_cq(device->rx_cq[i], IB_CQ_NEXT_COMP)) 140 144 goto cq_err; ··· 164 160 handler_err: 165 161 ib_dereg_mr(device->mr); 166 162 dma_mr_err: 167 - for (j = 0; j < device->cqs_used; j++) 168 - tasklet_kill(&device->cq_tasklet[j]); 163 + for (i = 0; i < device->cqs_used; i++) 164 + tasklet_kill(&device->cq_tasklet[i]); 169 165 cq_err: 170 - for (j = 0; j < i; j++) { 171 - if (device->tx_cq[j]) 172 - ib_destroy_cq(device->tx_cq[j]); 173 - if (device->rx_cq[j]) 174 - ib_destroy_cq(device->rx_cq[j]); 166 + for (i = 0; i < device->cqs_used; i++) { 167 + if (device->tx_cq[i]) 168 + ib_destroy_cq(device->tx_cq[i]); 169 + if (device->rx_cq[i]) 170 + ib_destroy_cq(device->rx_cq[i]); 175 171 } 176 172 ib_dealloc_pd(device->pd); 177 173 pd_err:
+22 -11
drivers/net/ethernet/mellanox/mlx4/mr.c
··· 298 298 MLX4_CMD_TIME_CLASS_B, MLX4_CMD_WRAPPED); 299 299 } 300 300 301 + /* Must protect against concurrent access */ 301 302 int mlx4_mr_hw_get_mpt(struct mlx4_dev *dev, struct mlx4_mr *mmr, 302 303 struct mlx4_mpt_entry ***mpt_entry) 303 304 { ··· 306 305 int key = key_to_hw_index(mmr->key) & (dev->caps.num_mpts - 1); 307 306 struct mlx4_cmd_mailbox *mailbox = NULL; 308 307 309 - /* Make sure that at this point we have single-threaded access only */ 310 - 311 308 if (mmr->enabled != MLX4_MPT_EN_HW) 312 309 return -EINVAL; 313 310 314 311 err = mlx4_HW2SW_MPT(dev, NULL, key); 315 - 316 312 if (err) { 317 313 mlx4_warn(dev, "HW2SW_MPT failed (%d).", err); 318 314 mlx4_warn(dev, "Most likely the MR has MWs bound to it.\n"); ··· 331 333 0, MLX4_CMD_QUERY_MPT, 332 334 MLX4_CMD_TIME_CLASS_B, 333 335 MLX4_CMD_WRAPPED); 334 - 335 336 if (err) 336 337 goto free_mailbox; 337 338 ··· 375 378 err = mlx4_SW2HW_MPT(dev, mailbox, key); 376 379 } 377 380 378 - mmr->pd = be32_to_cpu((*mpt_entry)->pd_flags) & MLX4_MPT_PD_MASK; 379 - if (!err) 381 + if (!err) { 382 + mmr->pd = be32_to_cpu((*mpt_entry)->pd_flags) & MLX4_MPT_PD_MASK; 380 383 mmr->enabled = MLX4_MPT_EN_HW; 384 + } 381 385 return err; 382 386 } 383 387 EXPORT_SYMBOL_GPL(mlx4_mr_hw_write_mpt); ··· 398 400 int mlx4_mr_hw_change_pd(struct mlx4_dev *dev, struct mlx4_mpt_entry *mpt_entry, 399 401 u32 pdn) 400 402 { 401 - u32 pd_flags = be32_to_cpu(mpt_entry->pd_flags); 403 + u32 pd_flags = be32_to_cpu(mpt_entry->pd_flags) & ~MLX4_MPT_PD_MASK; 402 404 /* The wrapper function will put the slave's id here */ 403 405 if (mlx4_is_mfunc(dev)) 404 406 pd_flags &= ~MLX4_MPT_PD_VF_MASK; 405 - mpt_entry->pd_flags = cpu_to_be32((pd_flags & ~MLX4_MPT_PD_MASK) | 407 + 408 + mpt_entry->pd_flags = cpu_to_be32(pd_flags | 406 409 (pdn & MLX4_MPT_PD_MASK) 407 410 | MLX4_MPT_PD_FLAG_EN_INV); 408 411 return 0; ··· 599 600 { 600 601 int err; 601 602 602 - mpt_entry->start = cpu_to_be64(mr->iova); 603 - mpt_entry->length = cpu_to_be64(mr->size); 604 - mpt_entry->entity_size = cpu_to_be32(mr->mtt.page_shift); 603 + mpt_entry->start = cpu_to_be64(iova); 604 + mpt_entry->length = cpu_to_be64(size); 605 + mpt_entry->entity_size = cpu_to_be32(page_shift); 605 606 606 607 err = mlx4_mtt_init(dev, npages, page_shift, &mr->mtt); 607 608 if (err) 608 609 return err; 609 610 611 + mpt_entry->pd_flags &= cpu_to_be32(MLX4_MPT_PD_MASK | 612 + MLX4_MPT_PD_FLAG_EN_INV); 613 + mpt_entry->flags &= cpu_to_be32(MLX4_MPT_FLAG_FREE | 614 + MLX4_MPT_FLAG_SW_OWNS); 610 615 if (mr->mtt.order < 0) { 611 616 mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_PHYSICAL); 612 617 mpt_entry->mtt_addr = 0; ··· 619 616 &mr->mtt)); 620 617 if (mr->mtt.page_shift == 0) 621 618 mpt_entry->mtt_sz = cpu_to_be32(1 << mr->mtt.order); 619 + } 620 + if (mr->mtt.order >= 0 && mr->mtt.page_shift == 0) { 621 + /* fast register MR in free state */ 622 + mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_FREE); 623 + mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG | 624 + MLX4_MPT_PD_FLAG_RAE); 625 + } else { 626 + mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS); 622 627 } 623 628 mr->enabled = MLX4_MPT_EN_SW; 624 629
+7 -4
drivers/net/ethernet/mellanox/mlx4/port.c
··· 103 103 int i; 104 104 105 105 for (i = 0; i < MLX4_MAX_MAC_NUM; i++) { 106 - if ((mac & MLX4_MAC_MASK) == 106 + if (table->refs[i] && 107 + (MLX4_MAC_MASK & mac) == 107 108 (MLX4_MAC_MASK & be64_to_cpu(table->entries[i]))) 108 109 return i; 109 110 } ··· 166 165 167 166 mutex_lock(&table->mutex); 168 167 for (i = 0; i < MLX4_MAX_MAC_NUM; i++) { 169 - if (free < 0 && !table->entries[i]) { 170 - free = i; 168 + if (!table->refs[i]) { 169 + if (free < 0) 170 + free = i; 171 171 continue; 172 172 } 173 173 174 - if (mac == (MLX4_MAC_MASK & be64_to_cpu(table->entries[i]))) { 174 + if ((MLX4_MAC_MASK & mac) == 175 + (MLX4_MAC_MASK & be64_to_cpu(table->entries[i]))) { 175 176 /* MAC already registered, increment ref count */ 176 177 err = i; 177 178 ++table->refs[i];