diff options
author | Jason Gunthorpe <jgg@mellanox.com> | 2019-02-12 23:12:47 -0500 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2019-02-19 12:13:39 -0500 |
commit | ea1075edcbab7d92f4e4ccf5490043f796bf78be (patch) | |
tree | 618fb95aa42e446d18020d6851bab321be2c3b4b | |
parent | f2a0e45f36b0a210ff2388ed5fa89f81019c07a1 (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-format | 1 | ||||
-rw-r--r-- | drivers/infiniband/core/cache.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/core/cma.c | 7 | ||||
-rw-r--r-- | drivers/infiniband/core/device.c | 26 | ||||
-rw-r--r-- | drivers/infiniband/core/mad.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/core/nldev.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/core/security.c | 11 | ||||
-rw-r--r-- | drivers/infiniband/core/sysfs.c | 12 | ||||
-rw-r--r-- | drivers/infiniband/core/user_mad.c | 9 | ||||
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.c | 5 | ||||
-rw-r--r-- | include/rdma/ib_verbs.h | 10 |
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 | ||
1429 | int ib_cache_setup_one(struct ib_device *device) | 1429 | int 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 | ||
471 | static int read_port_immutable(struct ib_device *device) | 471 | static 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 | ||
3327 | static void ib_mad_remove_device(struct ib_device *device, void *client_data) | 3327 | static 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 | ||
423 | int ib_create_qp_security(struct ib_qp *qp, struct ib_device *dev) | 423 | int 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, | |||
561 | void ib_security_release_port_pkey_list(struct ib_device *device) | 564 | void 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 | ||
1309 | static int ib_setup_port_attrs(struct ib_device *device) | 1309 | static 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: | |||
1323 | static void ib_umad_remove_one(struct ib_device *device, void *client_data) | 1323 | static 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 | * |