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

RDMA/ipoib: Use dev_addr_mod()

Commit 406f42fa0d3c ("net-next: When a bond have a massive amount of
VLANs...") introduced a rbtree for faster Ethernet address look up. To
maintain netdev->dev_addr in this tree we need to make all the writes to
it got through appropriate helpers.

Link: https://lore.kernel.org/r/20211019182604.1441387-2-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

authored by

Jakub Kicinski and committed by
Jason Gunthorpe
10f7b9bc 97ad8c8c

+16 -14
+3 -1
drivers/infiniband/ulp/ipoib/ipoib_cm.c
··· 1583 1583 { 1584 1584 struct ipoib_dev_priv *priv = ipoib_priv(dev); 1585 1585 int max_srq_sge, i; 1586 + u8 addr; 1586 1587 1587 1588 INIT_LIST_HEAD(&priv->cm.passive_ids); 1588 1589 INIT_LIST_HEAD(&priv->cm.reap_list); ··· 1637 1636 } 1638 1637 } 1639 1638 1640 - priv->dev->dev_addr[0] = IPOIB_FLAGS_RC; 1639 + addr = IPOIB_FLAGS_RC; 1640 + dev_addr_mod(dev, 0, &addr, 1); 1641 1641 return 0; 1642 1642 } 1643 1643
+4 -5
drivers/infiniband/ulp/ipoib/ipoib_ib.c
··· 1057 1057 { 1058 1058 union ib_gid search_gid; 1059 1059 union ib_gid gid0; 1060 - union ib_gid *netdev_gid; 1061 1060 int err; 1062 1061 u16 index; 1063 1062 u32 port; 1064 1063 bool ret = false; 1065 1064 1066 - netdev_gid = (union ib_gid *)(priv->dev->dev_addr + 4); 1067 1065 if (rdma_query_gid(priv->ca, priv->port, 0, &gid0)) 1068 1066 return false; 1069 1067 ··· 1071 1073 * to do it later 1072 1074 */ 1073 1075 priv->local_gid.global.subnet_prefix = gid0.global.subnet_prefix; 1074 - netdev_gid->global.subnet_prefix = gid0.global.subnet_prefix; 1076 + dev_addr_mod(priv->dev, 4, (u8 *)&gid0.global.subnet_prefix, 1077 + sizeof(gid0.global.subnet_prefix)); 1075 1078 search_gid.global.subnet_prefix = gid0.global.subnet_prefix; 1076 1079 1077 1080 search_gid.global.interface_id = priv->local_gid.global.interface_id; ··· 1134 1135 if (!test_bit(IPOIB_FLAG_DEV_ADDR_CTRL, &priv->flags)) { 1135 1136 memcpy(&priv->local_gid, &gid0, 1136 1137 sizeof(priv->local_gid)); 1137 - memcpy(priv->dev->dev_addr + 4, &gid0, 1138 - sizeof(priv->local_gid)); 1138 + dev_addr_mod(priv->dev, 4, (u8 *)&gid0, 1139 + sizeof(priv->local_gid)); 1139 1140 ret = true; 1140 1141 } 1141 1142 }
+9 -8
drivers/infiniband/ulp/ipoib/ipoib_main.c
··· 1696 1696 static int ipoib_dev_init_default(struct net_device *dev) 1697 1697 { 1698 1698 struct ipoib_dev_priv *priv = ipoib_priv(dev); 1699 + u8 addr_mod[3]; 1699 1700 1700 1701 ipoib_napi_add(dev); 1701 1702 ··· 1724 1723 } 1725 1724 1726 1725 /* after qp created set dev address */ 1727 - priv->dev->dev_addr[1] = (priv->qp->qp_num >> 16) & 0xff; 1728 - priv->dev->dev_addr[2] = (priv->qp->qp_num >> 8) & 0xff; 1729 - priv->dev->dev_addr[3] = (priv->qp->qp_num) & 0xff; 1726 + addr_mod[0] = (priv->qp->qp_num >> 16) & 0xff; 1727 + addr_mod[1] = (priv->qp->qp_num >> 8) & 0xff; 1728 + addr_mod[2] = (priv->qp->qp_num) & 0xff; 1729 + dev_addr_mod(priv->dev, 1, addr_mod, sizeof(addr_mod)); 1730 1730 1731 1731 return 0; 1732 1732 ··· 1888 1886 priv->ca->name, priv->port, result); 1889 1887 return result; 1890 1888 } 1891 - memcpy(priv->dev->dev_addr + 4, priv->local_gid.raw, 1892 - sizeof(union ib_gid)); 1889 + dev_addr_mod(priv->dev, 4, priv->local_gid.raw, sizeof(union ib_gid)); 1893 1890 1894 1891 SET_NETDEV_DEV(priv->dev, priv->ca->dev.parent); 1895 1892 priv->dev->dev_port = priv->port - 1; ··· 1909 1908 memcpy(&priv->local_gid, priv->dev->dev_addr + 4, 1910 1909 sizeof(priv->local_gid)); 1911 1910 else { 1912 - memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, 1913 - INFINIBAND_ALEN); 1911 + __dev_addr_set(priv->dev, ppriv->dev->dev_addr, 1912 + INFINIBAND_ALEN); 1914 1913 memcpy(&priv->local_gid, &ppriv->local_gid, 1915 1914 sizeof(priv->local_gid)); 1916 1915 } ··· 2327 2326 memcpy(&priv->local_gid.global.interface_id, 2328 2327 &gid->global.interface_id, 2329 2328 sizeof(gid->global.interface_id)); 2330 - memcpy(netdev->dev_addr + 4, &priv->local_gid, sizeof(priv->local_gid)); 2329 + dev_addr_mod(netdev, 4, (u8 *)&priv->local_gid, sizeof(priv->local_gid)); 2331 2330 clear_bit(IPOIB_FLAG_DEV_ADDR_SET, &priv->flags); 2332 2331 2333 2332 netif_addr_unlock_bh(netdev);