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>
This commit is contained in:
@@ -56,7 +56,6 @@ struct addr_req {
|
|||||||
struct sockaddr_storage src_addr;
|
struct sockaddr_storage src_addr;
|
||||||
struct sockaddr_storage dst_addr;
|
struct sockaddr_storage dst_addr;
|
||||||
struct rdma_dev_addr *addr;
|
struct rdma_dev_addr *addr;
|
||||||
struct rdma_addr_client *client;
|
|
||||||
void *context;
|
void *context;
|
||||||
void (*callback)(int status, struct sockaddr *src_addr,
|
void (*callback)(int status, struct sockaddr *src_addr,
|
||||||
struct rdma_dev_addr *addr, void *context);
|
struct rdma_dev_addr *addr, void *context);
|
||||||
@@ -220,28 +219,6 @@ int rdma_addr_size_kss(struct __kernel_sockaddr_storage *addr)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(rdma_addr_size_kss);
|
EXPORT_SYMBOL(rdma_addr_size_kss);
|
||||||
|
|
||||||
static struct rdma_addr_client self;
|
|
||||||
|
|
||||||
void rdma_addr_register_client(struct rdma_addr_client *client)
|
|
||||||
{
|
|
||||||
atomic_set(&client->refcount, 1);
|
|
||||||
init_completion(&client->comp);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(rdma_addr_register_client);
|
|
||||||
|
|
||||||
static inline void put_client(struct rdma_addr_client *client)
|
|
||||||
{
|
|
||||||
if (atomic_dec_and_test(&client->refcount))
|
|
||||||
complete(&client->comp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rdma_addr_unregister_client(struct rdma_addr_client *client)
|
|
||||||
{
|
|
||||||
put_client(client);
|
|
||||||
wait_for_completion(&client->comp);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(rdma_addr_unregister_client);
|
|
||||||
|
|
||||||
void rdma_copy_addr(struct rdma_dev_addr *dev_addr,
|
void rdma_copy_addr(struct rdma_dev_addr *dev_addr,
|
||||||
const struct net_device *dev,
|
const struct net_device *dev,
|
||||||
const unsigned char *dst_dev_addr)
|
const unsigned char *dst_dev_addr)
|
||||||
@@ -605,14 +582,12 @@ static void process_one_req(struct work_struct *_work)
|
|||||||
*/
|
*/
|
||||||
cancel_delayed_work(&req->work);
|
cancel_delayed_work(&req->work);
|
||||||
list_del_init(&req->list);
|
list_del_init(&req->list);
|
||||||
put_client(req->client);
|
|
||||||
kfree(req);
|
kfree(req);
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&lock);
|
spin_unlock_bh(&lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rdma_resolve_ip(struct rdma_addr_client *client,
|
int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
|
||||||
struct sockaddr *src_addr, struct sockaddr *dst_addr,
|
|
||||||
struct rdma_dev_addr *addr, int timeout_ms,
|
struct rdma_dev_addr *addr, int timeout_ms,
|
||||||
void (*callback)(int status, struct sockaddr *src_addr,
|
void (*callback)(int status, struct sockaddr *src_addr,
|
||||||
struct rdma_dev_addr *addr, void *context),
|
struct rdma_dev_addr *addr, void *context),
|
||||||
@@ -644,8 +619,6 @@ int rdma_resolve_ip(struct rdma_addr_client *client,
|
|||||||
req->addr = addr;
|
req->addr = addr;
|
||||||
req->callback = callback;
|
req->callback = callback;
|
||||||
req->context = context;
|
req->context = context;
|
||||||
req->client = client;
|
|
||||||
atomic_inc(&client->refcount);
|
|
||||||
INIT_DELAYED_WORK(&req->work, process_one_req);
|
INIT_DELAYED_WORK(&req->work, process_one_req);
|
||||||
req->seq = (u32)atomic_inc_return(&ib_nl_addr_request_seq);
|
req->seq = (u32)atomic_inc_return(&ib_nl_addr_request_seq);
|
||||||
|
|
||||||
@@ -661,7 +634,6 @@ int rdma_resolve_ip(struct rdma_addr_client *client,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ret = req->status;
|
ret = req->status;
|
||||||
atomic_dec(&client->refcount);
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@@ -722,7 +694,6 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr)
|
|||||||
found->callback(-ECANCELED, (struct sockaddr *)&found->src_addr,
|
found->callback(-ECANCELED, (struct sockaddr *)&found->src_addr,
|
||||||
found->addr, found->context);
|
found->addr, found->context);
|
||||||
|
|
||||||
put_client(found->client);
|
|
||||||
kfree(found);
|
kfree(found);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(rdma_addr_cancel);
|
EXPORT_SYMBOL(rdma_addr_cancel);
|
||||||
@@ -761,7 +732,7 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
|
|||||||
dev_addr.net = &init_net;
|
dev_addr.net = &init_net;
|
||||||
|
|
||||||
init_completion(&ctx.comp);
|
init_completion(&ctx.comp);
|
||||||
ret = rdma_resolve_ip(&self, &sgid_addr._sockaddr, &dgid_addr._sockaddr,
|
ret = rdma_resolve_ip(&sgid_addr._sockaddr, &dgid_addr._sockaddr,
|
||||||
&dev_addr, 1000, resolve_cb, &ctx);
|
&dev_addr, 1000, resolve_cb, &ctx);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -806,14 +777,13 @@ int addr_init(void)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
register_netevent_notifier(&nb);
|
register_netevent_notifier(&nb);
|
||||||
rdma_addr_register_client(&self);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addr_cleanup(void)
|
void addr_cleanup(void)
|
||||||
{
|
{
|
||||||
rdma_addr_unregister_client(&self);
|
|
||||||
unregister_netevent_notifier(&nb);
|
unregister_netevent_notifier(&nb);
|
||||||
destroy_workqueue(addr_wq);
|
destroy_workqueue(addr_wq);
|
||||||
|
WARN_ON(!list_empty(&req_list));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,6 @@ static struct ib_client cma_client = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct ib_sa_client sa_client;
|
static struct ib_sa_client sa_client;
|
||||||
static struct rdma_addr_client addr_client;
|
|
||||||
static LIST_HEAD(dev_list);
|
static LIST_HEAD(dev_list);
|
||||||
static LIST_HEAD(listen_any_list);
|
static LIST_HEAD(listen_any_list);
|
||||||
static DEFINE_MUTEX(lock);
|
static DEFINE_MUTEX(lock);
|
||||||
@@ -2910,7 +2909,7 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
|
|||||||
if (dst_addr->sa_family == AF_IB) {
|
if (dst_addr->sa_family == AF_IB) {
|
||||||
ret = cma_resolve_ib_addr(id_priv);
|
ret = cma_resolve_ib_addr(id_priv);
|
||||||
} else {
|
} else {
|
||||||
ret = rdma_resolve_ip(&addr_client, cma_src_addr(id_priv),
|
ret = rdma_resolve_ip(cma_src_addr(id_priv),
|
||||||
dst_addr, &id->route.addr.dev_addr,
|
dst_addr, &id->route.addr.dev_addr,
|
||||||
timeout_ms, addr_handler, id_priv);
|
timeout_ms, addr_handler, id_priv);
|
||||||
}
|
}
|
||||||
@@ -4547,7 +4546,6 @@ static int __init cma_init(void)
|
|||||||
goto err_wq;
|
goto err_wq;
|
||||||
|
|
||||||
ib_sa_register_client(&sa_client);
|
ib_sa_register_client(&sa_client);
|
||||||
rdma_addr_register_client(&addr_client);
|
|
||||||
register_netdevice_notifier(&cma_nb);
|
register_netdevice_notifier(&cma_nb);
|
||||||
|
|
||||||
ret = ib_register_client(&cma_client);
|
ret = ib_register_client(&cma_client);
|
||||||
@@ -4561,7 +4559,6 @@ static int __init cma_init(void)
|
|||||||
|
|
||||||
err:
|
err:
|
||||||
unregister_netdevice_notifier(&cma_nb);
|
unregister_netdevice_notifier(&cma_nb);
|
||||||
rdma_addr_unregister_client(&addr_client);
|
|
||||||
ib_sa_unregister_client(&sa_client);
|
ib_sa_unregister_client(&sa_client);
|
||||||
err_wq:
|
err_wq:
|
||||||
destroy_workqueue(cma_wq);
|
destroy_workqueue(cma_wq);
|
||||||
@@ -4574,7 +4571,6 @@ static void __exit cma_cleanup(void)
|
|||||||
rdma_nl_unregister(RDMA_NL_RDMA_CM);
|
rdma_nl_unregister(RDMA_NL_RDMA_CM);
|
||||||
ib_unregister_client(&cma_client);
|
ib_unregister_client(&cma_client);
|
||||||
unregister_netdevice_notifier(&cma_nb);
|
unregister_netdevice_notifier(&cma_nb);
|
||||||
rdma_addr_unregister_client(&addr_client);
|
|
||||||
ib_sa_unregister_client(&sa_client);
|
ib_sa_unregister_client(&sa_client);
|
||||||
unregister_pernet_subsys(&cma_pernet_operations);
|
unregister_pernet_subsys(&cma_pernet_operations);
|
||||||
destroy_workqueue(cma_wq);
|
destroy_workqueue(cma_wq);
|
||||||
|
|||||||
@@ -49,22 +49,6 @@
|
|||||||
#include <net/ipv6.h>
|
#include <net/ipv6.h>
|
||||||
#include <net/net_namespace.h>
|
#include <net/net_namespace.h>
|
||||||
|
|
||||||
struct rdma_addr_client {
|
|
||||||
atomic_t refcount;
|
|
||||||
struct completion comp;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rdma_addr_register_client - Register an address client.
|
|
||||||
*/
|
|
||||||
void rdma_addr_register_client(struct rdma_addr_client *client);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rdma_addr_unregister_client - Deregister an address client.
|
|
||||||
* @client: Client object to deregister.
|
|
||||||
*/
|
|
||||||
void rdma_addr_unregister_client(struct rdma_addr_client *client);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct rdma_dev_addr - Contains resolved RDMA hardware addresses
|
* struct rdma_dev_addr - Contains resolved RDMA hardware addresses
|
||||||
* @src_dev_addr: Source MAC address.
|
* @src_dev_addr: Source MAC address.
|
||||||
@@ -99,7 +83,6 @@ int rdma_translate_ip(const struct sockaddr *addr,
|
|||||||
/**
|
/**
|
||||||
* rdma_resolve_ip - Resolve source and destination IP addresses to
|
* rdma_resolve_ip - Resolve source and destination IP addresses to
|
||||||
* RDMA hardware addresses.
|
* RDMA hardware addresses.
|
||||||
* @client: Address client associated with request.
|
|
||||||
* @src_addr: An optional source address to use in the resolution. If a
|
* @src_addr: An optional source address to use in the resolution. If a
|
||||||
* source address is not provided, a usable address will be returned via
|
* source address is not provided, a usable address will be returned via
|
||||||
* the callback.
|
* the callback.
|
||||||
@@ -112,8 +95,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
|
|||||||
* or been canceled. A status of 0 indicates success.
|
* or been canceled. A status of 0 indicates success.
|
||||||
* @context: User-specified context associated with the call.
|
* @context: User-specified context associated with the call.
|
||||||
*/
|
*/
|
||||||
int rdma_resolve_ip(struct rdma_addr_client *client,
|
int rdma_resolve_ip(struct sockaddr *src_addr, struct sockaddr *dst_addr,
|
||||||
struct sockaddr *src_addr, struct sockaddr *dst_addr,
|
|
||||||
struct rdma_dev_addr *addr, int timeout_ms,
|
struct rdma_dev_addr *addr, int timeout_ms,
|
||||||
void (*callback)(int status, struct sockaddr *src_addr,
|
void (*callback)(int status, struct sockaddr *src_addr,
|
||||||
struct rdma_dev_addr *addr, void *context),
|
struct rdma_dev_addr *addr, void *context),
|
||||||
|
|||||||
Reference in New Issue
Block a user