diff options
author | Jason Gunthorpe <jgg@mellanox.com> | 2018-04-03 00:52:04 -0400 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2018-04-17 21:42:50 -0400 |
commit | ee6548d1d98df7df3b9c8103a42cf68b31c29417 (patch) | |
tree | eb9a225dac8ea5a1706f800b4016220d324fba4a | |
parent | 44e75052bc2ae4d39386c1d9e218861639905873 (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.c | 38 | ||||
-rw-r--r-- | drivers/infiniband/core/cma.c | 6 | ||||
-rw-r--r-- | include/rdma/ib_addr.h | 20 |
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 | } |
221 | EXPORT_SYMBOL(rdma_addr_size_kss); | 220 | EXPORT_SYMBOL(rdma_addr_size_kss); |
222 | 221 | ||
223 | static struct rdma_addr_client self; | ||
224 | |||
225 | void rdma_addr_register_client(struct rdma_addr_client *client) | ||
226 | { | ||
227 | atomic_set(&client->refcount, 1); | ||
228 | init_completion(&client->comp); | ||
229 | } | ||
230 | EXPORT_SYMBOL(rdma_addr_register_client); | ||
231 | |||
232 | static inline void put_client(struct rdma_addr_client *client) | ||
233 | { | ||
234 | if (atomic_dec_and_test(&client->refcount)) | ||
235 | complete(&client->comp); | ||
236 | } | ||
237 | |||
238 | void rdma_addr_unregister_client(struct rdma_addr_client *client) | ||
239 | { | ||
240 | put_client(client); | ||
241 | wait_for_completion(&client->comp); | ||
242 | } | ||
243 | EXPORT_SYMBOL(rdma_addr_unregister_client); | ||
244 | |||
245 | void rdma_copy_addr(struct rdma_dev_addr *dev_addr, | 222 | void 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 | ||
614 | int rdma_resolve_ip(struct rdma_addr_client *client, | 590 | int 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 | } |
728 | EXPORT_SYMBOL(rdma_addr_cancel); | 699 | EXPORT_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 | ||
814 | void addr_cleanup(void) | 784 | void 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 | ||
158 | static struct ib_sa_client sa_client; | 158 | static struct ib_sa_client sa_client; |
159 | static struct rdma_addr_client addr_client; | ||
160 | static LIST_HEAD(dev_list); | 159 | static LIST_HEAD(dev_list); |
161 | static LIST_HEAD(listen_any_list); | 160 | static LIST_HEAD(listen_any_list); |
162 | static DEFINE_MUTEX(lock); | 161 | static 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 | ||
4562 | err: | 4560 | err: |
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); |
4566 | err_wq: | 4563 | err_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 | ||
52 | struct rdma_addr_client { | ||
53 | atomic_t refcount; | ||
54 | struct completion comp; | ||
55 | }; | ||
56 | |||
57 | /** | ||
58 | * rdma_addr_register_client - Register an address client. | ||
59 | */ | ||
60 | void 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 | */ | ||
66 | void 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 | */ |
115 | int rdma_resolve_ip(struct rdma_addr_client *client, | 98 | int 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), |