aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gunthorpe <jgg@mellanox.com>2019-02-12 23:12:47 -0500
committerJason Gunthorpe <jgg@mellanox.com>2019-02-19 12:13:39 -0500
commitea1075edcbab7d92f4e4ccf5490043f796bf78be (patch)
tree618fb95aa42e446d18020d6851bab321be2c3b4b
parentf2a0e45f36b0a210ff2388ed5fa89f81019c07a1 (diff)
RDMA: Add and use rdma_for_each_port
We have many loops iterating over all of the end port numbers on a struct ib_device, simplify them with a for_each helper. Reviewed-by: Parav Pandit <parav@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-rw-r--r--.clang-format1
-rw-r--r--drivers/infiniband/core/cache.c6
-rw-r--r--drivers/infiniband/core/cma.c7
-rw-r--r--drivers/infiniband/core/device.c26
-rw-r--r--drivers/infiniband/core/mad.c4
-rw-r--r--drivers/infiniband/core/nldev.c4
-rw-r--r--drivers/infiniband/core/security.c11
-rw-r--r--drivers/infiniband/core/sysfs.c12
-rw-r--r--drivers/infiniband/core/user_mad.c9
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c4
-rw-r--r--drivers/infiniband/ulp/srp/ib_srp.c5
-rw-r--r--include/rdma/ib_verbs.h10
12 files changed, 53 insertions, 46 deletions
diff --git a/.clang-format b/.clang-format
index 335ce29ab813..201a4f531b90 100644
--- a/.clang-format
+++ b/.clang-format
@@ -361,6 +361,7 @@ ForEachMacros:
361 - 'radix_tree_for_each_slot' 361 - 'radix_tree_for_each_slot'
362 - 'radix_tree_for_each_tagged' 362 - 'radix_tree_for_each_tagged'
363 - 'rbtree_postorder_for_each_entry_safe' 363 - 'rbtree_postorder_for_each_entry_safe'
364 - 'rdma_for_each_port'
364 - 'resource_list_for_each_entry' 365 - 'resource_list_for_each_entry'
365 - 'resource_list_for_each_entry_safe' 366 - 'resource_list_for_each_entry_safe'
366 - 'rhl_for_each_entry_rcu' 367 - 'rhl_for_each_entry_rcu'
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index 2338d0b3a0ca..3d137d8381a9 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -1428,7 +1428,7 @@ static void ib_cache_event(struct ib_event_handler *handler,
1428 1428
1429int ib_cache_setup_one(struct ib_device *device) 1429int ib_cache_setup_one(struct ib_device *device)
1430{ 1430{
1431 int p; 1431 unsigned int p;
1432 int err; 1432 int err;
1433 1433
1434 rwlock_init(&device->cache.lock); 1434 rwlock_init(&device->cache.lock);
@@ -1447,8 +1447,8 @@ int ib_cache_setup_one(struct ib_device *device)
1447 return err; 1447 return err;
1448 } 1448 }
1449 1449
1450 for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p) 1450 rdma_for_each_port (device, p)
1451 ib_cache_update(device, p + rdma_start_port(device), true); 1451 ib_cache_update(device, p, true);
1452 1452
1453 INIT_IB_EVENT_HANDLER(&device->cache.event_handler, 1453 INIT_IB_EVENT_HANDLER(&device->cache.event_handler,
1454 device, ib_cache_event); 1454 device, ib_cache_event);
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index c43512752b8a..68c997be2429 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -659,7 +659,7 @@ static int cma_acquire_dev_by_src_ip(struct rdma_id_private *id_priv)
659 struct cma_device *cma_dev; 659 struct cma_device *cma_dev;
660 enum ib_gid_type gid_type; 660 enum ib_gid_type gid_type;
661 int ret = -ENODEV; 661 int ret = -ENODEV;
662 u8 port; 662 unsigned int port;
663 663
664 if (dev_addr->dev_type != ARPHRD_INFINIBAND && 664 if (dev_addr->dev_type != ARPHRD_INFINIBAND &&
665 id_priv->id.ps == RDMA_PS_IPOIB) 665 id_priv->id.ps == RDMA_PS_IPOIB)
@@ -673,8 +673,7 @@ static int cma_acquire_dev_by_src_ip(struct rdma_id_private *id_priv)
673 673
674 mutex_lock(&lock); 674 mutex_lock(&lock);
675 list_for_each_entry(cma_dev, &dev_list, list) { 675 list_for_each_entry(cma_dev, &dev_list, list) {
676 for (port = rdma_start_port(cma_dev->device); 676 rdma_for_each_port (cma_dev->device, port) {
677 port <= rdma_end_port(cma_dev->device); port++) {
678 gidp = rdma_protocol_roce(cma_dev->device, port) ? 677 gidp = rdma_protocol_roce(cma_dev->device, port) ?
679 &iboe_gid : &gid; 678 &iboe_gid : &gid;
680 gid_type = cma_dev->default_gid_type[port - 1]; 679 gid_type = cma_dev->default_gid_type[port - 1];
@@ -4548,7 +4547,7 @@ static void cma_add_one(struct ib_device *device)
4548 if (!cma_dev->default_roce_tos) 4547 if (!cma_dev->default_roce_tos)
4549 goto free_gid_type; 4548 goto free_gid_type;
4550 4549
4551 for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) { 4550 rdma_for_each_port (device, i) {
4552 supported_gids = roce_gid_type_mask_support(device, i); 4551 supported_gids = roce_gid_type_mask_support(device, i);
4553 WARN_ON(!supported_gids); 4552 WARN_ON(!supported_gids);
4554 if (supported_gids & (1 << CMA_PREFERRED_ROCE_GID_TYPE)) 4553 if (supported_gids & (1 << CMA_PREFERRED_ROCE_GID_TYPE))
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index f7e206033d39..71582f848a9c 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -470,10 +470,8 @@ static int verify_immutable(const struct ib_device *dev, u8 port)
470 470
471static int read_port_immutable(struct ib_device *device) 471static int read_port_immutable(struct ib_device *device)
472{ 472{
473 unsigned int port;
473 int ret; 474 int ret;
474 u8 start_port = rdma_start_port(device);
475 u8 end_port = rdma_end_port(device);
476 u8 port;
477 475
478 /** 476 /**
479 * device->port_immutable is indexed directly by the port number to make 477 * device->port_immutable is indexed directly by the port number to make
@@ -482,13 +480,13 @@ static int read_port_immutable(struct ib_device *device)
482 * Therefore port_immutable is declared as a 1 based array with 480 * Therefore port_immutable is declared as a 1 based array with
483 * potential empty slots at the beginning. 481 * potential empty slots at the beginning.
484 */ 482 */
485 device->port_immutable = kcalloc(end_port + 1, 483 device->port_immutable =
486 sizeof(*device->port_immutable), 484 kcalloc(rdma_end_port(device) + 1,
487 GFP_KERNEL); 485 sizeof(*device->port_immutable), GFP_KERNEL);
488 if (!device->port_immutable) 486 if (!device->port_immutable)
489 return -ENOMEM; 487 return -ENOMEM;
490 488
491 for (port = start_port; port <= end_port; ++port) { 489 rdma_for_each_port (device, port) {
492 ret = device->ops.get_port_immutable( 490 ret = device->ops.get_port_immutable(
493 device, port, &device->port_immutable[port]); 491 device, port, &device->port_immutable[port]);
494 if (ret) 492 if (ret)
@@ -540,9 +538,9 @@ static void ib_policy_change_task(struct work_struct *work)
540 538
541 down_read(&devices_rwsem); 539 down_read(&devices_rwsem);
542 xa_for_each_marked (&devices, index, dev, DEVICE_REGISTERED) { 540 xa_for_each_marked (&devices, index, dev, DEVICE_REGISTERED) {
543 int i; 541 unsigned int i;
544 542
545 for (i = rdma_start_port(dev); i <= rdma_end_port(dev); i++) { 543 rdma_for_each_port (dev, i) {
546 u64 sp; 544 u64 sp;
547 int ret = ib_get_cached_subnet_prefix(dev, 545 int ret = ib_get_cached_subnet_prefix(dev,
548 i, 546 i,
@@ -1060,10 +1058,9 @@ void ib_enum_roce_netdev(struct ib_device *ib_dev,
1060 roce_netdev_callback cb, 1058 roce_netdev_callback cb,
1061 void *cookie) 1059 void *cookie)
1062{ 1060{
1063 u8 port; 1061 unsigned int port;
1064 1062
1065 for (port = rdma_start_port(ib_dev); port <= rdma_end_port(ib_dev); 1063 rdma_for_each_port (ib_dev, port)
1066 port++)
1067 if (rdma_protocol_roce(ib_dev, port)) { 1064 if (rdma_protocol_roce(ib_dev, port)) {
1068 struct net_device *idev = NULL; 1065 struct net_device *idev = NULL;
1069 1066
@@ -1217,9 +1214,10 @@ int ib_find_gid(struct ib_device *device, union ib_gid *gid,
1217 u8 *port_num, u16 *index) 1214 u8 *port_num, u16 *index)
1218{ 1215{
1219 union ib_gid tmp_gid; 1216 union ib_gid tmp_gid;
1220 int ret, port, i; 1217 unsigned int port;
1218 int ret, i;
1221 1219
1222 for (port = rdma_start_port(device); port <= rdma_end_port(device); ++port) { 1220 rdma_for_each_port (device, port) {
1223 if (!rdma_protocol_ib(device, port)) 1221 if (!rdma_protocol_ib(device, port))
1224 continue; 1222 continue;
1225 1223
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index 7870823bac47..e742a6a2c138 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -3326,9 +3326,9 @@ error:
3326 3326
3327static void ib_mad_remove_device(struct ib_device *device, void *client_data) 3327static void ib_mad_remove_device(struct ib_device *device, void *client_data)
3328{ 3328{
3329 int i; 3329 unsigned int i;
3330 3330
3331 for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) { 3331 rdma_for_each_port (device, i) {
3332 if (!rdma_cap_ib_mad(device, i)) 3332 if (!rdma_cap_ib_mad(device, i))
3333 continue; 3333 continue;
3334 3334
diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
index e7350d9d60e9..85f6f2bcce40 100644
--- a/drivers/infiniband/core/nldev.c
+++ b/drivers/infiniband/core/nldev.c
@@ -774,7 +774,7 @@ static int nldev_port_get_dumpit(struct sk_buff *skb,
774 u32 idx = 0; 774 u32 idx = 0;
775 u32 ifindex; 775 u32 ifindex;
776 int err; 776 int err;
777 u32 p; 777 unsigned int p;
778 778
779 err = nlmsg_parse(cb->nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1, 779 err = nlmsg_parse(cb->nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
780 nldev_policy, NULL); 780 nldev_policy, NULL);
@@ -786,7 +786,7 @@ static int nldev_port_get_dumpit(struct sk_buff *skb,
786 if (!device) 786 if (!device)
787 return -EINVAL; 787 return -EINVAL;
788 788
789 for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) { 789 rdma_for_each_port (device, p) {
790 /* 790 /*
791 * The dumpit function returns all information from specific 791 * The dumpit function returns all information from specific
792 * index. This specific index is taken from the netlink 792 * index. This specific index is taken from the netlink
diff --git a/drivers/infiniband/core/security.c b/drivers/infiniband/core/security.c
index dad6a94a43f3..492702b83600 100644
--- a/drivers/infiniband/core/security.c
+++ b/drivers/infiniband/core/security.c
@@ -422,12 +422,15 @@ void ib_close_shared_qp_security(struct ib_qp_security *sec)
422 422
423int ib_create_qp_security(struct ib_qp *qp, struct ib_device *dev) 423int ib_create_qp_security(struct ib_qp *qp, struct ib_device *dev)
424{ 424{
425 u8 i = rdma_start_port(dev); 425 unsigned int i;
426 bool is_ib = false; 426 bool is_ib = false;
427 int ret; 427 int ret;
428 428
429 while (i <= rdma_end_port(dev) && !is_ib) 429 rdma_for_each_port (dev, i) {
430 is_ib = rdma_protocol_ib(dev, i++); 430 is_ib = rdma_protocol_ib(dev, i++);
431 if (is_ib)
432 break;
433 }
431 434
432 /* If this isn't an IB device don't create the security context */ 435 /* If this isn't an IB device don't create the security context */
433 if (!is_ib) 436 if (!is_ib)
@@ -561,9 +564,9 @@ void ib_security_cache_change(struct ib_device *device,
561void ib_security_release_port_pkey_list(struct ib_device *device) 564void ib_security_release_port_pkey_list(struct ib_device *device)
562{ 565{
563 struct pkey_index_qp_list *pkey, *tmp_pkey; 566 struct pkey_index_qp_list *pkey, *tmp_pkey;
564 int i; 567 unsigned int i;
565 568
566 for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) { 569 rdma_for_each_port (device, i) {
567 list_for_each_entry_safe(pkey, 570 list_for_each_entry_safe(pkey,
568 tmp_pkey, 571 tmp_pkey,
569 &device->port_pkey_list[i].pkey_list, 572 &device->port_pkey_list[i].pkey_list,
diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
index 9335b15c2e38..9b6a065bdfa5 100644
--- a/drivers/infiniband/core/sysfs.c
+++ b/drivers/infiniband/core/sysfs.c
@@ -1308,23 +1308,17 @@ static void ib_free_port_attrs(struct ib_device *device)
1308 1308
1309static int ib_setup_port_attrs(struct ib_device *device) 1309static int ib_setup_port_attrs(struct ib_device *device)
1310{ 1310{
1311 unsigned int port;
1311 int ret; 1312 int ret;
1312 int i;
1313 1313
1314 device->ports_kobj = kobject_create_and_add("ports", &device->dev.kobj); 1314 device->ports_kobj = kobject_create_and_add("ports", &device->dev.kobj);
1315 if (!device->ports_kobj) 1315 if (!device->ports_kobj)
1316 return -ENOMEM; 1316 return -ENOMEM;
1317 1317
1318 if (rdma_cap_ib_switch(device)) { 1318 rdma_for_each_port (device, port) {
1319 ret = add_port(device, 0); 1319 ret = add_port(device, port);
1320 if (ret) 1320 if (ret)
1321 goto err_put; 1321 goto err_put;
1322 } else {
1323 for (i = 1; i <= device->phys_port_cnt; ++i) {
1324 ret = add_port(device, i);
1325 if (ret)
1326 goto err_put;
1327 }
1328 } 1322 }
1329 1323
1330 return 0; 1324 return 0;
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
index 3ebd211a87ed..02b7947ab215 100644
--- a/drivers/infiniband/core/user_mad.c
+++ b/drivers/infiniband/core/user_mad.c
@@ -1323,14 +1323,15 @@ free:
1323static void ib_umad_remove_one(struct ib_device *device, void *client_data) 1323static void ib_umad_remove_one(struct ib_device *device, void *client_data)
1324{ 1324{
1325 struct ib_umad_device *umad_dev = client_data; 1325 struct ib_umad_device *umad_dev = client_data;
1326 int i; 1326 unsigned int i;
1327 1327
1328 if (!umad_dev) 1328 if (!umad_dev)
1329 return; 1329 return;
1330 1330
1331 for (i = 0; i <= rdma_end_port(device) - rdma_start_port(device); ++i) { 1331 rdma_for_each_port (device, i) {
1332 if (rdma_cap_ib_mad(device, i + rdma_start_port(device))) 1332 if (rdma_cap_ib_mad(device, i))
1333 ib_umad_kill_port(&umad_dev->ports[i]); 1333 ib_umad_kill_port(
1334 &umad_dev->ports[i - rdma_start_port(device)]);
1334 } 1335 }
1335 /* balances kref_init() */ 1336 /* balances kref_init() */
1336 ib_umad_dev_put(umad_dev); 1337 ib_umad_dev_put(umad_dev);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index ee4cca80f00b..48eda16db1a7 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -2495,7 +2495,7 @@ static void ipoib_add_one(struct ib_device *device)
2495 struct list_head *dev_list; 2495 struct list_head *dev_list;
2496 struct net_device *dev; 2496 struct net_device *dev;
2497 struct ipoib_dev_priv *priv; 2497 struct ipoib_dev_priv *priv;
2498 int p; 2498 unsigned int p;
2499 int count = 0; 2499 int count = 0;
2500 2500
2501 dev_list = kmalloc(sizeof(*dev_list), GFP_KERNEL); 2501 dev_list = kmalloc(sizeof(*dev_list), GFP_KERNEL);
@@ -2504,7 +2504,7 @@ static void ipoib_add_one(struct ib_device *device)
2504 2504
2505 INIT_LIST_HEAD(dev_list); 2505 INIT_LIST_HEAD(dev_list);
2506 2506
2507 for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) { 2507 rdma_for_each_port (device, p) {
2508 if (!rdma_protocol_ib(device, p)) 2508 if (!rdma_protocol_ib(device, p))
2509 continue; 2509 continue;
2510 dev = ipoib_add_port("ib%d", device, p); 2510 dev = ipoib_add_port("ib%d", device, p);
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 84184910f038..151f4eba84b8 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -4127,7 +4127,8 @@ static void srp_add_one(struct ib_device *device)
4127 struct srp_device *srp_dev; 4127 struct srp_device *srp_dev;
4128 struct ib_device_attr *attr = &device->attrs; 4128 struct ib_device_attr *attr = &device->attrs;
4129 struct srp_host *host; 4129 struct srp_host *host;
4130 int mr_page_shift, p; 4130 int mr_page_shift;
4131 unsigned int p;
4131 u64 max_pages_per_mr; 4132 u64 max_pages_per_mr;
4132 unsigned int flags = 0; 4133 unsigned int flags = 0;
4133 4134
@@ -4194,7 +4195,7 @@ static void srp_add_one(struct ib_device *device)
4194 WARN_ON_ONCE(srp_dev->global_rkey == 0); 4195 WARN_ON_ONCE(srp_dev->global_rkey == 0);
4195 } 4196 }
4196 4197
4197 for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) { 4198 rdma_for_each_port (device, p) {
4198 host = srp_add_port(srp_dev, p); 4199 host = srp_add_port(srp_dev, p);
4199 if (host) 4200 if (host)
4200 list_add_tail(&host->list, &srp_dev->dev_list); 4201 list_add_tail(&host->list, &srp_dev->dev_list);
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 2a17c2b30073..fa0edd6ae33c 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -2828,6 +2828,16 @@ static inline u8 rdma_start_port(const struct ib_device *device)
2828} 2828}
2829 2829
2830/** 2830/**
2831 * rdma_for_each_port - Iterate over all valid port numbers of the IB device
2832 * @device - The struct ib_device * to iterate over
2833 * @iter - The unsigned int to store the port number
2834 */
2835#define rdma_for_each_port(device, iter) \
2836 for (iter = rdma_start_port(device + BUILD_BUG_ON_ZERO(!__same_type( \
2837 unsigned int, iter))); \
2838 iter <= rdma_end_port(device); (iter)++)
2839
2840/**
2831 * rdma_end_port - Return the last valid port number for the device 2841 * rdma_end_port - Return the last valid port number for the device
2832 * specified 2842 * specified
2833 * 2843 *