diff options
Diffstat (limited to 'drivers/infiniband/core/cma.c')
-rw-r--r-- | drivers/infiniband/core/cma.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 9ae4f3a67c70..845090b0859c 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
@@ -63,6 +63,7 @@ static struct ib_client cma_client = { | |||
63 | }; | 63 | }; |
64 | 64 | ||
65 | static struct ib_sa_client sa_client; | 65 | static struct ib_sa_client sa_client; |
66 | static struct rdma_addr_client addr_client; | ||
66 | static LIST_HEAD(dev_list); | 67 | static LIST_HEAD(dev_list); |
67 | static LIST_HEAD(listen_any_list); | 68 | static LIST_HEAD(listen_any_list); |
68 | static DEFINE_MUTEX(lock); | 69 | static DEFINE_MUTEX(lock); |
@@ -1625,8 +1626,8 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, | |||
1625 | if (cma_any_addr(dst_addr)) | 1626 | if (cma_any_addr(dst_addr)) |
1626 | ret = cma_resolve_loopback(id_priv); | 1627 | ret = cma_resolve_loopback(id_priv); |
1627 | else | 1628 | else |
1628 | ret = rdma_resolve_ip(&id->route.addr.src_addr, dst_addr, | 1629 | ret = rdma_resolve_ip(&addr_client, &id->route.addr.src_addr, |
1629 | &id->route.addr.dev_addr, | 1630 | dst_addr, &id->route.addr.dev_addr, |
1630 | timeout_ms, addr_handler, id_priv); | 1631 | timeout_ms, addr_handler, id_priv); |
1631 | if (ret) | 1632 | if (ret) |
1632 | goto err; | 1633 | goto err; |
@@ -1762,22 +1763,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) | |||
1762 | 1763 | ||
1763 | if (!cma_any_addr(addr)) { | 1764 | if (!cma_any_addr(addr)) { |
1764 | ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); | 1765 | ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); |
1765 | if (!ret) { | ||
1766 | mutex_lock(&lock); | ||
1767 | ret = cma_acquire_dev(id_priv); | ||
1768 | mutex_unlock(&lock); | ||
1769 | } | ||
1770 | if (ret) | 1766 | if (ret) |
1771 | goto err; | 1767 | goto err1; |
1768 | |||
1769 | mutex_lock(&lock); | ||
1770 | ret = cma_acquire_dev(id_priv); | ||
1771 | mutex_unlock(&lock); | ||
1772 | if (ret) | ||
1773 | goto err1; | ||
1772 | } | 1774 | } |
1773 | 1775 | ||
1774 | memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr)); | 1776 | memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr)); |
1775 | ret = cma_get_port(id_priv); | 1777 | ret = cma_get_port(id_priv); |
1776 | if (ret) | 1778 | if (ret) |
1777 | goto err; | 1779 | goto err2; |
1778 | 1780 | ||
1779 | return 0; | 1781 | return 0; |
1780 | err: | 1782 | err2: |
1783 | if (!cma_any_addr(addr)) { | ||
1784 | mutex_lock(&lock); | ||
1785 | cma_detach_from_dev(id_priv); | ||
1786 | mutex_unlock(&lock); | ||
1787 | } | ||
1788 | err1: | ||
1781 | cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE); | 1789 | cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE); |
1782 | return ret; | 1790 | return ret; |
1783 | } | 1791 | } |
@@ -2210,6 +2218,7 @@ static int cma_init(void) | |||
2210 | return -ENOMEM; | 2218 | return -ENOMEM; |
2211 | 2219 | ||
2212 | ib_sa_register_client(&sa_client); | 2220 | ib_sa_register_client(&sa_client); |
2221 | rdma_addr_register_client(&addr_client); | ||
2213 | 2222 | ||
2214 | ret = ib_register_client(&cma_client); | 2223 | ret = ib_register_client(&cma_client); |
2215 | if (ret) | 2224 | if (ret) |
@@ -2217,6 +2226,7 @@ static int cma_init(void) | |||
2217 | return 0; | 2226 | return 0; |
2218 | 2227 | ||
2219 | err: | 2228 | err: |
2229 | rdma_addr_unregister_client(&addr_client); | ||
2220 | ib_sa_unregister_client(&sa_client); | 2230 | ib_sa_unregister_client(&sa_client); |
2221 | destroy_workqueue(cma_wq); | 2231 | destroy_workqueue(cma_wq); |
2222 | return ret; | 2232 | return ret; |
@@ -2225,6 +2235,7 @@ err: | |||
2225 | static void cma_cleanup(void) | 2235 | static void cma_cleanup(void) |
2226 | { | 2236 | { |
2227 | ib_unregister_client(&cma_client); | 2237 | ib_unregister_client(&cma_client); |
2238 | rdma_addr_unregister_client(&addr_client); | ||
2228 | ib_sa_unregister_client(&sa_client); | 2239 | ib_sa_unregister_client(&sa_client); |
2229 | destroy_workqueue(cma_wq); | 2240 | destroy_workqueue(cma_wq); |
2230 | idr_destroy(&sdp_ps); | 2241 | idr_destroy(&sdp_ps); |