summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gunthorpe <jgg@mellanox.com>2018-04-03 00:52:04 -0400
committerJason Gunthorpe <jgg@mellanox.com>2018-04-17 21:42:50 -0400
commitee6548d1d98df7df3b9c8103a42cf68b31c29417 (patch)
treeeb9a225dac8ea5a1706f800b4016220d324fba4a
parent44e75052bc2ae4d39386c1d9e218861639905873 (diff)
RDMA/rdma_cm: Delete rdma_addr_client
The only thing it does is block module unload while work is posted from rdma_resolve_ip(). However, this is not the right place to do this. The users of rdma_resolve_ip() must ensure their own module does not unload until rdma_resolve_ip() calls the callback, or until rdma_addr_cancel() is called. Similarly callers to rdma_addr_find_l2_eth_by_grh() must ensure their module does not unload while they are calling code. The only two users are already safe, so there is no need for this. Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-rw-r--r--drivers/infiniband/core/addr.c38
-rw-r--r--drivers/infiniband/core/cma.c6
-rw-r--r--include/rdma/ib_addr.h20
3 files changed, 6 insertions, 58 deletions
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index 9756cfbdef0e..4f32c4062fb6 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -56,7 +56,6 @@ struct addr_req {
56 struct sockaddr_storage src_addr; 56 struct sockaddr_storage src_addr;
57 struct sockaddr_storage dst_addr; 57 struct sockaddr_storage dst_addr;
58 struct rdma_dev_addr *addr; 58 struct rdma_dev_addr *addr;
59 struct rdma_addr_client *client;
60 void *context; 59 void *context;
61 void (*callback)(int status, struct sockaddr *src_addr, 60 void (*callback)(int status, struct sockaddr *src_addr,
62 struct rdma_dev_addr *addr, void *context); 61 struct rdma_dev_addr *addr, void *context);
@@ -220,28 +219,6 @@ int rdma_addr_size_kss(struct __kernel_sockaddr_storage *addr)
220} 219}
221EXPORT_SYMBOL(rdma_addr_size_kss); 220EXPORT_SYMBOL(rdma_addr_size_kss);
222 221
223static struct rdma_addr_client self;
224
225void rdma_addr_register_client(struct rdma_addr_client *client)
226{
227 atomic_set(&client->refcount, 1);
228 init_completion(&client->comp);
229}
230EXPORT_SYMBOL(rdma_addr_register_client);
231
232static inline void put_client(struct rdma_addr_client *client)
233{
234 if (atomic_dec_and_test(&client->refcount))
235 complete(&client->comp);
236}
237
238void rdma_addr_unregister_client(struct rdma_addr_client *client)
239{
240 put_client(client);
241 wait_for_completion(&client->comp);
242}
243EXPORT_SYMBOL(rdma_addr_unregister_client);
244
245void rdma_copy_addr(struct rdma_dev_addr *dev_addr, 222void rdma_copy_addr(struct rdma_dev_addr *dev_addr,
246 const struct net_device *dev, 223 const struct net_device *dev,
247 const unsigned char *dst_dev_addr) 224 const unsigned char *dst_dev_addr)
@@ -605,14 +582,12 @@ static void process_one_req(struct work_struct *_work)
605 */ 582 */
606 cancel_delayed_work(&req->work); 583 cancel_delayed_work(&req->work);
607 list_del_init(&req->list); 584 list_del_init(&req->list);
608 put_client(req->client);
609 kfree(req); 585 kfree(req);
610 } 586 }
611 spin_unlock_bh(&lock); 587 spin_unlock_bh(&lock);
612} 588}
613 589
614int rdma_resolve_ip(struct rdma_addr_client *client, 590int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
615 struct sockaddr *src_addr, struct sockaddr *dst_addr,
616 struct rdma_dev_addr *addr, int timeout_ms, 591 struct rdma_dev_addr *addr, int timeout_ms,
617 void (*callback)(int status, struct sockaddr *src_addr, 592 void (*callback)(int status, struct sockaddr *src_addr,
618 struct rdma_dev_addr *addr, void *context), 593 struct rdma_dev_addr *addr, void *context),
@@ -644,8 +619,6 @@ int rdma_resolve_ip(struct rdma_addr_client *client,
644 req->addr = addr; 619 req->addr = addr;
645 req->callback = callback; 620 req->callback = callback;
646 req->context = context; 621 req->context = context;
647 req->client = client;
648 atomic_inc(&client->refcount);
649 INIT_DELAYED_WORK(&req->work, process_one_req); 622 INIT_DELAYED_WORK(&req->work, process_one_req);
650 req->seq = (u32)atomic_inc_return(&ib_nl_addr_request_seq); 623 req->seq = (u32)atomic_inc_return(&ib_nl_addr_request_seq);
651 624
@@ -661,7 +634,6 @@ int rdma_resolve_ip(struct rdma_addr_client *client,
661 break; 634 break;
662 default: 635 default:
663 ret = req->status; 636 ret = req->status;
664 atomic_dec(&client->refcount);
665 goto err; 637 goto err;
666 } 638 }
667 return ret; 639 return ret;
@@ -722,7 +694,6 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr)
722 found->callback(-ECANCELED, (struct sockaddr *)&found->src_addr, 694 found->callback(-ECANCELED, (struct sockaddr *)&found->src_addr,
723 found->addr, found->context); 695 found->addr, found->context);
724 696
725 put_client(found->client);
726 kfree(found); 697 kfree(found);
727} 698}
728EXPORT_SYMBOL(rdma_addr_cancel); 699EXPORT_SYMBOL(rdma_addr_cancel);
@@ -761,8 +732,8 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
761 dev_addr.net = &init_net; 732 dev_addr.net = &init_net;
762 733
763 init_completion(&ctx.comp); 734 init_completion(&ctx.comp);
764 ret = rdma_resolve_ip(&self, &sgid_addr._sockaddr, &dgid_addr._sockaddr, 735 ret = rdma_resolve_ip(&sgid_addr._sockaddr, &dgid_addr._sockaddr,
765 &dev_addr, 1000, resolve_cb, &ctx); 736 &dev_addr, 1000, resolve_cb, &ctx);
766 if (ret) 737 if (ret)
767 return ret; 738 return ret;
768 739
@@ -806,14 +777,13 @@ int addr_init(void)
806 return -ENOMEM; 777 return -ENOMEM;
807 778
808 register_netevent_notifier(&nb); 779 register_netevent_notifier(&nb);
809 rdma_addr_register_client(&self);
810 780
811 return 0; 781 return 0;
812} 782}
813 783
814void addr_cleanup(void) 784void addr_cleanup(void)
815{ 785{
816 rdma_addr_unregister_client(&self);
817 unregister_netevent_notifier(&nb); 786 unregister_netevent_notifier(&nb);
818 destroy_workqueue(addr_wq); 787 destroy_workqueue(addr_wq);
788 WARN_ON(!list_empty(&req_list));
819} 789}
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 51a641002e10..48300838e354 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -156,7 +156,6 @@ static struct ib_client cma_client = {
156}; 156};
157 157
158static struct ib_sa_client sa_client; 158static struct ib_sa_client sa_client;
159static struct rdma_addr_client addr_client;
160static LIST_HEAD(dev_list); 159static LIST_HEAD(dev_list);
161static LIST_HEAD(listen_any_list); 160static LIST_HEAD(listen_any_list);
162static DEFINE_MUTEX(lock); 161static DEFINE_MUTEX(lock);
@@ -2910,7 +2909,7 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
2910 if (dst_addr->sa_family == AF_IB) { 2909 if (dst_addr->sa_family == AF_IB) {
2911 ret = cma_resolve_ib_addr(id_priv); 2910 ret = cma_resolve_ib_addr(id_priv);
2912 } else { 2911 } else {
2913 ret = rdma_resolve_ip(&addr_client, cma_src_addr(id_priv), 2912 ret = rdma_resolve_ip(cma_src_addr(id_priv),
2914 dst_addr, &id->route.addr.dev_addr, 2913 dst_addr, &id->route.addr.dev_addr,
2915 timeout_ms, addr_handler, id_priv); 2914 timeout_ms, addr_handler, id_priv);
2916 } 2915 }
@@ -4547,7 +4546,6 @@ static int __init cma_init(void)
4547 goto err_wq; 4546 goto err_wq;
4548 4547
4549 ib_sa_register_client(&sa_client); 4548 ib_sa_register_client(&sa_client);
4550 rdma_addr_register_client(&addr_client);
4551 register_netdevice_notifier(&cma_nb); 4549 register_netdevice_notifier(&cma_nb);
4552 4550
4553 ret = ib_register_client(&cma_client); 4551 ret = ib_register_client(&cma_client);
@@ -4561,7 +4559,6 @@ static int __init cma_init(void)
4561 4559
4562err: 4560err:
4563 unregister_netdevice_notifier(&cma_nb); 4561 unregister_netdevice_notifier(&cma_nb);
4564 rdma_addr_unregister_client(&addr_client);
4565 ib_sa_unregister_client(&sa_client); 4562 ib_sa_unregister_client(&sa_client);
4566err_wq: 4563err_wq:
4567 destroy_workqueue(cma_wq); 4564 destroy_workqueue(cma_wq);
@@ -4574,7 +4571,6 @@ static void __exit cma_cleanup(void)
4574 rdma_nl_unregister(RDMA_NL_RDMA_CM); 4571 rdma_nl_unregister(RDMA_NL_RDMA_CM);
4575 ib_unregister_client(&cma_client); 4572 ib_unregister_client(&cma_client);
4576 unregister_netdevice_notifier(&cma_nb); 4573 unregister_netdevice_notifier(&cma_nb);
4577 rdma_addr_unregister_client(&addr_client);
4578 ib_sa_unregister_client(&sa_client); 4574 ib_sa_unregister_client(&sa_client);
4579 unregister_pernet_subsys(&cma_pernet_operations); 4575 unregister_pernet_subsys(&cma_pernet_operations);
4580 destroy_workqueue(cma_wq); 4576 destroy_workqueue(cma_wq);
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h
index a08cc7278980..c2c8b1fdeead 100644
--- a/include/rdma/ib_addr.h
+++ b/include/rdma/ib_addr.h
@@ -49,22 +49,6 @@
49#include <net/ipv6.h> 49#include <net/ipv6.h>
50#include <net/net_namespace.h> 50#include <net/net_namespace.h>
51 51
52struct rdma_addr_client {
53 atomic_t refcount;
54 struct completion comp;
55};
56
57/**
58 * rdma_addr_register_client - Register an address client.
59 */
60void rdma_addr_register_client(struct rdma_addr_client *client);
61
62/**
63 * rdma_addr_unregister_client - Deregister an address client.
64 * @client: Client object to deregister.
65 */
66void rdma_addr_unregister_client(struct rdma_addr_client *client);
67
68/** 52/**
69 * struct rdma_dev_addr - Contains resolved RDMA hardware addresses 53 * struct rdma_dev_addr - Contains resolved RDMA hardware addresses
70 * @src_dev_addr: Source MAC address. 54 * @src_dev_addr: Source MAC address.
@@ -99,7 +83,6 @@ int rdma_translate_ip(const struct sockaddr *addr,
99/** 83/**
100 * rdma_resolve_ip - Resolve source and destination IP addresses to 84 * rdma_resolve_ip - Resolve source and destination IP addresses to
101 * RDMA hardware addresses. 85 * RDMA hardware addresses.
102 * @client: Address client associated with request.
103 * @src_addr: An optional source address to use in the resolution. If a 86 * @src_addr: An optional source address to use in the resolution. If a
104 * source address is not provided, a usable address will be returned via 87 * source address is not provided, a usable address will be returned via
105 * the callback. 88 * the callback.
@@ -112,8 +95,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
112 * or been canceled. A status of 0 indicates success. 95 * or been canceled. A status of 0 indicates success.
113 * @context: User-specified context associated with the call. 96 * @context: User-specified context associated with the call.
114 */ 97 */
115int rdma_resolve_ip(struct rdma_addr_client *client, 98int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
116 struct sockaddr *src_addr, struct sockaddr *dst_addr,
117 struct rdma_dev_addr *addr, int timeout_ms, 99 struct rdma_dev_addr *addr, int timeout_ms,
118 void (*callback)(int status, struct sockaddr *src_addr, 100 void (*callback)(int status, struct sockaddr *src_addr,
119 struct rdma_dev_addr *addr, void *context), 101 struct rdma_dev_addr *addr, void *context),