--- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -3452,10 +3452,12 @@ static int cma_check_linklocal(struct rdma_dev_addr *dev_addr, int rdma_listen(struct rdma_cm_id *id, int backlog) { struct rdma_id_private *id_priv; + bool idle; int ret; id_priv = container_of(id, struct rdma_id_private, id); if (id_priv->state == RDMA_CM_IDLE) { + idle = true; id->route.addr.src_addr.ss_family = AF_INET; ret = rdma_bind_addr(id, cma_src_addr(id_priv)); if (ret) @@ -3492,6 +3494,8 @@ int rdma_listen(struct rdma_cm_id *id, int backlog) err: id_priv->backlog = 0; cma_comp_exch(id_priv, RDMA_CM_LISTEN, RDMA_CM_ADDR_BOUND); + if (idle) + cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_IDLE); return ret; } EXPORT_SYMBOL(rdma_listen);