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

IB/core: Pass hardware specific data in query_device

Vendors should be able to pass vendor specific data to/from
user-space via query_device uverb. In order to do this,
we need to pass the vendors' specific udata.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>

authored by

Matan Barak and committed by
Doug Ledford
2528e33e 24306dc6

+75 -25
+3 -1
drivers/infiniband/core/device.c
··· 539 539 int ib_query_device(struct ib_device *device, 540 540 struct ib_device_attr *device_attr) 541 541 { 542 + struct ib_udata uhw = {.outlen = 0, .inlen = 0}; 543 + 542 544 memset(device_attr, 0, sizeof(*device_attr)); 543 545 544 - return device->query_device(device, device_attr); 546 + return device->query_device(device, device_attr, &uhw); 545 547 } 546 548 EXPORT_SYMBOL(ib_query_device); 547 549
+1 -1
drivers/infiniband/core/uverbs_cmd.c
··· 3428 3428 3429 3429 memset(&attr, 0, sizeof(attr)); 3430 3430 3431 - err = device->query_device(device, &attr); 3431 + err = device->query_device(device, &attr, uhw); 3432 3432 if (err) 3433 3433 return err; 3434 3434
+5 -2
drivers/infiniband/hw/amso1100/c2_provider.c
··· 63 63 #include "c2_provider.h" 64 64 #include "c2_user.h" 65 65 66 - static int c2_query_device(struct ib_device *ibdev, 67 - struct ib_device_attr *props) 66 + static int c2_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 67 + struct ib_udata *uhw) 68 68 { 69 69 struct c2_dev *c2dev = to_c2dev(ibdev); 70 70 71 71 pr_debug("%s:%u\n", __func__, __LINE__); 72 + 73 + if (uhw->inlen || uhw->outlen) 74 + return -EINVAL; 72 75 73 76 *props = c2dev->props; 74 77 return 0;
+6 -2
drivers/infiniband/hw/cxgb3/iwch_provider.c
··· 1150 1150 (fw_mic & 0xffff); 1151 1151 } 1152 1152 1153 - static int iwch_query_device(struct ib_device *ibdev, 1154 - struct ib_device_attr *props) 1153 + static int iwch_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 1154 + struct ib_udata *uhw) 1155 1155 { 1156 1156 1157 1157 struct iwch_dev *dev; 1158 + 1158 1159 PDBG("%s ibdev %p\n", __func__, ibdev); 1160 + 1161 + if (uhw->inlen || uhw->outlen) 1162 + return -EINVAL; 1159 1163 1160 1164 dev = to_iwch_dev(ibdev); 1161 1165 memset(props, 0, sizeof *props);
+6 -2
drivers/infiniband/hw/cxgb4/provider.c
··· 302 302 return 0; 303 303 } 304 304 305 - static int c4iw_query_device(struct ib_device *ibdev, 306 - struct ib_device_attr *props) 305 + static int c4iw_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 306 + struct ib_udata *uhw) 307 307 { 308 308 309 309 struct c4iw_dev *dev; 310 + 310 311 PDBG("%s ibdev %p\n", __func__, ibdev); 312 + 313 + if (uhw->inlen || uhw->outlen) 314 + return -EINVAL; 311 315 312 316 dev = to_c4iw_dev(ibdev); 313 317 memset(props, 0, sizeof *props);
+5 -1
drivers/infiniband/hw/ehca/ehca_hca.c
··· 50 50 return min_t(unsigned int, value, INT_MAX); 51 51 } 52 52 53 - int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) 53 + int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 54 + struct ib_udata *uhw) 54 55 { 55 56 int i, ret = 0; 56 57 struct ehca_shca *shca = container_of(ibdev, struct ehca_shca, ··· 71 70 IB_DEVICE_INIT_TYPE, HCA_CAP_INIT_TYPE, 72 71 IB_DEVICE_PORT_ACTIVE_EVENT, HCA_CAP_PORT_ACTIVE_EVENT, 73 72 }; 73 + 74 + if (uhw->inlen || uhw->outlen) 75 + return -EINVAL; 74 76 75 77 rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 76 78 if (!rblock) {
+2 -1
drivers/infiniband/hw/ehca/ehca_iverbs.h
··· 44 44 45 45 #include "ehca_classes.h" 46 46 47 - int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props); 47 + int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 48 + struct ib_udata *uhw); 48 49 49 50 int ehca_query_port(struct ib_device *ibdev, u8 port, 50 51 struct ib_port_attr *props);
+5 -2
drivers/infiniband/hw/ipath/ipath_verbs.c
··· 1495 1495 return 0; 1496 1496 } 1497 1497 1498 - static int ipath_query_device(struct ib_device *ibdev, 1499 - struct ib_device_attr *props) 1498 + static int ipath_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 1499 + struct ib_udata *uhw) 1500 1500 { 1501 1501 struct ipath_ibdev *dev = to_idev(ibdev); 1502 + 1503 + if (uhw->inlen || uhw->outlen) 1504 + return -EINVAL; 1502 1505 1503 1506 memset(props, 0, sizeof(*props)); 1504 1507
+5 -1
drivers/infiniband/hw/mlx4/main.c
··· 132 132 } 133 133 134 134 static int mlx4_ib_query_device(struct ib_device *ibdev, 135 - struct ib_device_attr *props) 135 + struct ib_device_attr *props, 136 + struct ib_udata *uhw) 136 137 { 137 138 struct mlx4_ib_dev *dev = to_mdev(ibdev); 138 139 struct ib_smp *in_mad = NULL; 139 140 struct ib_smp *out_mad = NULL; 140 141 int err = -ENOMEM; 141 142 int have_ib_ports; 143 + 144 + if (uhw->inlen || uhw->outlen) 145 + return -EINVAL; 142 146 143 147 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 144 148 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
+7 -2
drivers/infiniband/hw/mlx5/main.c
··· 63 63 DRIVER_VERSION " (" DRIVER_RELDATE ")\n"; 64 64 65 65 static int mlx5_ib_query_device(struct ib_device *ibdev, 66 - struct ib_device_attr *props) 66 + struct ib_device_attr *props, 67 + struct ib_udata *uhw) 67 68 { 68 69 struct mlx5_ib_dev *dev = to_mdev(ibdev); 69 70 struct ib_smp *in_mad = NULL; ··· 74 73 int max_rq_sg; 75 74 int max_sq_sg; 76 75 u64 flags; 76 + 77 + if (uhw->inlen || uhw->outlen) 78 + return -EINVAL; 77 79 78 80 gen = &dev->mdev->caps.gen; 79 81 in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL); ··· 914 910 struct mlx5_general_caps *gen; 915 911 int err = -ENOMEM; 916 912 int port; 913 + struct ib_udata uhw = {.inlen = 0, .outlen = 0}; 917 914 918 915 gen = &dev->mdev->caps.gen; 919 916 pprops = kmalloc(sizeof(*pprops), GFP_KERNEL); ··· 925 920 if (!dprops) 926 921 goto out; 927 922 928 - err = mlx5_ib_query_device(&dev->ib_dev, dprops); 923 + err = mlx5_ib_query_device(&dev->ib_dev, dprops, &uhw); 929 924 if (err) { 930 925 mlx5_ib_warn(dev, "query_device failed %d\n", err); 931 926 goto out;
+5 -2
drivers/infiniband/hw/mthca/mthca_provider.c
··· 57 57 mad->method = IB_MGMT_METHOD_GET; 58 58 } 59 59 60 - static int mthca_query_device(struct ib_device *ibdev, 61 - struct ib_device_attr *props) 60 + static int mthca_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 61 + struct ib_udata *uhw) 62 62 { 63 63 struct ib_smp *in_mad = NULL; 64 64 struct ib_smp *out_mad = NULL; 65 65 int err = -ENOMEM; 66 66 struct mthca_dev *mdev = to_mdev(ibdev); 67 + 68 + if (uhw->inlen || uhw->outlen) 69 + return -EINVAL; 67 70 68 71 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); 69 72 out_mad = kmalloc(sizeof *out_mad, GFP_KERNEL);
+5 -1
drivers/infiniband/hw/nes/nes_verbs.c
··· 512 512 /** 513 513 * nes_query_device 514 514 */ 515 - static int nes_query_device(struct ib_device *ibdev, struct ib_device_attr *props) 515 + static int nes_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 516 + struct ib_udata *uhw) 516 517 { 517 518 struct nes_vnic *nesvnic = to_nesvnic(ibdev); 518 519 struct nes_device *nesdev = nesvnic->nesdev; 519 520 struct nes_ib_device *nesibdev = nesvnic->nesibdev; 521 + 522 + if (uhw->inlen || uhw->outlen) 523 + return -EINVAL; 520 524 521 525 memset(props, 0, sizeof(*props)); 522 526 memcpy(&props->sys_image_guid, nesvnic->netdev->dev_addr, 6);
+5 -1
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
··· 61 61 return 0; 62 62 } 63 63 64 - int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr) 64 + int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr, 65 + struct ib_udata *uhw) 65 66 { 66 67 struct ocrdma_dev *dev = get_ocrdma_dev(ibdev); 68 + 69 + if (uhw->inlen || uhw->outlen) 70 + return -EINVAL; 67 71 68 72 memset(attr, 0, sizeof *attr); 69 73 memcpy(&attr->fw_ver, &dev->attr.fw_ver[0],
+2 -1
drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
··· 36 36 int ocrdma_poll_cq(struct ib_cq *, int num_entries, struct ib_wc *wc); 37 37 int ocrdma_arm_cq(struct ib_cq *, enum ib_cq_notify_flags flags); 38 38 39 - int ocrdma_query_device(struct ib_device *, struct ib_device_attr *props); 39 + int ocrdma_query_device(struct ib_device *, struct ib_device_attr *props, 40 + struct ib_udata *uhw); 40 41 int ocrdma_query_port(struct ib_device *, u8 port, struct ib_port_attr *props); 41 42 int ocrdma_modify_port(struct ib_device *, u8 port, int mask, 42 43 struct ib_port_modify *props);
+4 -2
drivers/infiniband/hw/qib/qib_verbs.c
··· 1550 1550 } 1551 1551 } 1552 1552 1553 - static int qib_query_device(struct ib_device *ibdev, 1554 - struct ib_device_attr *props) 1553 + static int qib_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 1554 + struct ib_udata *uhw) 1555 1555 { 1556 1556 struct qib_devdata *dd = dd_from_ibdev(ibdev); 1557 1557 struct qib_ibdev *dev = to_idev(ibdev); 1558 1558 1559 + if (uhw->inlen || uhw->outlen) 1560 + return -EINVAL; 1559 1561 memset(props, 0, sizeof(*props)); 1560 1562 1561 1563 props->device_cap_flags = IB_DEVICE_BAD_PKEY_CNTR |
+5 -1
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
··· 248 248 } 249 249 250 250 int usnic_ib_query_device(struct ib_device *ibdev, 251 - struct ib_device_attr *props) 251 + struct ib_device_attr *props, 252 + struct ib_udata *uhw) 252 253 { 253 254 struct usnic_ib_dev *us_ibdev = to_usdev(ibdev); 254 255 union ib_gid gid; ··· 258 257 int qp_per_vf; 259 258 260 259 usnic_dbg("\n"); 260 + if (uhw->inlen || uhw->outlen) 261 + return -EINVAL; 262 + 261 263 mutex_lock(&us_ibdev->usdev_lock); 262 264 us_ibdev->netdev->ethtool_ops->get_drvinfo(us_ibdev->netdev, &info); 263 265 us_ibdev->netdev->ethtool_ops->get_settings(us_ibdev->netdev, &cmd);
+2 -1
drivers/infiniband/hw/usnic/usnic_ib_verbs.h
··· 24 24 enum rdma_link_layer usnic_ib_port_link_layer(struct ib_device *device, 25 25 u8 port_num); 26 26 int usnic_ib_query_device(struct ib_device *ibdev, 27 - struct ib_device_attr *props); 27 + struct ib_device_attr *props, 28 + struct ib_udata *uhw); 28 29 int usnic_ib_query_port(struct ib_device *ibdev, u8 port, 29 30 struct ib_port_attr *props); 30 31 enum rdma_protocol_type
+2 -1
include/rdma/ib_verbs.h
··· 1561 1561 int (*get_protocol_stats)(struct ib_device *device, 1562 1562 union rdma_protocol_stats *stats); 1563 1563 int (*query_device)(struct ib_device *device, 1564 - struct ib_device_attr *device_attr); 1564 + struct ib_device_attr *device_attr, 1565 + struct ib_udata *udata); 1565 1566 int (*query_port)(struct ib_device *device, 1566 1567 u8 port_num, 1567 1568 struct ib_port_attr *port_attr);