Skip to content

Commit 6e2a924

Browse files
committed
RDMA/core: Refactor rdma_bind_addr (simplified)
1 parent 1d91855 commit 6e2a924

File tree

1 file changed

+25
-18
lines changed
  • drivers/infiniband/core

1 file changed

+25
-18
lines changed

drivers/infiniband/core/cma.c

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3544,10 +3544,12 @@ static int cma_resolve_ib_addr(struct rdma_id_private *id_priv)
35443544
static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
35453545
const struct sockaddr *dst_addr)
35463546
{
3547+
struct rdma_id_private *id_priv =
3548+
container_of(id, struct rdma_id_private, id);
35473549
struct sockaddr_storage zero_sock = {};
35483550

35493551
if (src_addr && src_addr->sa_family)
3550-
return rdma_bind_addr(id, src_addr);
3552+
return rdma_bind_addr_dst(id_priv, src_addr, dst_addr);
35513553

35523554
/*
35533555
* When the src_addr is not specified, automatically supply an any addr
@@ -3567,7 +3569,7 @@ static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
35673569
((struct sockaddr_ib *)&zero_sock)->sib_pkey =
35683570
((struct sockaddr_ib *)dst_addr)->sib_pkey;
35693571
}
3570-
return rdma_bind_addr(id, (struct sockaddr *)&zero_sock);
3572+
return rdma_bind_addr_dst(id_priv, (struct sockaddr *)&zero_sock, dst_addr);
35713573
}
35723574

35733575
/*
@@ -3582,17 +3584,15 @@ static int resolve_prepare_src(struct rdma_id_private *id_priv,
35823584
{
35833585
int ret;
35843586

3585-
memcpy(cma_dst_addr(id_priv), dst_addr, rdma_addr_size(dst_addr));
35863587
if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_ADDR_QUERY)) {
35873588
/* For a well behaved ULP state will be RDMA_CM_IDLE */
35883589
ret = cma_bind_addr(&id_priv->id, src_addr, dst_addr);
35893590
if (ret)
3590-
goto err_dst;
3591+
return ret;
35913592
if (WARN_ON(!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND,
3592-
RDMA_CM_ADDR_QUERY))) {
3593-
ret = -EINVAL;
3594-
goto err_dst;
3595-
}
3593+
RDMA_CM_ADDR_QUERY)))
3594+
return -EINVAL;
3595+
35963596
}
35973597

35983598
if (cma_family(id_priv) != dst_addr->sa_family) {
@@ -3603,8 +3603,6 @@ static int resolve_prepare_src(struct rdma_id_private *id_priv,
36033603

36043604
err_state:
36053605
cma_comp_exch(id_priv, RDMA_CM_ADDR_QUERY, RDMA_CM_ADDR_BOUND);
3606-
err_dst:
3607-
memset(cma_dst_addr(id_priv), 0, rdma_addr_size(dst_addr));
36083606
return ret;
36093607
}
36103608

@@ -4058,27 +4056,26 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
40584056
}
40594057
EXPORT_SYMBOL(rdma_listen);
40604058

4061-
int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
4059+
static int rdma_bind_addr_dst(struct rdma_id_private *id_priv,
4060+
struct sockaddr *addr, const struct sockaddr *daddr)
40624061
{
4063-
struct rdma_id_private *id_priv;
4062+
struct sockaddr *id_daddr;
40644063
int ret;
4065-
struct sockaddr *daddr;
40664064

40674065
if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6 &&
40684066
addr->sa_family != AF_IB)
40694067
return -EAFNOSUPPORT;
40704068

4071-
id_priv = container_of(id, struct rdma_id_private, id);
40724069
if (!cma_comp_exch(id_priv, RDMA_CM_IDLE, RDMA_CM_ADDR_BOUND))
40734070
return -EINVAL;
40744071

4075-
ret = cma_check_linklocal(&id->route.addr.dev_addr, addr);
4072+
ret = cma_check_linklocal(&id_priv->id.route.addr.dev_addr, addr);
40764073
if (ret)
40774074
goto err1;
40784075

40794076
memcpy(cma_src_addr(id_priv), addr, rdma_addr_size(addr));
40804077
if (!cma_any_addr(addr)) {
4081-
ret = cma_translate_addr(addr, &id->route.addr.dev_addr);
4078+
ret = cma_translate_addr(addr, &id_priv->id.route.addr.dev_addr);
40824079
if (ret)
40834080
goto err1;
40844081

@@ -4098,8 +4095,10 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
40984095
}
40994096
#endif
41004097
}
4101-
daddr = cma_dst_addr(id_priv);
4102-
daddr->sa_family = addr->sa_family;
4098+
id_daddr = cma_dst_addr(id_priv);
4099+
if (daddr != id_daddr)
4100+
memcpy(id_daddr, daddr, rdma_addr_size(addr));
4101+
id_daddr->sa_family = addr->sa_family;
41034102

41044103
ret = cma_get_port(id_priv);
41054104
if (ret)
@@ -4115,6 +4114,14 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
41154114
cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_IDLE);
41164115
return ret;
41174116
}
4117+
4118+
int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
4119+
{
4120+
struct rdma_id_private *id_priv =
4121+
container_of(id, struct rdma_id_private, id);
4122+
4123+
return rdma_bind_addr_dst(id_priv, addr, cma_dst_addr(id_priv));
4124+
}
41184125
EXPORT_SYMBOL(rdma_bind_addr);
41194126

41204127
static int cma_format_hdr(void *hdr, struct rdma_id_private *id_priv)

0 commit comments

Comments
 (0)