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

IB/core: Allow device-specific per-port sysfs files

Add a new parameter to ib_register_device() so that low-level device
drivers can pass in a pointer to a callback function that will be
called for each port that is registered in sysfs. This allows
low-level device drivers to create files in

/sys/class/infiniband/<hca>/ports/<N>/

without having to poke through the internals of the RDMA sysfs handling.

There is no need for an unregister function since the kobject
reference will go to zero when ib_unregister_device() is called.

Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by

Ralph Campbell and committed by
Roland Dreier
9a6edb60 a0fe3cc5

+35 -16
+3 -1
drivers/infiniband/core/core_priv.h
··· 38 38 39 39 #include <rdma/ib_verbs.h> 40 40 41 - int ib_device_register_sysfs(struct ib_device *device); 41 + int ib_device_register_sysfs(struct ib_device *device, 42 + int (*port_callback)(struct ib_device *, 43 + u8, struct kobject *)); 42 44 void ib_device_unregister_sysfs(struct ib_device *device); 43 45 44 46 int ib_sysfs_setup(void);
+4 -2
drivers/infiniband/core/device.c
··· 267 267 * callback for each device that is added. @device must be allocated 268 268 * with ib_alloc_device(). 269 269 */ 270 - int ib_register_device(struct ib_device *device) 270 + int ib_register_device(struct ib_device *device, 271 + int (*port_callback)(struct ib_device *, 272 + u8, struct kobject *)) 271 273 { 272 274 int ret; 273 275 ··· 298 296 goto out; 299 297 } 300 298 301 - ret = ib_device_register_sysfs(device); 299 + ret = ib_device_register_sysfs(device, port_callback); 302 300 if (ret) { 303 301 printk(KERN_WARNING "Couldn't register device %s with driver model\n", 304 302 device->name);
+17 -4
drivers/infiniband/core/sysfs.c
··· 475 475 return NULL; 476 476 } 477 477 478 - static int add_port(struct ib_device *device, int port_num) 478 + static int add_port(struct ib_device *device, int port_num, 479 + int (*port_callback)(struct ib_device *, 480 + u8, struct kobject *)) 479 481 { 480 482 struct ib_port *p; 481 483 struct ib_port_attr attr; ··· 524 522 if (ret) 525 523 goto err_free_pkey; 526 524 525 + if (port_callback) { 526 + ret = port_callback(device, port_num, &p->kobj); 527 + if (ret) 528 + goto err_remove_pkey; 529 + } 530 + 527 531 list_add_tail(&p->kobj.entry, &device->port_list); 528 532 529 533 kobject_uevent(&p->kobj, KOBJ_ADD); 530 534 return 0; 535 + 536 + err_remove_pkey: 537 + sysfs_remove_group(&p->kobj, &p->pkey_group); 531 538 532 539 err_free_pkey: 533 540 for (i = 0; i < attr.pkey_tbl_len; ++i) ··· 765 754 .attrs = iw_proto_stats_attrs, 766 755 }; 767 756 768 - int ib_device_register_sysfs(struct ib_device *device) 757 + int ib_device_register_sysfs(struct ib_device *device, 758 + int (*port_callback)(struct ib_device *, 759 + u8, struct kobject *)) 769 760 { 770 761 struct device *class_dev = &device->dev; 771 762 int ret; ··· 798 785 } 799 786 800 787 if (device->node_type == RDMA_NODE_IB_SWITCH) { 801 - ret = add_port(device, 0); 788 + ret = add_port(device, 0, port_callback); 802 789 if (ret) 803 790 goto err_put; 804 791 } else { 805 792 for (i = 1; i <= device->phys_port_cnt; ++i) { 806 - ret = add_port(device, i); 793 + ret = add_port(device, i, port_callback); 807 794 if (ret) 808 795 goto err_put; 809 796 }
+1 -1
drivers/infiniband/hw/amso1100/c2_provider.c
··· 865 865 dev->ibdev.iwcm->create_listen = c2_service_create; 866 866 dev->ibdev.iwcm->destroy_listen = c2_service_destroy; 867 867 868 - ret = ib_register_device(&dev->ibdev); 868 + ret = ib_register_device(&dev->ibdev, NULL); 869 869 if (ret) 870 870 goto out_free_iwcm; 871 871
+1 -1
drivers/infiniband/hw/cxgb3/iwch_provider.c
··· 1428 1428 dev->ibdev.iwcm->rem_ref = iwch_qp_rem_ref; 1429 1429 dev->ibdev.iwcm->get_qp = iwch_get_qp; 1430 1430 1431 - ret = ib_register_device(&dev->ibdev); 1431 + ret = ib_register_device(&dev->ibdev, NULL); 1432 1432 if (ret) 1433 1433 goto bail1; 1434 1434
+1 -1
drivers/infiniband/hw/cxgb4/provider.c
··· 486 486 dev->ibdev.iwcm->rem_ref = c4iw_qp_rem_ref; 487 487 dev->ibdev.iwcm->get_qp = c4iw_get_qp; 488 488 489 - ret = ib_register_device(&dev->ibdev); 489 + ret = ib_register_device(&dev->ibdev, NULL); 490 490 if (ret) 491 491 goto bail1; 492 492
+1 -1
drivers/infiniband/hw/ehca/ehca_main.c
··· 798 798 goto probe5; 799 799 } 800 800 801 - ret = ib_register_device(&shca->ib_device); 801 + ret = ib_register_device(&shca->ib_device, NULL); 802 802 if (ret) { 803 803 ehca_err(&shca->ib_device, 804 804 "ib_register_device() failed ret=%i", ret);
+1 -1
drivers/infiniband/hw/ipath/ipath_verbs.c
··· 2182 2182 snprintf(dev->node_desc, sizeof(dev->node_desc), 2183 2183 IPATH_IDSTR " %s", init_utsname()->nodename); 2184 2184 2185 - ret = ib_register_device(dev); 2185 + ret = ib_register_device(dev, NULL); 2186 2186 if (ret) 2187 2187 goto err_reg; 2188 2188
+1 -1
drivers/infiniband/hw/mlx4/main.c
··· 662 662 spin_lock_init(&ibdev->sm_lock); 663 663 mutex_init(&ibdev->cap_mask_mutex); 664 664 665 - if (ib_register_device(&ibdev->ib_dev)) 665 + if (ib_register_device(&ibdev->ib_dev, NULL)) 666 666 goto err_map; 667 667 668 668 if (mlx4_ib_mad_init(ibdev))
+1 -1
drivers/infiniband/hw/mthca/mthca_provider.c
··· 1403 1403 1404 1404 mutex_init(&dev->cap_mask_mutex); 1405 1405 1406 - ret = ib_register_device(&dev->ib_dev); 1406 + ret = ib_register_device(&dev->ib_dev, NULL); 1407 1407 if (ret) 1408 1408 return ret; 1409 1409
+1 -1
drivers/infiniband/hw/nes/nes_verbs.c
··· 3962 3962 struct nes_adapter *nesadapter = nesdev->nesadapter; 3963 3963 int i, ret; 3964 3964 3965 - ret = ib_register_device(&nesvnic->nesibdev->ibdev); 3965 + ret = ib_register_device(&nesvnic->nesibdev->ibdev, NULL); 3966 3966 if (ret) { 3967 3967 return ret; 3968 3968 }
+3 -1
include/rdma/ib_verbs.h
··· 1172 1172 struct ib_device *ib_alloc_device(size_t size); 1173 1173 void ib_dealloc_device(struct ib_device *device); 1174 1174 1175 - int ib_register_device (struct ib_device *device); 1175 + int ib_register_device(struct ib_device *device, 1176 + int (*port_callback)(struct ib_device *, 1177 + u8, struct kobject *)); 1176 1178 void ib_unregister_device(struct ib_device *device); 1177 1179 1178 1180 int ib_register_client (struct ib_client *client);