Skip to content

Commit ee6548d

Browse files
committed
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 <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 44e7505 commit ee6548d

File tree

3 files changed

+6
-58
lines changed

3 files changed

+6
-58
lines changed

drivers/infiniband/core/addr.c

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ struct addr_req {
5656
struct sockaddr_storage src_addr;
5757
struct sockaddr_storage dst_addr;
5858
struct rdma_dev_addr *addr;
59-
struct rdma_addr_client *client;
6059
void *context;
6160
void (*callback)(int status, struct sockaddr *src_addr,
6261
struct rdma_dev_addr *addr, void *context);
@@ -220,28 +219,6 @@ int rdma_addr_size_kss(struct __kernel_sockaddr_storage *addr)
220219
}
221220
EXPORT_SYMBOL(rdma_addr_size_kss);
222221

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-
245222
void rdma_copy_addr(struct rdma_dev_addr *dev_addr,
246223
const struct net_device *dev,
247224
const unsigned char *dst_dev_addr)
@@ -605,14 +582,12 @@ static void process_one_req(struct work_struct *_work)
605582
*/
606583
cancel_delayed_work(&req->work);
607584
list_del_init(&req->list);
608-
put_client(req->client);
609585
kfree(req);
610586
}
611587
spin_unlock_bh(&lock);
612588
}
613589

614-
int rdma_resolve_ip(struct rdma_addr_client *client,
615-
struct sockaddr *src_addr, struct sockaddr *dst_addr,
590+
int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
616591
struct rdma_dev_addr *addr, int timeout_ms,
617592
void (*callback)(int status, struct sockaddr *src_addr,
618593
struct rdma_dev_addr *addr, void *context),
@@ -644,8 +619,6 @@ int rdma_resolve_ip(struct rdma_addr_client *client,
644619
req->addr = addr;
645620
req->callback = callback;
646621
req->context = context;
647-
req->client = client;
648-
atomic_inc(&client->refcount);
649622
INIT_DELAYED_WORK(&req->work, process_one_req);
650623
req->seq = (u32)atomic_inc_return(&ib_nl_addr_request_seq);
651624

@@ -661,7 +634,6 @@ int rdma_resolve_ip(struct rdma_addr_client *client,
661634
break;
662635
default:
663636
ret = req->status;
664-
atomic_dec(&client->refcount);
665637
goto err;
666638
}
667639
return ret;
@@ -722,7 +694,6 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr)
722694
found->callback(-ECANCELED, (struct sockaddr *)&found->src_addr,
723695
found->addr, found->context);
724696

725-
put_client(found->client);
726697
kfree(found);
727698
}
728699
EXPORT_SYMBOL(rdma_addr_cancel);
@@ -761,8 +732,8 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
761732
dev_addr.net = &init_net;
762733

763734
init_completion(&ctx.comp);
764-
ret = rdma_resolve_ip(&self, &sgid_addr._sockaddr, &dgid_addr._sockaddr,
765-
&dev_addr, 1000, resolve_cb, &ctx);
735+
ret = rdma_resolve_ip(&sgid_addr._sockaddr, &dgid_addr._sockaddr,
736+
&dev_addr, 1000, resolve_cb, &ctx);
766737
if (ret)
767738
return ret;
768739

@@ -806,14 +777,13 @@ int addr_init(void)
806777
return -ENOMEM;
807778

808779
register_netevent_notifier(&nb);
809-
rdma_addr_register_client(&self);
810780

811781
return 0;
812782
}
813783

814784
void addr_cleanup(void)
815785
{
816-
rdma_addr_unregister_client(&self);
817786
unregister_netevent_notifier(&nb);
818787
destroy_workqueue(addr_wq);
788+
WARN_ON(!list_empty(&req_list));
819789
}

drivers/infiniband/core/cma.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ static struct ib_client cma_client = {
156156
};
157157

158158
static struct ib_sa_client sa_client;
159-
static struct rdma_addr_client addr_client;
160159
static LIST_HEAD(dev_list);
161160
static LIST_HEAD(listen_any_list);
162161
static DEFINE_MUTEX(lock);
@@ -2910,7 +2909,7 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
29102909
if (dst_addr->sa_family == AF_IB) {
29112910
ret = cma_resolve_ib_addr(id_priv);
29122911
} else {
2913-
ret = rdma_resolve_ip(&addr_client, cma_src_addr(id_priv),
2912+
ret = rdma_resolve_ip(cma_src_addr(id_priv),
29142913
dst_addr, &id->route.addr.dev_addr,
29152914
timeout_ms, addr_handler, id_priv);
29162915
}
@@ -4547,7 +4546,6 @@ static int __init cma_init(void)
45474546
goto err_wq;
45484547

45494548
ib_sa_register_client(&sa_client);
4550-
rdma_addr_register_client(&addr_client);
45514549
register_netdevice_notifier(&cma_nb);
45524550

45534551
ret = ib_register_client(&cma_client);
@@ -4561,7 +4559,6 @@ static int __init cma_init(void)
45614559

45624560
err:
45634561
unregister_netdevice_notifier(&cma_nb);
4564-
rdma_addr_unregister_client(&addr_client);
45654562
ib_sa_unregister_client(&sa_client);
45664563
err_wq:
45674564
destroy_workqueue(cma_wq);
@@ -4574,7 +4571,6 @@ static void __exit cma_cleanup(void)
45744571
rdma_nl_unregister(RDMA_NL_RDMA_CM);
45754572
ib_unregister_client(&cma_client);
45764573
unregister_netdevice_notifier(&cma_nb);
4577-
rdma_addr_unregister_client(&addr_client);
45784574
ib_sa_unregister_client(&sa_client);
45794575
unregister_pernet_subsys(&cma_pernet_operations);
45804576
destroy_workqueue(cma_wq);

include/rdma/ib_addr.h

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,6 @@
4949
#include <net/ipv6.h>
5050
#include <net/net_namespace.h>
5151

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-
6852
/**
6953
* struct rdma_dev_addr - Contains resolved RDMA hardware addresses
7054
* @src_dev_addr: Source MAC address.
@@ -99,7 +83,6 @@ int rdma_translate_ip(const struct sockaddr *addr,
9983
/**
10084
* rdma_resolve_ip - Resolve source and destination IP addresses to
10185
* RDMA hardware addresses.
102-
* @client: Address client associated with request.
10386
* @src_addr: An optional source address to use in the resolution. If a
10487
* source address is not provided, a usable address will be returned via
10588
* the callback.
@@ -112,8 +95,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
11295
* or been canceled. A status of 0 indicates success.
11396
* @context: User-specified context associated with the call.
11497
*/
115-
int rdma_resolve_ip(struct rdma_addr_client *client,
116-
struct sockaddr *src_addr, struct sockaddr *dst_addr,
98+
int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
11799
struct rdma_dev_addr *addr, int timeout_ms,
118100
void (*callback)(int status, struct sockaddr *src_addr,
119101
struct rdma_dev_addr *addr, void *context),

0 commit comments

Comments
 (0)