projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
RDMA/amso1100: Fix unitialized pseudo_netdev accessed in c2_register_device
[powerpc.git]
/
drivers
/
infiniband
/
core
/
cma.c
diff --git
a/drivers/infiniband/core/cma.c
b/drivers/infiniband/core/cma.c
index
9ae4f3a
..
845090b
100644
(file)
--- a/
drivers/infiniband/core/cma.c
+++ b/
drivers/infiniband/core/cma.c
@@
-63,6
+63,7
@@
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(listen_any_list);
static DEFINE_MUTEX(lock);
static LIST_HEAD(dev_list);
static LIST_HEAD(listen_any_list);
static DEFINE_MUTEX(lock);
@@
-1625,8
+1626,8
@@
int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
if (cma_any_addr(dst_addr))
ret = cma_resolve_loopback(id_priv);
else
if (cma_any_addr(dst_addr))
ret = cma_resolve_loopback(id_priv);
else
- ret = rdma_resolve_ip(&
id->route.addr.src_addr, dst
_addr,
- &id->route.addr.dev_addr,
+ ret = rdma_resolve_ip(&
addr_client, &id->route.addr.src
_addr,
+
dst_addr,
&id->route.addr.dev_addr,
timeout_ms, addr_handler, id_priv);
if (ret)
goto err;
timeout_ms, addr_handler, id_priv);
if (ret)
goto err;
@@
-1762,22
+1763,29
@@
int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
if (!cma_any_addr(addr)) {
ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
if (!cma_any_addr(addr)) {
ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
- if (!ret) {
- mutex_lock(&lock);
- ret = cma_acquire_dev(id_priv);
- mutex_unlock(&lock);
- }
if (ret)
if (ret)
- goto err;
+ goto err1;
+
+ mutex_lock(&lock);
+ ret = cma_acquire_dev(id_priv);
+ mutex_unlock(&lock);
+ if (ret)
+ goto err1;
}
memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
ret = cma_get_port(id_priv);
if (ret)
}
memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
ret = cma_get_port(id_priv);
if (ret)
- goto err;
+ goto err
2
;
return 0;
return 0;
-err:
+err2:
+ if (!cma_any_addr(addr)) {
+ mutex_lock(&lock);
+ cma_detach_from_dev(id_priv);
+ mutex_unlock(&lock);
+ }
+err1:
cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
return ret;
}
cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
return ret;
}
@@
-2210,6
+2218,7
@@
static int cma_init(void)
return -ENOMEM;
ib_sa_register_client(&sa_client);
return -ENOMEM;
ib_sa_register_client(&sa_client);
+ rdma_addr_register_client(&addr_client);
ret = ib_register_client(&cma_client);
if (ret)
ret = ib_register_client(&cma_client);
if (ret)
@@
-2217,6
+2226,7
@@
static int cma_init(void)
return 0;
err:
return 0;
err:
+ rdma_addr_unregister_client(&addr_client);
ib_sa_unregister_client(&sa_client);
destroy_workqueue(cma_wq);
return ret;
ib_sa_unregister_client(&sa_client);
destroy_workqueue(cma_wq);
return ret;
@@
-2225,6
+2235,7
@@
err:
static void cma_cleanup(void)
{
ib_unregister_client(&cma_client);
static void cma_cleanup(void)
{
ib_unregister_client(&cma_client);
+ rdma_addr_unregister_client(&addr_client);
ib_sa_unregister_client(&sa_client);
destroy_workqueue(cma_wq);
idr_destroy(&sdp_ps);
ib_sa_unregister_client(&sa_client);
destroy_workqueue(cma_wq);
idr_destroy(&sdp_ps);