On Tue, Dec 18, 2018 at 02:15:56PM +0200, Leon Romanovsky wrote: > From: Parav Pandit <parav@xxxxxxxxxxxx> > > Introduce and use rdma_device_to_ibdev() API for those drivers which are > registering one sysfs group and also use in ib_core. > > In subsequent patch, device->provider_ibdev one-to-one mapping is no > longer holds true during accessing sysfs entries. > Therefore, introduce an API rdma_device_to_ibdev() that provides such > information. > > Signed-off-by: Parav Pandit <parav@xxxxxxxxxxxx> > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > drivers/infiniband/core/sysfs.c | 12 ++++----- > drivers/infiniband/hw/bnxt_re/main.c | 6 +++-- > drivers/infiniband/hw/cxgb3/iwch_provider.c | 14 ++++++----- > drivers/infiniband/hw/cxgb4/provider.c | 14 ++++++----- > drivers/infiniband/hw/hfi1/sysfs.c | 16 ++++++------ > drivers/infiniband/hw/i40iw/i40iw_verbs.c | 5 ++-- > drivers/infiniband/hw/mlx4/main.c | 7 +++--- > drivers/infiniband/hw/mlx5/main.c | 13 ++++++---- > drivers/infiniband/hw/mthca/mthca_provider.c | 9 ++++--- > drivers/infiniband/hw/nes/nes_verbs.c | 2 +- > drivers/infiniband/hw/ocrdma/ocrdma_main.c | 6 +++-- > drivers/infiniband/hw/qedr/main.c | 3 ++- > drivers/infiniband/hw/qib/qib_sysfs.c | 18 +++++++------- > drivers/infiniband/hw/usnic/usnic_ib_sysfs.c | 26 +++++++++----------- > drivers/infiniband/sw/rxe/rxe_verbs.c | 4 +-- > include/rdma/ib_verbs.h | 22 +++++++++++++++++ > 16 files changed, 105 insertions(+), 72 deletions(-) > > diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c > index 9b6eef793475..043e2d9c6d73 100644 > +++ b/drivers/infiniband/core/sysfs.c > @@ -1189,7 +1189,7 @@ static int add_port(struct ib_device *device, int port_num, > static ssize_t node_type_show(struct device *device, > struct device_attribute *attr, char *buf) > { > - struct ib_device *dev = container_of(device, struct ib_device, dev); > + struct ib_device *dev = rdma_device_to_ibdev(device); > > switch (dev->node_type) { > case RDMA_NODE_IB_CA: return sprintf(buf, "%d: CA\n", dev->node_type); > @@ -1206,7 +1206,7 @@ static DEVICE_ATTR_RO(node_type); > static ssize_t sys_image_guid_show(struct device *device, > struct device_attribute *dev_attr, char *buf) > { > - struct ib_device *dev = container_of(device, struct ib_device, dev); > + struct ib_device *dev = rdma_device_to_ibdev(device); > > return sprintf(buf, "%04x:%04x:%04x:%04x\n", > be16_to_cpu(((__be16 *) &dev->attrs.sys_image_guid)[0]), > @@ -1219,7 +1219,7 @@ static DEVICE_ATTR_RO(sys_image_guid); > static ssize_t node_guid_show(struct device *device, > struct device_attribute *attr, char *buf) > { > - struct ib_device *dev = container_of(device, struct ib_device, dev); > + struct ib_device *dev = rdma_device_to_ibdev(device); > > return sprintf(buf, "%04x:%04x:%04x:%04x\n", > be16_to_cpu(((__be16 *) &dev->node_guid)[0]), > @@ -1232,7 +1232,7 @@ static DEVICE_ATTR_RO(node_guid); > static ssize_t node_desc_show(struct device *device, > struct device_attribute *attr, char *buf) > { > - struct ib_device *dev = container_of(device, struct ib_device, dev); > + struct ib_device *dev = rdma_device_to_ibdev(device); > > return sprintf(buf, "%.64s\n", dev->node_desc); > } > @@ -1241,7 +1241,7 @@ static ssize_t node_desc_store(struct device *device, > struct device_attribute *attr, > const char *buf, size_t count) > { > - struct ib_device *dev = container_of(device, struct ib_device, dev); > + struct ib_device *dev = rdma_device_to_ibdev(device); > struct ib_device_modify desc = {}; > int ret; > > @@ -1260,7 +1260,7 @@ static DEVICE_ATTR_RW(node_desc); > static ssize_t fw_ver_show(struct device *device, struct device_attribute *attr, > char *buf) > { > - struct ib_device *dev = container_of(device, struct ib_device, dev); > + struct ib_device *dev = rdma_device_to_ibdev(device); > > ib_get_device_fw_str(dev, buf); > strlcat(buf, "\n", IB_FW_VERSION_NAME_MAX); > diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c > index 31cbef57a19b..56ad4882f381 100644 > +++ b/drivers/infiniband/hw/bnxt_re/main.c > @@ -538,7 +538,8 @@ static struct bnxt_en_dev *bnxt_re_dev_probe(struct net_device *netdev) > static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr, > char *buf) > { > - struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev); > + struct bnxt_re_dev *rdev = > + rdma_device_to_drv_device(device, struct bnxt_re_dev, ibdev); > > return scnprintf(buf, PAGE_SIZE, "0x%x\n", rdev->en_dev->pdev->vendor); > } > @@ -547,7 +548,8 @@ static DEVICE_ATTR_RO(hw_rev); > static ssize_t hca_type_show(struct device *device, > struct device_attribute *attr, char *buf) > { > - struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev); > + struct bnxt_re_dev *rdev = > + rdma_device_to_drv_device(device, struct bnxt_re_dev, ibdev); > > return scnprintf(buf, PAGE_SIZE, "%s\n", rdev->ibdev.node_desc); > } > diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c > index 7a1dc83ba588..a44d431a158a 100644 > +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c > @@ -1130,8 +1130,9 @@ static int iwch_query_port(struct ib_device *ibdev, > static ssize_t hw_rev_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev, > - ibdev.dev); > + struct iwch_dev *iwch_dev = > + rdma_device_to_drv_device(dev, struct iwch_dev, ibdev); > + > pr_debug("%s dev 0x%p\n", __func__, dev); > return sprintf(buf, "%d\n", iwch_dev->rdev.t3cdev_p->type); > } > @@ -1140,8 +1141,8 @@ static DEVICE_ATTR_RO(hw_rev); > static ssize_t hca_type_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev, > - ibdev.dev); > + struct iwch_dev *iwch_dev = > + rdma_device_to_drv_device(dev, struct iwch_dev, ibdev); > struct ethtool_drvinfo info; > struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev; > > @@ -1154,8 +1155,9 @@ static DEVICE_ATTR_RO(hca_type); > static ssize_t board_id_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - struct iwch_dev *iwch_dev = container_of(dev, struct iwch_dev, > - ibdev.dev); > + struct iwch_dev *iwch_dev = > + rdma_device_to_drv_device(dev, struct iwch_dev, ibdev); > + > pr_debug("%s dev 0x%p\n", __func__, dev); > return sprintf(buf, "%x.%x\n", iwch_dev->rdev.rnic_info.pdev->vendor, > iwch_dev->rdev.rnic_info.pdev->device); > diff --git a/drivers/infiniband/hw/cxgb4/provider.c b/drivers/infiniband/hw/cxgb4/provider.c > index 586b0c37481f..fd547e9cf21b 100644 > +++ b/drivers/infiniband/hw/cxgb4/provider.c > @@ -376,8 +376,9 @@ static int c4iw_query_port(struct ib_device *ibdev, u8 port, > static ssize_t hw_rev_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, > - ibdev.dev); > + struct c4iw_dev *c4iw_dev = > + rdma_device_to_drv_device(dev, struct c4iw_dev, ibdev); > + > pr_debug("dev 0x%p\n", dev); > return sprintf(buf, "%d\n", > CHELSIO_CHIP_RELEASE(c4iw_dev->rdev.lldi.adapter_type)); > @@ -387,8 +388,8 @@ static DEVICE_ATTR_RO(hw_rev); > static ssize_t hca_type_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, > - ibdev.dev); > + struct c4iw_dev *c4iw_dev = > + rdma_device_to_drv_device(dev, struct c4iw_dev, ibdev); > struct ethtool_drvinfo info; > struct net_device *lldev = c4iw_dev->rdev.lldi.ports[0]; > > @@ -401,8 +402,9 @@ static DEVICE_ATTR_RO(hca_type); > static ssize_t board_id_show(struct device *dev, struct device_attribute *attr, > char *buf) > { > - struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, > - ibdev.dev); > + struct c4iw_dev *c4iw_dev = > + rdma_device_to_drv_device(dev, struct c4iw_dev, ibdev); > + > pr_debug("dev 0x%p\n", dev); > return sprintf(buf, "%x.%x\n", c4iw_dev->rdev.lldi.pdev->vendor, > c4iw_dev->rdev.lldi.pdev->device); > diff --git a/drivers/infiniband/hw/hfi1/sysfs.c b/drivers/infiniband/hw/hfi1/sysfs.c > index 2be513d4c9da..90f62c4bddba 100644 > +++ b/drivers/infiniband/hw/hfi1/sysfs.c > @@ -498,7 +498,7 @@ static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr, > char *buf) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > > return sprintf(buf, "%x\n", dd_from_dev(dev)->minrev); > } > @@ -508,7 +508,7 @@ static ssize_t board_id_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > struct hfi1_devdata *dd = dd_from_dev(dev); > int ret; > > @@ -524,7 +524,7 @@ static ssize_t boardversion_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > struct hfi1_devdata *dd = dd_from_dev(dev); > > /* The string printed here is already newline-terminated. */ > @@ -536,7 +536,7 @@ static ssize_t nctxts_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > struct hfi1_devdata *dd = dd_from_dev(dev); > > /* > @@ -555,7 +555,7 @@ static ssize_t nfreectxts_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > struct hfi1_devdata *dd = dd_from_dev(dev); > > /* Return the number of free user ports (contexts) available. */ > @@ -567,7 +567,7 @@ static ssize_t serial_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > struct hfi1_devdata *dd = dd_from_dev(dev); > > return scnprintf(buf, PAGE_SIZE, "%s", dd->serial); > @@ -579,7 +579,7 @@ static ssize_t chip_reset_store(struct device *device, > size_t count) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > struct hfi1_devdata *dd = dd_from_dev(dev); > int ret; > > @@ -609,7 +609,7 @@ static ssize_t tempsense_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct hfi1_ibdev *dev = > - container_of(device, struct hfi1_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct hfi1_ibdev, rdi.ibdev); > struct hfi1_devdata *dd = dd_from_dev(dev); > struct hfi1_temp temp; > int ret; > diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c > index 9e42ac2db3ca..54ade0cfce50 100644 > +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c > @@ -2140,9 +2140,8 @@ static int i40iw_dereg_mr(struct ib_mr *ib_mr) > static ssize_t hw_rev_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - struct i40iw_ib_device *iwibdev = container_of(dev, > - struct i40iw_ib_device, > - ibdev.dev); > + struct i40iw_ib_device *iwibdev = > + rdma_device_to_drv_device(dev, struct i40iw_ib_device, ibdev); > u32 hw_rev = iwibdev->iwdev->sc_dev.hw_rev; > > return sprintf(buf, "%x\n", hw_rev); > diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c > index 1f15ec3e2b83..5dbf1030098b 100644 > +++ b/drivers/infiniband/hw/mlx4/main.c > @@ -2043,7 +2043,7 @@ static ssize_t hca_type_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx4_ib_dev *dev = > - container_of(device, struct mlx4_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx4_ib_dev, ib_dev); > return sprintf(buf, "MT%d\n", dev->dev->persist->pdev->device); > } > static DEVICE_ATTR_RO(hca_type); > @@ -2052,7 +2052,7 @@ static ssize_t hw_rev_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx4_ib_dev *dev = > - container_of(device, struct mlx4_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx4_ib_dev, ib_dev); > return sprintf(buf, "%x\n", dev->dev->rev_id); > } > static DEVICE_ATTR_RO(hw_rev); > @@ -2061,7 +2061,8 @@ static ssize_t board_id_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx4_ib_dev *dev = > - container_of(device, struct mlx4_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx4_ib_dev, ib_dev); > + > return sprintf(buf, "%.*s\n", MLX4_BOARD_ID_LEN, > dev->dev->board_id); > } > diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c > index b2fd5c0fb761..4430f8ad9e67 100644 > +++ b/drivers/infiniband/hw/mlx5/main.c > @@ -4106,7 +4106,7 @@ static ssize_t fw_pages_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx5_ib_dev *dev = > - container_of(device, struct mlx5_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx5_ib_dev, ib_dev); > > return sprintf(buf, "%d\n", dev->mdev->priv.fw_pages); > } > @@ -4116,7 +4116,7 @@ static ssize_t reg_pages_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx5_ib_dev *dev = > - container_of(device, struct mlx5_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx5_ib_dev, ib_dev); > > return sprintf(buf, "%d\n", atomic_read(&dev->mdev->priv.reg_pages)); > } > @@ -4126,7 +4126,8 @@ static ssize_t hca_type_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx5_ib_dev *dev = > - container_of(device, struct mlx5_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx5_ib_dev, ib_dev); > + > return sprintf(buf, "MT%d\n", dev->mdev->pdev->device); > } > static DEVICE_ATTR_RO(hca_type); > @@ -4135,7 +4136,8 @@ static ssize_t hw_rev_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx5_ib_dev *dev = > - container_of(device, struct mlx5_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx5_ib_dev, ib_dev); > + > return sprintf(buf, "%x\n", dev->mdev->rev_id); > } > static DEVICE_ATTR_RO(hw_rev); > @@ -4144,7 +4146,8 @@ static ssize_t board_id_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mlx5_ib_dev *dev = > - container_of(device, struct mlx5_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mlx5_ib_dev, ib_dev); > + > return sprintf(buf, "%.*s\n", MLX5_BOARD_ID_LEN, > dev->mdev->board_id); > } > diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c > index c697ec54ea5f..2153ec032749 100644 > +++ b/drivers/infiniband/hw/mthca/mthca_provider.c > @@ -1080,7 +1080,8 @@ static ssize_t hw_rev_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mthca_dev *dev = > - container_of(device, struct mthca_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mthca_dev, ib_dev); > + > return sprintf(buf, "%x\n", dev->rev_id); > } > static DEVICE_ATTR_RO(hw_rev); > @@ -1089,7 +1090,8 @@ static ssize_t hca_type_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mthca_dev *dev = > - container_of(device, struct mthca_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mthca_dev, ib_dev); > + > switch (dev->pdev->device) { > case PCI_DEVICE_ID_MELLANOX_TAVOR: > return sprintf(buf, "MT23108\n"); > @@ -1110,7 +1112,8 @@ static ssize_t board_id_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct mthca_dev *dev = > - container_of(device, struct mthca_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct mthca_dev, ib_dev); > + > return sprintf(buf, "%.*s\n", MTHCA_BOARD_ID_LEN, dev->board_id); > } > static DEVICE_ATTR_RO(board_id); > diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c > index f9d510431900..599e30a4c678 100644 > +++ b/drivers/infiniband/hw/nes/nes_verbs.c > @@ -2560,7 +2560,7 @@ static ssize_t hw_rev_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > struct nes_ib_device *nesibdev = > - container_of(dev, struct nes_ib_device, ibdev.dev); > + rdma_device_to_drv_device(dev, struct nes_ib_device, ibdev); > struct nes_vnic *nesvnic = nesibdev->nesvnic; > > nes_debug(NES_DBG_INIT, "\n"); > diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniband/hw/ocrdma/ocrdma_main.c > index 1f393842453a..0e8380ef3511 100644 > +++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c > @@ -118,7 +118,8 @@ static void get_dev_fw_str(struct ib_device *device, char *str) > static ssize_t hw_rev_show(struct device *device, > struct device_attribute *attr, char *buf) > { > - struct ocrdma_dev *dev = dev_get_drvdata(device); > + struct ocrdma_dev *dev = > + rdma_device_to_drv_device(device, struct ocrdma_dev, ibdev); > > return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->nic_info.pdev->vendor); > } > @@ -127,7 +128,8 @@ static DEVICE_ATTR_RO(hw_rev); > static ssize_t hca_type_show(struct device *device, > struct device_attribute *attr, char *buf) > { > - struct ocrdma_dev *dev = dev_get_drvdata(device); > + struct ocrdma_dev *dev = > + rdma_device_to_drv_device(device, struct ocrdma_dev, ibdev); > > return scnprintf(buf, PAGE_SIZE, "%s\n", &dev->model_number[0]); > } > diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c > index 75940e2a8791..88be4144ccc7 100644 > +++ b/drivers/infiniband/hw/qedr/main.c > @@ -137,7 +137,8 @@ static int qedr_iw_port_immutable(struct ib_device *ibdev, u8 port_num, > static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr, > char *buf) > { > - struct qedr_dev *dev = dev_get_drvdata(device); > + struct qedr_dev *dev = > + rdma_device_to_drv_device(device, struct qedr_dev, ibdev); > > return scnprintf(buf, PAGE_SIZE, "0x%x\n", dev->pdev->vendor); > } > diff --git a/drivers/infiniband/hw/qib/qib_sysfs.c b/drivers/infiniband/hw/qib/qib_sysfs.c > index 1cf4ca3f23e3..905206a0c2d5 100644 > +++ b/drivers/infiniband/hw/qib/qib_sysfs.c > @@ -555,7 +555,7 @@ static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr, > char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > > return sprintf(buf, "%x\n", dd_from_dev(dev)->minrev); > } > @@ -565,7 +565,7 @@ static ssize_t hca_type_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > int ret; > > @@ -590,7 +590,7 @@ static ssize_t boardversion_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > > /* The string printed here is already newline-terminated. */ > @@ -602,7 +602,7 @@ static ssize_t localbus_info_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > > /* The string printed here is already newline-terminated. */ > @@ -614,7 +614,7 @@ static ssize_t nctxts_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > > /* Return the number of user ports (contexts) available. */ > @@ -630,7 +630,7 @@ static ssize_t nfreectxts_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > > /* Return the number of free user ports (contexts) available. */ > @@ -642,7 +642,7 @@ static ssize_t serial_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > > buf[sizeof(dd->serial)] = '\0'; > @@ -657,7 +657,7 @@ static ssize_t chip_reset_store(struct device *device, > size_t count) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > int ret; > > @@ -679,7 +679,7 @@ static ssize_t tempsense_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct qib_ibdev *dev = > - container_of(device, struct qib_ibdev, rdi.ibdev.dev); > + rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); > struct qib_devdata *dd = dd_from_dev(dev); > int ret; > int idx; > diff --git a/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c > index a7e4b2ccfaf8..c85d48ae7442 100644 > +++ b/drivers/infiniband/hw/usnic/usnic_ib_sysfs.c > @@ -50,7 +50,7 @@ static ssize_t board_id_show(struct device *device, > struct device_attribute *attr, char *buf) > { > struct usnic_ib_dev *us_ibdev = > - container_of(device, struct usnic_ib_dev, ib_dev.dev); > + rdma_device_to_drv_device(device, struct usnic_ib_dev, ib_dev); > unsigned short subsystem_device_id; > > mutex_lock(&us_ibdev->usdev_lock); > @@ -67,14 +67,13 @@ static DEVICE_ATTR_RO(board_id); > static ssize_t > config_show(struct device *device, struct device_attribute *attr, char *buf) > { > - struct usnic_ib_dev *us_ibdev; > + struct usnic_ib_dev *us_ibdev = > + rdma_device_to_drv_device(device, struct usnic_ib_dev, ib_dev); > char *ptr; > unsigned left; > unsigned n; > enum usnic_vnic_res_type res_type; > > - us_ibdev = container_of(device, struct usnic_ib_dev, ib_dev.dev); > - > /* Buffer space limit is 1 page */ > ptr = buf; > left = PAGE_SIZE; > @@ -130,9 +129,8 @@ static DEVICE_ATTR_RO(config); > static ssize_t > iface_show(struct device *device, struct device_attribute *attr, char *buf) > { > - struct usnic_ib_dev *us_ibdev; > - > - us_ibdev = container_of(device, struct usnic_ib_dev, ib_dev.dev); > + struct usnic_ib_dev *us_ibdev = > + rdma_device_to_drv_device(device, struct usnic_ib_dev, ib_dev); > > return scnprintf(buf, PAGE_SIZE, "%s\n", > netdev_name(us_ibdev->netdev)); > @@ -142,9 +140,8 @@ static DEVICE_ATTR_RO(iface); > static ssize_t > max_vf_show(struct device *device, struct device_attribute *attr, char *buf) > { > - struct usnic_ib_dev *us_ibdev; > - > - us_ibdev = container_of(device, struct usnic_ib_dev, ib_dev.dev); > + struct usnic_ib_dev *us_ibdev = > + rdma_device_to_drv_device(device, struct usnic_ib_dev, ib_dev); > > return scnprintf(buf, PAGE_SIZE, "%u\n", > kref_read(&us_ibdev->vf_cnt)); > @@ -154,10 +151,10 @@ static DEVICE_ATTR_RO(max_vf); > static ssize_t > qp_per_vf_show(struct device *device, struct device_attribute *attr, char *buf) > { > - struct usnic_ib_dev *us_ibdev; > + struct usnic_ib_dev *us_ibdev = > + rdma_device_to_drv_device(device, struct usnic_ib_dev, ib_dev); > int qp_per_vf; > > - us_ibdev = container_of(device, struct usnic_ib_dev, ib_dev.dev); > qp_per_vf = max(us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_WQ], > us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_RQ]); > > @@ -169,9 +166,8 @@ static DEVICE_ATTR_RO(qp_per_vf); > static ssize_t > cq_per_vf_show(struct device *device, struct device_attribute *attr, char *buf) > { > - struct usnic_ib_dev *us_ibdev; > - > - us_ibdev = container_of(device, struct usnic_ib_dev, ib_dev.dev); > + struct usnic_ib_dev *us_ibdev = > + rdma_device_to_drv_device(device, struct usnic_ib_dev, ib_dev); > > return scnprintf(buf, PAGE_SIZE, "%d\n", > us_ibdev->vf_res_cnt[USNIC_VNIC_RES_TYPE_CQ]); > diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c > index ecd0824b7eac..a8f5c6131bdc 100644 > +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c > @@ -1128,8 +1128,8 @@ static int rxe_detach_mcast(struct ib_qp *ibqp, union ib_gid *mgid, u16 mlid) > static ssize_t parent_show(struct device *device, > struct device_attribute *attr, char *buf) > { > - struct rxe_dev *rxe = container_of(device, struct rxe_dev, > - ib_dev.dev); > + struct rxe_dev *rxe = > + rdma_device_to_drv_device(device, struct rxe_dev, ib_dev); > > return snprintf(buf, 16, "%s\n", rxe_parent_name(rxe, 1)); > } > diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h > index 0ec15d673d92..5531a13d06b1 100644 > +++ b/include/rdma/ib_verbs.h > @@ -4225,4 +4225,26 @@ rdma_set_device_sysfs_group(struct ib_device *dev, > dev->groups[1] = group; > } > > +/** > + * rdma_device_to_ibdev - Get ib_device pointer from device pointer > + * > + * @device: device pointer for which ib_device pointer to retrieve > + * > + * rdma_device_to_ibdev() retrieves ib_device pointer from device. > + * > + * NOTE: New drivers should not make use of this API; This API is only for > + * existing drivers who have exposed sysfs entries using > + * rdma_set_device_sysfs_group(). Comment belongs rdma_device_to_drv_device > + */ > +static inline struct ib_device *rdma_device_to_ibdev(struct device *device) > +{ > + return dev_get_drvdata(device); This should use container_of like the majority of the call sites it is replacing. I made these changes and applied this as these wrappers are a helpful stand alone improvement. Can you check again that this got all the required driver call sites on the latest tree? Jason