Lines Matching refs:id_priv

138 	struct rdma_id_private *id_priv;  in rdma_iw_cm_id()  local
140 id_priv = container_of(id, struct rdma_id_private, id); in rdma_iw_cm_id()
142 return id_priv->cm_id.iw; in rdma_iw_cm_id()
153 struct rdma_id_private *id_priv = in rdma_res_to_id() local
156 return &id_priv->id; in rdma_res_to_id()
355 struct rdma_id_private *id_priv; member
406 static int cma_comp_exch(struct rdma_id_private *id_priv, in cma_comp_exch() argument
419 lockdep_assert_held(&id_priv->handler_mutex); in cma_comp_exch()
421 spin_lock_irqsave(&id_priv->lock, flags); in cma_comp_exch()
422 if ((ret = (id_priv->state == comp))) in cma_comp_exch()
423 id_priv->state = exch; in cma_comp_exch()
424 spin_unlock_irqrestore(&id_priv->lock, flags); in cma_comp_exch()
438 static struct sockaddr *cma_src_addr(struct rdma_id_private *id_priv) in cma_src_addr() argument
440 return (struct sockaddr *)&id_priv->id.route.addr.src_addr; in cma_src_addr()
443 static inline struct sockaddr *cma_dst_addr(struct rdma_id_private *id_priv) in cma_dst_addr() argument
445 return (struct sockaddr *)&id_priv->id.route.addr.dst_addr; in cma_dst_addr()
471 struct rdma_id_private *id_priv = list_first_entry( in compare_netdev_and_ip() local
473 int ifindex_b = id_priv->id.route.addr.dev_addr.bound_dev_if; in compare_netdev_and_ip()
474 struct sockaddr *sb = cma_dst_addr(id_priv); in compare_netdev_and_ip()
562 static void cma_remove_id_from_tree(struct rdma_id_private *id_priv) in cma_remove_id_from_tree() argument
568 if (list_empty(&id_priv->id_list_entry)) in cma_remove_id_from_tree()
572 id_priv->id.route.addr.dev_addr.bound_dev_if, in cma_remove_id_from_tree()
573 cma_dst_addr(id_priv)); in cma_remove_id_from_tree()
577 list_del_init(&id_priv->id_list_entry); in cma_remove_id_from_tree()
586 static void _cma_attach_to_dev(struct rdma_id_private *id_priv, in _cma_attach_to_dev() argument
590 id_priv->cma_dev = cma_dev; in _cma_attach_to_dev()
591 id_priv->id.device = cma_dev->device; in _cma_attach_to_dev()
592 id_priv->id.route.addr.dev_addr.transport = in _cma_attach_to_dev()
594 list_add_tail(&id_priv->device_item, &cma_dev->id_list); in _cma_attach_to_dev()
596 trace_cm_id_attach(id_priv, cma_dev->device); in _cma_attach_to_dev()
599 static void cma_attach_to_dev(struct rdma_id_private *id_priv, in cma_attach_to_dev() argument
602 _cma_attach_to_dev(id_priv, cma_dev); in cma_attach_to_dev()
603 id_priv->gid_type = in cma_attach_to_dev()
604 cma_dev->default_gid_type[id_priv->id.port_num - in cma_attach_to_dev()
608 static void cma_release_dev(struct rdma_id_private *id_priv) in cma_release_dev() argument
611 list_del_init(&id_priv->device_item); in cma_release_dev()
612 cma_dev_put(id_priv->cma_dev); in cma_release_dev()
613 id_priv->cma_dev = NULL; in cma_release_dev()
614 id_priv->id.device = NULL; in cma_release_dev()
615 if (id_priv->id.route.addr.dev_addr.sgid_attr) { in cma_release_dev()
616 rdma_put_gid_attr(id_priv->id.route.addr.dev_addr.sgid_attr); in cma_release_dev()
617 id_priv->id.route.addr.dev_addr.sgid_attr = NULL; in cma_release_dev()
622 static inline unsigned short cma_family(struct rdma_id_private *id_priv) in cma_family() argument
624 return id_priv->id.route.addr.src_addr.ss_family; in cma_family()
627 static int cma_set_default_qkey(struct rdma_id_private *id_priv) in cma_set_default_qkey() argument
632 switch (id_priv->id.ps) { in cma_set_default_qkey()
635 id_priv->qkey = RDMA_UDP_QKEY; in cma_set_default_qkey()
638 ib_addr_get_mgid(&id_priv->id.route.addr.dev_addr, &rec.mgid); in cma_set_default_qkey()
639 ret = ib_sa_get_mcmember_rec(id_priv->id.device, in cma_set_default_qkey()
640 id_priv->id.port_num, &rec.mgid, in cma_set_default_qkey()
643 id_priv->qkey = be32_to_cpu(rec.qkey); in cma_set_default_qkey()
651 static int cma_set_qkey(struct rdma_id_private *id_priv, u32 qkey) in cma_set_qkey() argument
654 (id_priv->qkey && (id_priv->qkey != qkey))) in cma_set_qkey()
657 id_priv->qkey = qkey; in cma_set_qkey()
686 struct rdma_id_private *id_priv) in cma_validate_port() argument
688 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_validate_port()
694 if (!rdma_dev_access_netns(device, id_priv->id.route.addr.dev_addr.net)) in cma_validate_port()
738 static void cma_bind_sgid_attr(struct rdma_id_private *id_priv, in cma_bind_sgid_attr() argument
741 WARN_ON(id_priv->id.route.addr.dev_addr.sgid_attr); in cma_bind_sgid_attr()
742 id_priv->id.route.addr.dev_addr.sgid_attr = sgid_attr; in cma_bind_sgid_attr()
754 static int cma_acquire_dev_by_src_ip(struct rdma_id_private *id_priv) in cma_acquire_dev_by_src_ip() argument
756 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_acquire_dev_by_src_ip()
765 id_priv->id.ps == RDMA_PS_IPOIB) in cma_acquire_dev_by_src_ip()
768 rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr, in cma_acquire_dev_by_src_ip()
781 gid_type, gidp, id_priv); in cma_acquire_dev_by_src_ip()
783 id_priv->id.port_num = port; in cma_acquire_dev_by_src_ip()
784 cma_bind_sgid_attr(id_priv, sgid_attr); in cma_acquire_dev_by_src_ip()
785 cma_attach_to_dev(id_priv, cma_dev); in cma_acquire_dev_by_src_ip()
807 static int cma_ib_acquire_dev(struct rdma_id_private *id_priv, in cma_ib_acquire_dev() argument
811 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_ib_acquire_dev()
817 id_priv->id.ps == RDMA_PS_IPOIB) in cma_ib_acquire_dev()
821 rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr, in cma_ib_acquire_dev()
829 gid_type, &gid, id_priv); in cma_ib_acquire_dev()
833 id_priv->id.port_num = req->port; in cma_ib_acquire_dev()
834 cma_bind_sgid_attr(id_priv, sgid_attr); in cma_ib_acquire_dev()
840 cma_attach_to_dev(id_priv, listen_id_priv->cma_dev); in cma_ib_acquire_dev()
842 rdma_restrack_add(&id_priv->res); in cma_ib_acquire_dev()
846 static int cma_iw_acquire_dev(struct rdma_id_private *id_priv, in cma_iw_acquire_dev() argument
849 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_iw_acquire_dev()
858 id_priv->id.ps == RDMA_PS_IPOIB) in cma_iw_acquire_dev()
870 gid_type, &gid, id_priv); in cma_iw_acquire_dev()
872 id_priv->id.port_num = port; in cma_iw_acquire_dev()
873 cma_bind_sgid_attr(id_priv, sgid_attr); in cma_iw_acquire_dev()
886 gid_type, &gid, id_priv); in cma_iw_acquire_dev()
888 id_priv->id.port_num = port; in cma_iw_acquire_dev()
889 cma_bind_sgid_attr(id_priv, sgid_attr); in cma_iw_acquire_dev()
898 cma_attach_to_dev(id_priv, cma_dev); in cma_iw_acquire_dev()
899 rdma_restrack_add(&id_priv->res); in cma_iw_acquire_dev()
909 static int cma_resolve_ib_dev(struct rdma_id_private *id_priv) in cma_resolve_ib_dev() argument
921 addr = (struct sockaddr_ib *) cma_dst_addr(id_priv); in cma_resolve_ib_dev()
947 id_priv->id.port_num = p; in cma_resolve_ib_dev()
956 id_priv->id.port_num = p; in cma_resolve_ib_dev()
966 cma_attach_to_dev(id_priv, cma_dev); in cma_resolve_ib_dev()
967 rdma_restrack_add(&id_priv->res); in cma_resolve_ib_dev()
969 addr = (struct sockaddr_ib *)cma_src_addr(id_priv); in cma_resolve_ib_dev()
971 cma_translate_ib(addr, &id_priv->id.route.addr.dev_addr); in cma_resolve_ib_dev()
975 static void cma_id_get(struct rdma_id_private *id_priv) in cma_id_get() argument
977 refcount_inc(&id_priv->refcount); in cma_id_get()
980 static void cma_id_put(struct rdma_id_private *id_priv) in cma_id_put() argument
982 if (refcount_dec_and_test(&id_priv->refcount)) in cma_id_put()
983 complete(&id_priv->comp); in cma_id_put()
991 struct rdma_id_private *id_priv; in __rdma_create_id() local
993 id_priv = kzalloc(sizeof *id_priv, GFP_KERNEL); in __rdma_create_id()
994 if (!id_priv) in __rdma_create_id()
997 id_priv->state = RDMA_CM_IDLE; in __rdma_create_id()
998 id_priv->id.context = context; in __rdma_create_id()
999 id_priv->id.event_handler = event_handler; in __rdma_create_id()
1000 id_priv->id.ps = ps; in __rdma_create_id()
1001 id_priv->id.qp_type = qp_type; in __rdma_create_id()
1002 id_priv->tos_set = false; in __rdma_create_id()
1003 id_priv->timeout_set = false; in __rdma_create_id()
1004 id_priv->min_rnr_timer_set = false; in __rdma_create_id()
1005 id_priv->gid_type = IB_GID_TYPE_IB; in __rdma_create_id()
1006 spin_lock_init(&id_priv->lock); in __rdma_create_id()
1007 mutex_init(&id_priv->qp_mutex); in __rdma_create_id()
1008 init_completion(&id_priv->comp); in __rdma_create_id()
1009 refcount_set(&id_priv->refcount, 1); in __rdma_create_id()
1010 mutex_init(&id_priv->handler_mutex); in __rdma_create_id()
1011 INIT_LIST_HEAD(&id_priv->device_item); in __rdma_create_id()
1012 INIT_LIST_HEAD(&id_priv->id_list_entry); in __rdma_create_id()
1013 INIT_LIST_HEAD(&id_priv->listen_list); in __rdma_create_id()
1014 INIT_LIST_HEAD(&id_priv->mc_list); in __rdma_create_id()
1015 get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num); in __rdma_create_id()
1016 id_priv->id.route.addr.dev_addr.net = get_net(net); in __rdma_create_id()
1017 id_priv->seq_num &= 0x00ffffff; in __rdma_create_id()
1019 rdma_restrack_new(&id_priv->res, RDMA_RESTRACK_CM_ID); in __rdma_create_id()
1021 rdma_restrack_parent_name(&id_priv->res, &parent->res); in __rdma_create_id()
1023 return id_priv; in __rdma_create_id()
1059 static int cma_init_ud_qp(struct rdma_id_private *id_priv, struct ib_qp *qp) in cma_init_ud_qp() argument
1065 ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask); in cma_init_ud_qp()
1085 static int cma_init_conn_qp(struct rdma_id_private *id_priv, struct ib_qp *qp) in cma_init_conn_qp() argument
1091 ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask); in cma_init_conn_qp()
1101 struct rdma_id_private *id_priv; in rdma_create_qp() local
1105 id_priv = container_of(id, struct rdma_id_private, id); in rdma_create_qp()
1119 ret = cma_init_ud_qp(id_priv, qp); in rdma_create_qp()
1121 ret = cma_init_conn_qp(id_priv, qp); in rdma_create_qp()
1126 id_priv->qp_num = qp->qp_num; in rdma_create_qp()
1127 id_priv->srq = (qp->srq != NULL); in rdma_create_qp()
1128 trace_cm_qp_create(id_priv, pd, qp_init_attr, 0); in rdma_create_qp()
1133 trace_cm_qp_create(id_priv, pd, qp_init_attr, ret); in rdma_create_qp()
1140 struct rdma_id_private *id_priv; in rdma_destroy_qp() local
1142 id_priv = container_of(id, struct rdma_id_private, id); in rdma_destroy_qp()
1143 trace_cm_qp_destroy(id_priv); in rdma_destroy_qp()
1144 mutex_lock(&id_priv->qp_mutex); in rdma_destroy_qp()
1145 ib_destroy_qp(id_priv->id.qp); in rdma_destroy_qp()
1146 id_priv->id.qp = NULL; in rdma_destroy_qp()
1147 mutex_unlock(&id_priv->qp_mutex); in rdma_destroy_qp()
1151 static int cma_modify_qp_rtr(struct rdma_id_private *id_priv, in cma_modify_qp_rtr() argument
1157 mutex_lock(&id_priv->qp_mutex); in cma_modify_qp_rtr()
1158 if (!id_priv->id.qp) { in cma_modify_qp_rtr()
1165 ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask); in cma_modify_qp_rtr()
1169 ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask); in cma_modify_qp_rtr()
1174 ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask); in cma_modify_qp_rtr()
1178 BUG_ON(id_priv->cma_dev->device != id_priv->id.device); in cma_modify_qp_rtr()
1182 ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask); in cma_modify_qp_rtr()
1184 mutex_unlock(&id_priv->qp_mutex); in cma_modify_qp_rtr()
1188 static int cma_modify_qp_rts(struct rdma_id_private *id_priv, in cma_modify_qp_rts() argument
1194 mutex_lock(&id_priv->qp_mutex); in cma_modify_qp_rts()
1195 if (!id_priv->id.qp) { in cma_modify_qp_rts()
1201 ret = rdma_init_qp_attr(&id_priv->id, &qp_attr, &qp_attr_mask); in cma_modify_qp_rts()
1207 ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask); in cma_modify_qp_rts()
1209 mutex_unlock(&id_priv->qp_mutex); in cma_modify_qp_rts()
1213 static int cma_modify_qp_err(struct rdma_id_private *id_priv) in cma_modify_qp_err() argument
1218 mutex_lock(&id_priv->qp_mutex); in cma_modify_qp_err()
1219 if (!id_priv->id.qp) { in cma_modify_qp_err()
1225 ret = ib_modify_qp(id_priv->id.qp, &qp_attr, IB_QP_STATE); in cma_modify_qp_err()
1227 mutex_unlock(&id_priv->qp_mutex); in cma_modify_qp_err()
1231 static int cma_ib_init_qp_attr(struct rdma_id_private *id_priv, in cma_ib_init_qp_attr() argument
1234 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_ib_init_qp_attr()
1238 if (rdma_cap_eth_ah(id_priv->id.device, id_priv->id.port_num)) in cma_ib_init_qp_attr()
1243 ret = ib_find_cached_pkey(id_priv->id.device, id_priv->id.port_num, in cma_ib_init_qp_attr()
1248 qp_attr->port_num = id_priv->id.port_num; in cma_ib_init_qp_attr()
1251 if (id_priv->id.qp_type == IB_QPT_UD) { in cma_ib_init_qp_attr()
1252 ret = cma_set_default_qkey(id_priv); in cma_ib_init_qp_attr()
1256 qp_attr->qkey = id_priv->qkey; in cma_ib_init_qp_attr()
1268 struct rdma_id_private *id_priv; in rdma_init_qp_attr() local
1271 id_priv = container_of(id, struct rdma_id_private, id); in rdma_init_qp_attr()
1273 if (!id_priv->cm_id.ib || (id_priv->id.qp_type == IB_QPT_UD)) in rdma_init_qp_attr()
1274 ret = cma_ib_init_qp_attr(id_priv, qp_attr, qp_attr_mask); in rdma_init_qp_attr()
1276 ret = ib_cm_init_qp_attr(id_priv->cm_id.ib, qp_attr, in rdma_init_qp_attr()
1280 qp_attr->rq_psn = id_priv->seq_num; in rdma_init_qp_attr()
1282 if (!id_priv->cm_id.iw) { in rdma_init_qp_attr()
1286 ret = iw_cm_init_qp_attr(id_priv->cm_id.iw, qp_attr, in rdma_init_qp_attr()
1288 qp_attr->port_num = id_priv->id.port_num; in rdma_init_qp_attr()
1294 if ((*qp_attr_mask & IB_QP_TIMEOUT) && id_priv->timeout_set) in rdma_init_qp_attr()
1295 qp_attr->timeout = id_priv->timeout; in rdma_init_qp_attr()
1297 if ((*qp_attr_mask & IB_QP_MIN_RNR_TIMER) && id_priv->min_rnr_timer_set) in rdma_init_qp_attr()
1298 qp_attr->min_rnr_timer = id_priv->min_rnr_timer; in rdma_init_qp_attr()
1701 static bool cma_match_private_data(struct rdma_id_private *id_priv, in cma_match_private_data() argument
1704 struct sockaddr *addr = cma_src_addr(id_priv); in cma_match_private_data()
1708 if (cma_any_addr(addr) && !id_priv->afonly) in cma_match_private_data()
1792 struct rdma_id_private *id_priv, *id_priv_dev; in cma_find_listener() local
1799 hlist_for_each_entry(id_priv, &bind_list->owners, node) { in cma_find_listener()
1800 if (cma_match_private_data(id_priv, ib_event->private_data)) { in cma_find_listener()
1801 if (id_priv->id.device == cm_id->device && in cma_find_listener()
1802 cma_match_net_dev(&id_priv->id, net_dev, req)) in cma_find_listener()
1803 return id_priv; in cma_find_listener()
1805 &id_priv->listen_list, in cma_find_listener()
1825 struct rdma_id_private *id_priv; in cma_ib_id_from_event() local
1866 id_priv = ERR_PTR(-EHOSTUNREACH); in cma_ib_id_from_event()
1873 id_priv = ERR_PTR(-EHOSTUNREACH); in cma_ib_id_from_event()
1881 id_priv = cma_find_listener(bind_list, cm_id, ib_event, req, *net_dev); in cma_ib_id_from_event()
1885 if (IS_ERR(id_priv) && *net_dev) { in cma_ib_id_from_event()
1889 return id_priv; in cma_ib_id_from_event()
1892 static inline u8 cma_user_data_offset(struct rdma_id_private *id_priv) in cma_user_data_offset() argument
1894 return cma_family(id_priv) == AF_IB ? 0 : sizeof(struct cma_hdr); in cma_user_data_offset()
1897 static void cma_cancel_route(struct rdma_id_private *id_priv) in cma_cancel_route() argument
1899 if (rdma_cap_ib_sa(id_priv->id.device, id_priv->id.port_num)) { in cma_cancel_route()
1900 if (id_priv->query) in cma_cancel_route()
1901 ib_sa_cancel_query(id_priv->query_id, id_priv->query); in cma_cancel_route()
1905 static void _cma_cancel_listens(struct rdma_id_private *id_priv) in _cma_cancel_listens() argument
1915 list_del_init(&id_priv->listen_any_item); in _cma_cancel_listens()
1917 while (!list_empty(&id_priv->listen_list)) { in _cma_cancel_listens()
1919 list_first_entry(&id_priv->listen_list, in _cma_cancel_listens()
1931 static void cma_cancel_listens(struct rdma_id_private *id_priv) in cma_cancel_listens() argument
1934 _cma_cancel_listens(id_priv); in cma_cancel_listens()
1938 static void cma_cancel_operation(struct rdma_id_private *id_priv, in cma_cancel_operation() argument
1951 rdma_addr_cancel(&id_priv->id.route.addr.dev_addr); in cma_cancel_operation()
1954 cma_cancel_route(id_priv); in cma_cancel_operation()
1957 if (cma_any_addr(cma_src_addr(id_priv)) && !id_priv->cma_dev) in cma_cancel_operation()
1958 cma_cancel_listens(id_priv); in cma_cancel_operation()
1965 static void cma_release_port(struct rdma_id_private *id_priv) in cma_release_port() argument
1967 struct rdma_bind_list *bind_list = id_priv->bind_list; in cma_release_port()
1968 struct net *net = id_priv->id.route.addr.dev_addr.net; in cma_release_port()
1974 hlist_del(&id_priv->node); in cma_release_port()
1982 static void destroy_mc(struct rdma_id_private *id_priv, in destroy_mc() argument
1987 if (rdma_cap_ib_mcast(id_priv->id.device, id_priv->id.port_num)) in destroy_mc()
1990 if (rdma_protocol_roce(id_priv->id.device, id_priv->id.port_num)) { in destroy_mc()
1992 &id_priv->id.route.addr.dev_addr; in destroy_mc()
2002 gid_type = id_priv->cma_dev->default_gid_type in destroy_mc()
2003 [id_priv->id.port_num - in destroy_mc()
2005 id_priv->cma_dev->device)]; in destroy_mc()
2017 static void cma_leave_mc_groups(struct rdma_id_private *id_priv) in cma_leave_mc_groups() argument
2021 while (!list_empty(&id_priv->mc_list)) { in cma_leave_mc_groups()
2022 mc = list_first_entry(&id_priv->mc_list, struct cma_multicast, in cma_leave_mc_groups()
2025 destroy_mc(id_priv, mc); in cma_leave_mc_groups()
2029 static void _destroy_id(struct rdma_id_private *id_priv, in _destroy_id() argument
2032 cma_cancel_operation(id_priv, state); in _destroy_id()
2034 rdma_restrack_del(&id_priv->res); in _destroy_id()
2035 cma_remove_id_from_tree(id_priv); in _destroy_id()
2036 if (id_priv->cma_dev) { in _destroy_id()
2037 if (rdma_cap_ib_cm(id_priv->id.device, 1)) { in _destroy_id()
2038 if (id_priv->cm_id.ib) in _destroy_id()
2039 ib_destroy_cm_id(id_priv->cm_id.ib); in _destroy_id()
2040 } else if (rdma_cap_iw_cm(id_priv->id.device, 1)) { in _destroy_id()
2041 if (id_priv->cm_id.iw) in _destroy_id()
2042 iw_destroy_cm_id(id_priv->cm_id.iw); in _destroy_id()
2044 cma_leave_mc_groups(id_priv); in _destroy_id()
2045 cma_release_dev(id_priv); in _destroy_id()
2048 cma_release_port(id_priv); in _destroy_id()
2049 cma_id_put(id_priv); in _destroy_id()
2050 wait_for_completion(&id_priv->comp); in _destroy_id()
2052 if (id_priv->internal_id) in _destroy_id()
2053 cma_id_put(id_priv->id.context); in _destroy_id()
2055 kfree(id_priv->id.route.path_rec); in _destroy_id()
2056 kfree(id_priv->id.route.path_rec_inbound); in _destroy_id()
2057 kfree(id_priv->id.route.path_rec_outbound); in _destroy_id()
2059 put_net(id_priv->id.route.addr.dev_addr.net); in _destroy_id()
2060 kfree(id_priv); in _destroy_id()
2067 static void destroy_id_handler_unlock(struct rdma_id_private *id_priv) in destroy_id_handler_unlock() argument
2073 trace_cm_id_destroy(id_priv); in destroy_id_handler_unlock()
2081 lockdep_assert_held(&id_priv->handler_mutex); in destroy_id_handler_unlock()
2082 spin_lock_irqsave(&id_priv->lock, flags); in destroy_id_handler_unlock()
2083 state = id_priv->state; in destroy_id_handler_unlock()
2084 id_priv->state = RDMA_CM_DESTROYING; in destroy_id_handler_unlock()
2085 spin_unlock_irqrestore(&id_priv->lock, flags); in destroy_id_handler_unlock()
2086 mutex_unlock(&id_priv->handler_mutex); in destroy_id_handler_unlock()
2087 _destroy_id(id_priv, state); in destroy_id_handler_unlock()
2092 struct rdma_id_private *id_priv = in rdma_destroy_id() local
2095 mutex_lock(&id_priv->handler_mutex); in rdma_destroy_id()
2096 destroy_id_handler_unlock(id_priv); in rdma_destroy_id()
2100 static int cma_rep_recv(struct rdma_id_private *id_priv) in cma_rep_recv() argument
2104 ret = cma_modify_qp_rtr(id_priv, NULL); in cma_rep_recv()
2108 ret = cma_modify_qp_rts(id_priv, NULL); in cma_rep_recv()
2112 trace_cm_send_rtu(id_priv); in cma_rep_recv()
2113 ret = ib_send_cm_rtu(id_priv->cm_id.ib, NULL, 0); in cma_rep_recv()
2120 cma_modify_qp_err(id_priv); in cma_rep_recv()
2121 trace_cm_send_rej(id_priv); in cma_rep_recv()
2122 ib_send_cm_rej(id_priv->cm_id.ib, IB_CM_REJ_CONSUMER_DEFINED, in cma_rep_recv()
2144 static int cma_cm_event_handler(struct rdma_id_private *id_priv, in cma_cm_event_handler() argument
2149 lockdep_assert_held(&id_priv->handler_mutex); in cma_cm_event_handler()
2151 trace_cm_event_handler(id_priv, event); in cma_cm_event_handler()
2152 ret = id_priv->id.event_handler(&id_priv->id, event); in cma_cm_event_handler()
2153 trace_cm_event_done(id_priv, event, ret); in cma_cm_event_handler()
2160 struct rdma_id_private *id_priv = cm_id->context; in cma_ib_handler() local
2165 mutex_lock(&id_priv->handler_mutex); in cma_ib_handler()
2166 state = READ_ONCE(id_priv->state); in cma_ib_handler()
2181 (id_priv->id.qp_type != IB_QPT_UD)) { in cma_ib_handler()
2182 trace_cm_send_mra(id_priv); in cma_ib_handler()
2185 if (id_priv->id.qp) { in cma_ib_handler()
2186 event.status = cma_rep_recv(id_priv); in cma_ib_handler()
2204 if (!cma_comp_exch(id_priv, RDMA_CM_CONNECT, in cma_ib_handler()
2216 pr_debug_ratelimited("RDMA CM: REJECTED: %s\n", rdma_reject_msg(&id_priv->id, in cma_ib_handler()
2218 cma_modify_qp_err(id_priv); in cma_ib_handler()
2230 ret = cma_cm_event_handler(id_priv, &event); in cma_ib_handler()
2233 id_priv->cm_id.ib = NULL; in cma_ib_handler()
2234 destroy_id_handler_unlock(id_priv); in cma_ib_handler()
2238 mutex_unlock(&id_priv->handler_mutex); in cma_ib_handler()
2248 struct rdma_id_private *id_priv; in cma_ib_new_conn_id() local
2258 id_priv = __rdma_create_id(listen_id->route.addr.dev_addr.net, in cma_ib_new_conn_id()
2263 if (IS_ERR(id_priv)) in cma_ib_new_conn_id()
2266 id = &id_priv->id; in cma_ib_new_conn_id()
2287 cma_any_addr(cma_src_addr(id_priv))) { in cma_ib_new_conn_id()
2291 } else if (!cma_any_addr(cma_src_addr(id_priv))) { in cma_ib_new_conn_id()
2292 ret = cma_translate_addr(cma_src_addr(id_priv), &rt->addr.dev_addr); in cma_ib_new_conn_id()
2299 id_priv->state = RDMA_CM_CONNECT; in cma_ib_new_conn_id()
2300 return id_priv; in cma_ib_new_conn_id()
2313 struct rdma_id_private *id_priv; in cma_ib_new_udp_id() local
2320 id_priv = __rdma_create_id(net, listen_id->event_handler, in cma_ib_new_udp_id()
2323 if (IS_ERR(id_priv)) in cma_ib_new_udp_id()
2326 id = &id_priv->id; in cma_ib_new_udp_id()
2336 if (!cma_any_addr(cma_src_addr(id_priv))) { in cma_ib_new_udp_id()
2337 ret = cma_translate_addr(cma_src_addr(id_priv), in cma_ib_new_udp_id()
2344 id_priv->state = RDMA_CM_CONNECT; in cma_ib_new_udp_id()
2345 return id_priv; in cma_ib_new_udp_id()
2496 struct rdma_id_private *id_priv = iw_id->context; in cma_iw_handler() local
2502 mutex_lock(&id_priv->handler_mutex); in cma_iw_handler()
2503 if (READ_ONCE(id_priv->state) != RDMA_CM_CONNECT) in cma_iw_handler()
2511 memcpy(cma_src_addr(id_priv), laddr, in cma_iw_handler()
2513 memcpy(cma_dst_addr(id_priv), raddr, in cma_iw_handler()
2545 ret = cma_cm_event_handler(id_priv, &event); in cma_iw_handler()
2548 id_priv->cm_id.iw = NULL; in cma_iw_handler()
2549 destroy_id_handler_unlock(id_priv); in cma_iw_handler()
2554 mutex_unlock(&id_priv->handler_mutex); in cma_iw_handler()
2628 static int cma_ib_listen(struct rdma_id_private *id_priv) in cma_ib_listen() argument
2634 addr = cma_src_addr(id_priv); in cma_ib_listen()
2635 svc_id = rdma_get_service_id(&id_priv->id, addr); in cma_ib_listen()
2636 id = ib_cm_insert_listen(id_priv->id.device, in cma_ib_listen()
2640 id_priv->cm_id.ib = id; in cma_ib_listen()
2645 static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog) in cma_iw_listen() argument
2650 id = iw_create_cm_id(id_priv->id.device, in cma_iw_listen()
2652 id_priv); in cma_iw_listen()
2656 mutex_lock(&id_priv->qp_mutex); in cma_iw_listen()
2657 id->tos = id_priv->tos; in cma_iw_listen()
2658 id->tos_set = id_priv->tos_set; in cma_iw_listen()
2659 mutex_unlock(&id_priv->qp_mutex); in cma_iw_listen()
2660 id->afonly = id_priv->afonly; in cma_iw_listen()
2661 id_priv->cm_id.iw = id; in cma_iw_listen()
2663 memcpy(&id_priv->cm_id.iw->local_addr, cma_src_addr(id_priv), in cma_iw_listen()
2664 rdma_addr_size(cma_src_addr(id_priv))); in cma_iw_listen()
2666 ret = iw_cm_listen(id_priv->cm_id.iw, backlog); in cma_iw_listen()
2669 iw_destroy_cm_id(id_priv->cm_id.iw); in cma_iw_listen()
2670 id_priv->cm_id.iw = NULL; in cma_iw_listen()
2679 struct rdma_id_private *id_priv = id->context; in cma_listen_handler() local
2685 id->context = id_priv->id.context; in cma_listen_handler()
2686 id->event_handler = id_priv->id.event_handler; in cma_listen_handler()
2687 trace_cm_event_handler(id_priv, event); in cma_listen_handler()
2688 return id_priv->id.event_handler(id, event); in cma_listen_handler()
2691 static int cma_listen_on_dev(struct rdma_id_private *id_priv, in cma_listen_on_dev() argument
2696 struct net *net = id_priv->id.route.addr.dev_addr.net; in cma_listen_on_dev()
2702 if (cma_family(id_priv) == AF_IB && !rdma_cap_ib_cm(cma_dev->device, 1)) in cma_listen_on_dev()
2706 __rdma_create_id(net, cma_listen_handler, id_priv, in cma_listen_on_dev()
2707 id_priv->id.ps, id_priv->id.qp_type, id_priv); in cma_listen_on_dev()
2712 memcpy(cma_src_addr(dev_id_priv), cma_src_addr(id_priv), in cma_listen_on_dev()
2713 rdma_addr_size(cma_src_addr(id_priv))); in cma_listen_on_dev()
2717 cma_id_get(id_priv); in cma_listen_on_dev()
2719 dev_id_priv->afonly = id_priv->afonly; in cma_listen_on_dev()
2720 mutex_lock(&id_priv->qp_mutex); in cma_listen_on_dev()
2721 dev_id_priv->tos_set = id_priv->tos_set; in cma_listen_on_dev()
2722 dev_id_priv->tos = id_priv->tos; in cma_listen_on_dev()
2723 mutex_unlock(&id_priv->qp_mutex); in cma_listen_on_dev()
2725 ret = rdma_listen(&dev_id_priv->id, id_priv->backlog); in cma_listen_on_dev()
2728 list_add_tail(&dev_id_priv->listen_item, &id_priv->listen_list); in cma_listen_on_dev()
2737 static int cma_listen_on_all(struct rdma_id_private *id_priv) in cma_listen_on_all() argument
2744 list_add_tail(&id_priv->listen_any_item, &listen_any_list); in cma_listen_on_all()
2746 ret = cma_listen_on_dev(id_priv, cma_dev, &to_destroy); in cma_listen_on_all()
2758 _cma_cancel_listens(id_priv); in cma_listen_on_all()
2767 struct rdma_id_private *id_priv; in rdma_set_service_type() local
2769 id_priv = container_of(id, struct rdma_id_private, id); in rdma_set_service_type()
2770 mutex_lock(&id_priv->qp_mutex); in rdma_set_service_type()
2771 id_priv->tos = (u8) tos; in rdma_set_service_type()
2772 id_priv->tos_set = true; in rdma_set_service_type()
2773 mutex_unlock(&id_priv->qp_mutex); in rdma_set_service_type()
2794 struct rdma_id_private *id_priv; in rdma_set_ack_timeout() local
2799 id_priv = container_of(id, struct rdma_id_private, id); in rdma_set_ack_timeout()
2800 mutex_lock(&id_priv->qp_mutex); in rdma_set_ack_timeout()
2801 id_priv->timeout = timeout; in rdma_set_ack_timeout()
2802 id_priv->timeout_set = true; in rdma_set_ack_timeout()
2803 mutex_unlock(&id_priv->qp_mutex); in rdma_set_ack_timeout()
2829 struct rdma_id_private *id_priv; in rdma_set_min_rnr_timer() local
2838 id_priv = container_of(id, struct rdma_id_private, id); in rdma_set_min_rnr_timer()
2839 mutex_lock(&id_priv->qp_mutex); in rdma_set_min_rnr_timer()
2840 id_priv->min_rnr_timer = min_rnr_timer; in rdma_set_min_rnr_timer()
2841 id_priv->min_rnr_timer_set = true; in rdma_set_min_rnr_timer()
2842 mutex_unlock(&id_priv->qp_mutex); in rdma_set_min_rnr_timer()
2921 static int cma_query_ib_route(struct rdma_id_private *id_priv, in cma_query_ib_route() argument
2924 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_query_ib_route()
2932 if (rdma_cap_opa_ah(id_priv->id.device, id_priv->id.port_num)) in cma_query_ib_route()
2941 path_rec.service_id = rdma_get_service_id(&id_priv->id, in cma_query_ib_route()
2942 cma_dst_addr(id_priv)); in cma_query_ib_route()
2948 switch (cma_family(id_priv)) { in cma_query_ib_route()
2950 path_rec.qos_class = cpu_to_be16((u16) id_priv->tos); in cma_query_ib_route()
2954 sin6 = (struct sockaddr_in6 *) cma_src_addr(id_priv); in cma_query_ib_route()
2959 sib = (struct sockaddr_ib *) cma_src_addr(id_priv); in cma_query_ib_route()
2965 id_priv->query_id = ib_sa_path_rec_get(&sa_client, id_priv->id.device, in cma_query_ib_route()
2966 id_priv->id.port_num, &path_rec, in cma_query_ib_route()
2969 work, &id_priv->query); in cma_query_ib_route()
2971 return (id_priv->query_id < 0) ? id_priv->query_id : 0; in cma_query_ib_route()
2979 struct rdma_id_private *id_priv = mc->id_priv; in cma_iboe_join_work_handler() local
2982 mutex_lock(&id_priv->handler_mutex); in cma_iboe_join_work_handler()
2983 if (READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING || in cma_iboe_join_work_handler()
2984 READ_ONCE(id_priv->state) == RDMA_CM_DEVICE_REMOVAL) in cma_iboe_join_work_handler()
2987 ret = cma_cm_event_handler(id_priv, event); in cma_iboe_join_work_handler()
2991 mutex_unlock(&id_priv->handler_mutex); in cma_iboe_join_work_handler()
2999 struct rdma_id_private *id_priv = work->id; in cma_work_handler() local
3001 mutex_lock(&id_priv->handler_mutex); in cma_work_handler()
3002 if (READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING || in cma_work_handler()
3003 READ_ONCE(id_priv->state) == RDMA_CM_DEVICE_REMOVAL) in cma_work_handler()
3006 if (!cma_comp_exch(id_priv, work->old_state, work->new_state)) in cma_work_handler()
3010 if (cma_cm_event_handler(id_priv, &work->event)) { in cma_work_handler()
3011 cma_id_put(id_priv); in cma_work_handler()
3012 destroy_id_handler_unlock(id_priv); in cma_work_handler()
3017 mutex_unlock(&id_priv->handler_mutex); in cma_work_handler()
3018 cma_id_put(id_priv); in cma_work_handler()
3026 struct rdma_id_private *id_priv) in cma_init_resolve_route_work() argument
3028 work->id = id_priv; in cma_init_resolve_route_work()
3036 struct rdma_id_private *id_priv) in enqueue_resolve_addr_work() argument
3039 cma_id_get(id_priv); in enqueue_resolve_addr_work()
3041 work->id = id_priv; in enqueue_resolve_addr_work()
3050 static int cma_resolve_ib_route(struct rdma_id_private *id_priv, in cma_resolve_ib_route() argument
3053 struct rdma_route *route = &id_priv->id.route; in cma_resolve_ib_route()
3061 cma_init_resolve_route_work(work, id_priv); in cma_resolve_ib_route()
3070 ret = cma_query_ib_route(id_priv, timeout_ms, work); in cma_resolve_ib_route()
3103 cma_iboe_set_path_rec_l2_fields(struct rdma_id_private *id_priv) in cma_iboe_set_path_rec_l2_fields() argument
3105 struct rdma_route *route = &id_priv->id.route; in cma_iboe_set_path_rec_l2_fields()
3119 supported_gids = roce_gid_type_mask_support(id_priv->id.device, in cma_iboe_set_path_rec_l2_fields()
3120 id_priv->id.port_num); in cma_iboe_set_path_rec_l2_fields()
3123 id_priv->gid_type); in cma_iboe_set_path_rec_l2_fields()
3137 struct rdma_id_private *id_priv; in rdma_set_ib_path() local
3141 id_priv = container_of(id, struct rdma_id_private, id); in rdma_set_ib_path()
3142 if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_RESOLVED, in rdma_set_ib_path()
3154 ndev = cma_iboe_set_path_rec_l2_fields(id_priv); in rdma_set_ib_path()
3169 cma_comp_exch(id_priv, RDMA_CM_ROUTE_RESOLVED, RDMA_CM_ADDR_RESOLVED); in rdma_set_ib_path()
3174 static int cma_resolve_iw_route(struct rdma_id_private *id_priv) in cma_resolve_iw_route() argument
3182 cma_init_resolve_route_work(work, id_priv); in cma_resolve_iw_route()
3251 static __be32 cma_get_roce_udp_flow_label(struct rdma_id_private *id_priv) in cma_get_roce_udp_flow_label() argument
3257 addr6 = (struct sockaddr_in6 *)cma_src_addr(id_priv); in cma_get_roce_udp_flow_label()
3259 if ((cma_family(id_priv) != AF_INET6) || !fl) { in cma_get_roce_udp_flow_label()
3260 dport = be16_to_cpu(cma_port(cma_dst_addr(id_priv))); in cma_get_roce_udp_flow_label()
3261 sport = be16_to_cpu(cma_port(cma_src_addr(id_priv))); in cma_get_roce_udp_flow_label()
3269 static int cma_resolve_iboe_route(struct rdma_id_private *id_priv) in cma_resolve_iboe_route() argument
3271 struct rdma_route *route = &id_priv->id.route; in cma_resolve_iboe_route()
3277 u8 default_roce_tos = id_priv->cma_dev->default_roce_tos[id_priv->id.port_num - in cma_resolve_iboe_route()
3278 rdma_start_port(id_priv->cma_dev->device)]; in cma_resolve_iboe_route()
3281 mutex_lock(&id_priv->qp_mutex); in cma_resolve_iboe_route()
3282 tos = id_priv->tos_set ? id_priv->tos : default_roce_tos; in cma_resolve_iboe_route()
3283 mutex_unlock(&id_priv->qp_mutex); in cma_resolve_iboe_route()
3297 ndev = cma_iboe_set_path_rec_l2_fields(id_priv); in cma_resolve_iboe_route()
3303 rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr, in cma_resolve_iboe_route()
3305 rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.dst_addr, in cma_resolve_iboe_route()
3308 if (((struct sockaddr *)&id_priv->id.route.addr.dst_addr)->sa_family != AF_IB) in cma_resolve_iboe_route()
3330 mutex_lock(&id_priv->qp_mutex); in cma_resolve_iboe_route()
3331 if (id_priv->timeout_set && id_priv->timeout) in cma_resolve_iboe_route()
3332 route->path_rec->packet_life_time = id_priv->timeout - 1; in cma_resolve_iboe_route()
3335 mutex_unlock(&id_priv->qp_mutex); in cma_resolve_iboe_route()
3342 if (rdma_protocol_roce_udp_encap(id_priv->id.device, in cma_resolve_iboe_route()
3343 id_priv->id.port_num)) in cma_resolve_iboe_route()
3345 cma_get_roce_udp_flow_label(id_priv); in cma_resolve_iboe_route()
3347 cma_init_resolve_route_work(work, id_priv); in cma_resolve_iboe_route()
3363 struct rdma_id_private *id_priv; in rdma_resolve_route() local
3369 id_priv = container_of(id, struct rdma_id_private, id); in rdma_resolve_route()
3370 if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_RESOLVED, RDMA_CM_ROUTE_QUERY)) in rdma_resolve_route()
3373 cma_id_get(id_priv); in rdma_resolve_route()
3375 ret = cma_resolve_ib_route(id_priv, timeout_ms); in rdma_resolve_route()
3377 ret = cma_resolve_iboe_route(id_priv); in rdma_resolve_route()
3379 cma_add_id_to_tree(id_priv); in rdma_resolve_route()
3382 ret = cma_resolve_iw_route(id_priv); in rdma_resolve_route()
3391 cma_comp_exch(id_priv, RDMA_CM_ROUTE_QUERY, RDMA_CM_ADDR_RESOLVED); in rdma_resolve_route()
3392 cma_id_put(id_priv); in rdma_resolve_route()
3414 static int cma_bind_loopback(struct rdma_id_private *id_priv) in cma_bind_loopback() argument
3426 if (cma_family(id_priv) == AF_IB && in cma_bind_loopback()
3458 id_priv->id.route.addr.dev_addr.dev_type = in cma_bind_loopback()
3462 rdma_addr_set_sgid(&id_priv->id.route.addr.dev_addr, &gid); in cma_bind_loopback()
3463 ib_addr_set_pkey(&id_priv->id.route.addr.dev_addr, pkey); in cma_bind_loopback()
3464 id_priv->id.port_num = p; in cma_bind_loopback()
3465 cma_attach_to_dev(id_priv, cma_dev); in cma_bind_loopback()
3466 rdma_restrack_add(&id_priv->res); in cma_bind_loopback()
3467 cma_set_loopback(cma_src_addr(id_priv)); in cma_bind_loopback()
3476 struct rdma_id_private *id_priv = context; in addr_handler() local
3481 mutex_lock(&id_priv->handler_mutex); in addr_handler()
3482 if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_QUERY, in addr_handler()
3491 addr = cma_src_addr(id_priv); in addr_handler()
3494 if (!status && !id_priv->cma_dev) { in addr_handler()
3495 status = cma_acquire_dev_by_src_ip(id_priv); in addr_handler()
3499 rdma_restrack_add(&id_priv->res); in addr_handler()
3507 if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_RESOLVED, in addr_handler()
3515 if (cma_cm_event_handler(id_priv, &event)) { in addr_handler()
3516 destroy_id_handler_unlock(id_priv); in addr_handler()
3520 mutex_unlock(&id_priv->handler_mutex); in addr_handler()
3523 static int cma_resolve_loopback(struct rdma_id_private *id_priv) in cma_resolve_loopback() argument
3533 if (!id_priv->cma_dev) { in cma_resolve_loopback()
3534 ret = cma_bind_loopback(id_priv); in cma_resolve_loopback()
3539 rdma_addr_get_sgid(&id_priv->id.route.addr.dev_addr, &gid); in cma_resolve_loopback()
3540 rdma_addr_set_dgid(&id_priv->id.route.addr.dev_addr, &gid); in cma_resolve_loopback()
3542 enqueue_resolve_addr_work(work, id_priv); in cma_resolve_loopback()
3549 static int cma_resolve_ib_addr(struct rdma_id_private *id_priv) in cma_resolve_ib_addr() argument
3558 if (!id_priv->cma_dev) { in cma_resolve_ib_addr()
3559 ret = cma_resolve_ib_dev(id_priv); in cma_resolve_ib_addr()
3564 rdma_addr_set_dgid(&id_priv->id.route.addr.dev_addr, (union ib_gid *) in cma_resolve_ib_addr()
3565 &(((struct sockaddr_ib *) &id_priv->id.route.addr.dst_addr)->sib_addr)); in cma_resolve_ib_addr()
3567 enqueue_resolve_addr_work(work, id_priv); in cma_resolve_ib_addr()
3576 struct rdma_id_private *id_priv; in rdma_set_reuseaddr() local
3580 id_priv = container_of(id, struct rdma_id_private, id); in rdma_set_reuseaddr()
3581 spin_lock_irqsave(&id_priv->lock, flags); in rdma_set_reuseaddr()
3582 if ((reuse && id_priv->state != RDMA_CM_LISTEN) || in rdma_set_reuseaddr()
3583 id_priv->state == RDMA_CM_IDLE) { in rdma_set_reuseaddr()
3584 id_priv->reuseaddr = reuse; in rdma_set_reuseaddr()
3589 spin_unlock_irqrestore(&id_priv->lock, flags); in rdma_set_reuseaddr()
3596 struct rdma_id_private *id_priv; in rdma_set_afonly() local
3600 id_priv = container_of(id, struct rdma_id_private, id); in rdma_set_afonly()
3601 spin_lock_irqsave(&id_priv->lock, flags); in rdma_set_afonly()
3602 if (id_priv->state == RDMA_CM_IDLE || id_priv->state == RDMA_CM_ADDR_BOUND) { in rdma_set_afonly()
3603 id_priv->options |= (1 << CMA_OPTION_AFONLY); in rdma_set_afonly()
3604 id_priv->afonly = afonly; in rdma_set_afonly()
3609 spin_unlock_irqrestore(&id_priv->lock, flags); in rdma_set_afonly()
3615 struct rdma_id_private *id_priv) in cma_bind_port() argument
3624 addr = cma_src_addr(id_priv); in cma_bind_port()
3642 id_priv->bind_list = bind_list; in cma_bind_port()
3643 hlist_add_head(&id_priv->node, &bind_list->owners); in cma_bind_port()
3647 struct rdma_id_private *id_priv, unsigned short snum) in cma_alloc_port() argument
3658 ret = cma_ps_alloc(id_priv->id.route.addr.dev_addr.net, ps, bind_list, in cma_alloc_port()
3665 cma_bind_port(bind_list, id_priv); in cma_alloc_port()
3673 struct rdma_id_private *id_priv) in cma_port_is_unique() argument
3676 struct sockaddr *daddr = cma_dst_addr(id_priv); in cma_port_is_unique()
3677 struct sockaddr *saddr = cma_src_addr(id_priv); in cma_port_is_unique()
3687 if (id_priv == cur_id) in cma_port_is_unique()
3714 struct rdma_id_private *id_priv) in cma_alloc_any_port() argument
3719 struct net *net = id_priv->id.route.addr.dev_addr.net; in cma_alloc_any_port()
3734 ret = cma_alloc_port(ps, id_priv, rover); in cma_alloc_any_port()
3736 ret = cma_port_is_unique(bind_list, id_priv); in cma_alloc_any_port()
3738 cma_bind_port(bind_list, id_priv); in cma_alloc_any_port()
3765 struct rdma_id_private *id_priv, uint8_t reuseaddr) in cma_check_port() argument
3772 addr = cma_src_addr(id_priv); in cma_check_port()
3774 if (id_priv == cur_id) in cma_check_port()
3781 if (id_priv->afonly && cur_id->afonly && in cma_check_port()
3795 struct rdma_id_private *id_priv) in cma_use_port() argument
3803 snum = ntohs(cma_port(cma_src_addr(id_priv))); in cma_use_port()
3807 bind_list = cma_ps_find(id_priv->id.route.addr.dev_addr.net, ps, snum); in cma_use_port()
3809 ret = cma_alloc_port(ps, id_priv, snum); in cma_use_port()
3811 ret = cma_check_port(bind_list, id_priv, id_priv->reuseaddr); in cma_use_port()
3813 cma_bind_port(bind_list, id_priv); in cma_use_port()
3819 cma_select_inet_ps(struct rdma_id_private *id_priv) in cma_select_inet_ps() argument
3821 switch (id_priv->id.ps) { in cma_select_inet_ps()
3826 return id_priv->id.ps; in cma_select_inet_ps()
3834 cma_select_ib_ps(struct rdma_id_private *id_priv) in cma_select_ib_ps() argument
3840 sib = (struct sockaddr_ib *) cma_src_addr(id_priv); in cma_select_ib_ps()
3844 if ((id_priv->id.ps == RDMA_PS_IB) && (sid == (RDMA_IB_IP_PS_IB & mask))) { in cma_select_ib_ps()
3847 } else if (((id_priv->id.ps == RDMA_PS_IB) || (id_priv->id.ps == RDMA_PS_TCP)) && in cma_select_ib_ps()
3851 } else if (((id_priv->id.ps == RDMA_PS_IB) || (id_priv->id.ps == RDMA_PS_UDP)) && in cma_select_ib_ps()
3865 static int cma_get_port(struct rdma_id_private *id_priv) in cma_get_port() argument
3870 if (cma_family(id_priv) != AF_IB) in cma_get_port()
3871 ps = cma_select_inet_ps(id_priv); in cma_get_port()
3873 ps = cma_select_ib_ps(id_priv); in cma_get_port()
3878 if (cma_any_port(cma_src_addr(id_priv))) in cma_get_port()
3879 ret = cma_alloc_any_port(ps, id_priv); in cma_get_port()
3881 ret = cma_use_port(ps, id_priv); in cma_get_port()
3911 struct rdma_id_private *id_priv = in rdma_listen() local
3915 if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_LISTEN)) { in rdma_listen()
3925 if (WARN_ON(!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, in rdma_listen()
3934 if (id_priv->reuseaddr) { in rdma_listen()
3936 ret = cma_check_port(id_priv->bind_list, id_priv, 0); in rdma_listen()
3938 id_priv->reuseaddr = 0; in rdma_listen()
3944 id_priv->backlog = backlog; in rdma_listen()
3945 if (id_priv->cma_dev) { in rdma_listen()
3947 ret = cma_ib_listen(id_priv); in rdma_listen()
3951 ret = cma_iw_listen(id_priv, backlog); in rdma_listen()
3959 ret = cma_listen_on_all(id_priv); in rdma_listen()
3966 id_priv->backlog = 0; in rdma_listen()
3971 cma_comp_exch(id_priv, RDMA_CM_LISTEN, RDMA_CM_ADDR_BOUND); in rdma_listen()
3976 static int rdma_bind_addr_dst(struct rdma_id_private *id_priv, in rdma_bind_addr_dst() argument
3986 if (!cma_comp_exch(id_priv, RDMA_CM_IDLE, RDMA_CM_ADDR_BOUND)) in rdma_bind_addr_dst()
3989 ret = cma_check_linklocal(&id_priv->id.route.addr.dev_addr, addr); in rdma_bind_addr_dst()
3993 memcpy(cma_src_addr(id_priv), addr, rdma_addr_size(addr)); in rdma_bind_addr_dst()
3995 ret = cma_translate_addr(addr, &id_priv->id.route.addr.dev_addr); in rdma_bind_addr_dst()
3999 ret = cma_acquire_dev_by_src_ip(id_priv); in rdma_bind_addr_dst()
4004 if (!(id_priv->options & (1 << CMA_OPTION_AFONLY))) { in rdma_bind_addr_dst()
4006 id_priv->afonly = 1; in rdma_bind_addr_dst()
4009 struct net *net = id_priv->id.route.addr.dev_addr.net; in rdma_bind_addr_dst()
4011 id_priv->afonly = net->ipv6.sysctl.bindv6only; in rdma_bind_addr_dst()
4015 id_daddr = cma_dst_addr(id_priv); in rdma_bind_addr_dst()
4020 ret = cma_get_port(id_priv); in rdma_bind_addr_dst()
4025 rdma_restrack_add(&id_priv->res); in rdma_bind_addr_dst()
4028 if (id_priv->cma_dev) in rdma_bind_addr_dst()
4029 cma_release_dev(id_priv); in rdma_bind_addr_dst()
4031 cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_IDLE); in rdma_bind_addr_dst()
4038 struct rdma_id_private *id_priv = in cma_bind_addr() local
4043 return rdma_bind_addr_dst(id_priv, src_addr, dst_addr); in cma_bind_addr()
4063 return rdma_bind_addr_dst(id_priv, (struct sockaddr *)&zero_sock, dst_addr); in cma_bind_addr()
4072 static int resolve_prepare_src(struct rdma_id_private *id_priv, in resolve_prepare_src() argument
4078 if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_ADDR_QUERY)) { in resolve_prepare_src()
4080 ret = cma_bind_addr(&id_priv->id, src_addr, dst_addr); in resolve_prepare_src()
4083 if (WARN_ON(!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, in resolve_prepare_src()
4088 memcpy(cma_dst_addr(id_priv), dst_addr, rdma_addr_size(dst_addr)); in resolve_prepare_src()
4091 if (cma_family(id_priv) != dst_addr->sa_family) { in resolve_prepare_src()
4098 cma_comp_exch(id_priv, RDMA_CM_ADDR_QUERY, RDMA_CM_ADDR_BOUND); in resolve_prepare_src()
4105 struct rdma_id_private *id_priv = in rdma_resolve_addr() local
4109 ret = resolve_prepare_src(id_priv, src_addr, dst_addr); in rdma_resolve_addr()
4114 ret = cma_resolve_loopback(id_priv); in rdma_resolve_addr()
4117 ret = cma_resolve_ib_addr(id_priv); in rdma_resolve_addr()
4130 if (id_priv->used_resolve_ip) in rdma_resolve_addr()
4133 id_priv->used_resolve_ip = 1; in rdma_resolve_addr()
4134 ret = rdma_resolve_ip(cma_src_addr(id_priv), dst_addr, in rdma_resolve_addr()
4137 false, id_priv); in rdma_resolve_addr()
4145 cma_comp_exch(id_priv, RDMA_CM_ADDR_QUERY, RDMA_CM_ADDR_BOUND); in rdma_resolve_addr()
4152 struct rdma_id_private *id_priv = in rdma_bind_addr() local
4155 return rdma_bind_addr_dst(id_priv, addr, cma_dst_addr(id_priv)); in rdma_bind_addr()
4159 static int cma_format_hdr(void *hdr, struct rdma_id_private *id_priv) in cma_format_hdr() argument
4165 if (cma_family(id_priv) == AF_INET) { in cma_format_hdr()
4168 src4 = (struct sockaddr_in *) cma_src_addr(id_priv); in cma_format_hdr()
4169 dst4 = (struct sockaddr_in *) cma_dst_addr(id_priv); in cma_format_hdr()
4175 } else if (cma_family(id_priv) == AF_INET6) { in cma_format_hdr()
4178 src6 = (struct sockaddr_in6 *) cma_src_addr(id_priv); in cma_format_hdr()
4179 dst6 = (struct sockaddr_in6 *) cma_dst_addr(id_priv); in cma_format_hdr()
4192 struct rdma_id_private *id_priv = cm_id->context; in cma_sidr_rep_handler() local
4198 mutex_lock(&id_priv->handler_mutex); in cma_sidr_rep_handler()
4199 if (READ_ONCE(id_priv->state) != RDMA_CM_CONNECT) in cma_sidr_rep_handler()
4217 ret = cma_set_qkey(id_priv, rep->qkey); in cma_sidr_rep_handler()
4224 ib_init_ah_attr_from_path(id_priv->id.device, in cma_sidr_rep_handler()
4225 id_priv->id.port_num, in cma_sidr_rep_handler()
4226 id_priv->id.route.path_rec, in cma_sidr_rep_handler()
4240 ret = cma_cm_event_handler(id_priv, &event); in cma_sidr_rep_handler()
4245 id_priv->cm_id.ib = NULL; in cma_sidr_rep_handler()
4246 destroy_id_handler_unlock(id_priv); in cma_sidr_rep_handler()
4250 mutex_unlock(&id_priv->handler_mutex); in cma_sidr_rep_handler()
4254 static int cma_resolve_ib_udp(struct rdma_id_private *id_priv, in cma_resolve_ib_udp() argument
4264 offset = cma_user_data_offset(id_priv); in cma_resolve_ib_udp()
4281 ret = cma_format_hdr(private_data, id_priv); in cma_resolve_ib_udp()
4287 id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler, in cma_resolve_ib_udp()
4288 id_priv); in cma_resolve_ib_udp()
4293 id_priv->cm_id.ib = id; in cma_resolve_ib_udp()
4295 req.path = id_priv->id.route.path_rec; in cma_resolve_ib_udp()
4296 req.sgid_attr = id_priv->id.route.addr.dev_addr.sgid_attr; in cma_resolve_ib_udp()
4297 req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv)); in cma_resolve_ib_udp()
4301 trace_cm_send_sidr_req(id_priv); in cma_resolve_ib_udp()
4302 ret = ib_send_cm_sidr_req(id_priv->cm_id.ib, &req); in cma_resolve_ib_udp()
4304 ib_destroy_cm_id(id_priv->cm_id.ib); in cma_resolve_ib_udp()
4305 id_priv->cm_id.ib = NULL; in cma_resolve_ib_udp()
4312 static int cma_connect_ib(struct rdma_id_private *id_priv, in cma_connect_ib() argument
4323 offset = cma_user_data_offset(id_priv); in cma_connect_ib()
4339 id = ib_create_cm_id(id_priv->id.device, cma_ib_handler, id_priv); in cma_connect_ib()
4344 id_priv->cm_id.ib = id; in cma_connect_ib()
4346 route = &id_priv->id.route; in cma_connect_ib()
4348 ret = cma_format_hdr(private_data, id_priv); in cma_connect_ib()
4360 req.ppath_sgid_attr = id_priv->id.route.addr.dev_addr.sgid_attr; in cma_connect_ib()
4362 req.service_id = rdma_get_service_id(&id_priv->id, cma_dst_addr(id_priv)); in cma_connect_ib()
4363 req.qp_num = id_priv->qp_num; in cma_connect_ib()
4364 req.qp_type = id_priv->id.qp_type; in cma_connect_ib()
4365 req.starting_psn = id_priv->seq_num; in cma_connect_ib()
4374 req.srq = id_priv->srq ? 1 : 0; in cma_connect_ib()
4375 req.ece.vendor_id = id_priv->ece.vendor_id; in cma_connect_ib()
4376 req.ece.attr_mod = id_priv->ece.attr_mod; in cma_connect_ib()
4378 trace_cm_send_req(id_priv); in cma_connect_ib()
4379 ret = ib_send_cm_req(id_priv->cm_id.ib, &req); in cma_connect_ib()
4383 id_priv->cm_id.ib = NULL; in cma_connect_ib()
4390 static int cma_connect_iw(struct rdma_id_private *id_priv, in cma_connect_iw() argument
4397 cm_id = iw_create_cm_id(id_priv->id.device, cma_iw_handler, id_priv); in cma_connect_iw()
4401 mutex_lock(&id_priv->qp_mutex); in cma_connect_iw()
4402 cm_id->tos = id_priv->tos; in cma_connect_iw()
4403 cm_id->tos_set = id_priv->tos_set; in cma_connect_iw()
4404 mutex_unlock(&id_priv->qp_mutex); in cma_connect_iw()
4406 id_priv->cm_id.iw = cm_id; in cma_connect_iw()
4408 memcpy(&cm_id->local_addr, cma_src_addr(id_priv), in cma_connect_iw()
4409 rdma_addr_size(cma_src_addr(id_priv))); in cma_connect_iw()
4410 memcpy(&cm_id->remote_addr, cma_dst_addr(id_priv), in cma_connect_iw()
4411 rdma_addr_size(cma_dst_addr(id_priv))); in cma_connect_iw()
4413 ret = cma_modify_qp_rtr(id_priv, conn_param); in cma_connect_iw()
4422 iw_param.qpn = id_priv->id.qp ? id_priv->qp_num : conn_param->qp_num; in cma_connect_iw()
4425 iw_param.qpn = id_priv->qp_num; in cma_connect_iw()
4431 id_priv->cm_id.iw = NULL; in cma_connect_iw()
4447 struct rdma_id_private *id_priv = in rdma_connect_locked() local
4451 if (!cma_comp_exch(id_priv, RDMA_CM_ROUTE_RESOLVED, RDMA_CM_CONNECT)) in rdma_connect_locked()
4455 id_priv->qp_num = conn_param->qp_num; in rdma_connect_locked()
4456 id_priv->srq = conn_param->srq; in rdma_connect_locked()
4461 ret = cma_resolve_ib_udp(id_priv, conn_param); in rdma_connect_locked()
4463 ret = cma_connect_ib(id_priv, conn_param); in rdma_connect_locked()
4465 ret = cma_connect_iw(id_priv, conn_param); in rdma_connect_locked()
4473 cma_comp_exch(id_priv, RDMA_CM_CONNECT, RDMA_CM_ROUTE_RESOLVED); in rdma_connect_locked()
4492 struct rdma_id_private *id_priv = in rdma_connect() local
4496 mutex_lock(&id_priv->handler_mutex); in rdma_connect()
4498 mutex_unlock(&id_priv->handler_mutex); in rdma_connect()
4514 struct rdma_id_private *id_priv = in rdma_connect_ece() local
4517 id_priv->ece.vendor_id = ece->vendor_id; in rdma_connect_ece()
4518 id_priv->ece.attr_mod = ece->attr_mod; in rdma_connect_ece()
4524 static int cma_accept_ib(struct rdma_id_private *id_priv, in cma_accept_ib() argument
4530 ret = cma_modify_qp_rtr(id_priv, conn_param); in cma_accept_ib()
4534 ret = cma_modify_qp_rts(id_priv, conn_param); in cma_accept_ib()
4539 rep.qp_num = id_priv->qp_num; in cma_accept_ib()
4540 rep.starting_psn = id_priv->seq_num; in cma_accept_ib()
4548 rep.srq = id_priv->srq ? 1 : 0; in cma_accept_ib()
4549 rep.ece.vendor_id = id_priv->ece.vendor_id; in cma_accept_ib()
4550 rep.ece.attr_mod = id_priv->ece.attr_mod; in cma_accept_ib()
4552 trace_cm_send_rep(id_priv); in cma_accept_ib()
4553 ret = ib_send_cm_rep(id_priv->cm_id.ib, &rep); in cma_accept_ib()
4558 static int cma_accept_iw(struct rdma_id_private *id_priv, in cma_accept_iw() argument
4567 ret = cma_modify_qp_rtr(id_priv, conn_param); in cma_accept_iw()
4575 if (id_priv->id.qp) in cma_accept_iw()
4576 iw_param.qpn = id_priv->qp_num; in cma_accept_iw()
4580 return iw_cm_accept(id_priv->cm_id.iw, &iw_param); in cma_accept_iw()
4583 static int cma_send_sidr_rep(struct rdma_id_private *id_priv, in cma_send_sidr_rep() argument
4594 ret = cma_set_qkey(id_priv, qkey); in cma_send_sidr_rep()
4596 ret = cma_set_default_qkey(id_priv); in cma_send_sidr_rep()
4599 rep.qp_num = id_priv->qp_num; in cma_send_sidr_rep()
4600 rep.qkey = id_priv->qkey; in cma_send_sidr_rep()
4602 rep.ece.vendor_id = id_priv->ece.vendor_id; in cma_send_sidr_rep()
4603 rep.ece.attr_mod = id_priv->ece.attr_mod; in cma_send_sidr_rep()
4609 trace_cm_send_sidr_rep(id_priv); in cma_send_sidr_rep()
4610 return ib_send_cm_sidr_rep(id_priv->cm_id.ib, &rep); in cma_send_sidr_rep()
4633 struct rdma_id_private *id_priv = in rdma_accept() local
4637 lockdep_assert_held(&id_priv->handler_mutex); in rdma_accept()
4639 if (READ_ONCE(id_priv->state) != RDMA_CM_CONNECT) in rdma_accept()
4643 id_priv->qp_num = conn_param->qp_num; in rdma_accept()
4644 id_priv->srq = conn_param->srq; in rdma_accept()
4650 ret = cma_send_sidr_rep(id_priv, IB_SIDR_SUCCESS, in rdma_accept()
4655 ret = cma_send_sidr_rep(id_priv, IB_SIDR_SUCCESS, in rdma_accept()
4659 ret = cma_accept_ib(id_priv, conn_param); in rdma_accept()
4661 ret = cma_rep_recv(id_priv); in rdma_accept()
4664 ret = cma_accept_iw(id_priv, conn_param); in rdma_accept()
4673 cma_modify_qp_err(id_priv); in rdma_accept()
4682 struct rdma_id_private *id_priv = in rdma_accept_ece() local
4685 id_priv->ece.vendor_id = ece->vendor_id; in rdma_accept_ece()
4686 id_priv->ece.attr_mod = ece->attr_mod; in rdma_accept_ece()
4694 struct rdma_id_private *id_priv = in rdma_lock_handler() local
4697 mutex_lock(&id_priv->handler_mutex); in rdma_lock_handler()
4703 struct rdma_id_private *id_priv = in rdma_unlock_handler() local
4706 mutex_unlock(&id_priv->handler_mutex); in rdma_unlock_handler()
4712 struct rdma_id_private *id_priv; in rdma_notify() local
4715 id_priv = container_of(id, struct rdma_id_private, id); in rdma_notify()
4716 if (!id_priv->cm_id.ib) in rdma_notify()
4721 ret = ib_cm_notify(id_priv->cm_id.ib, event); in rdma_notify()
4734 struct rdma_id_private *id_priv; in rdma_reject() local
4737 id_priv = container_of(id, struct rdma_id_private, id); in rdma_reject()
4738 if (!id_priv->cm_id.ib) in rdma_reject()
4743 ret = cma_send_sidr_rep(id_priv, IB_SIDR_REJECT, 0, in rdma_reject()
4746 trace_cm_send_rej(id_priv); in rdma_reject()
4747 ret = ib_send_cm_rej(id_priv->cm_id.ib, reason, NULL, 0, in rdma_reject()
4751 ret = iw_cm_reject(id_priv->cm_id.iw, in rdma_reject()
4763 struct rdma_id_private *id_priv; in rdma_disconnect() local
4766 id_priv = container_of(id, struct rdma_id_private, id); in rdma_disconnect()
4767 if (!id_priv->cm_id.ib) in rdma_disconnect()
4771 ret = cma_modify_qp_err(id_priv); in rdma_disconnect()
4775 trace_cm_disconnect(id_priv); in rdma_disconnect()
4776 if (ib_send_cm_dreq(id_priv->cm_id.ib, NULL, 0)) { in rdma_disconnect()
4777 if (!ib_send_cm_drep(id_priv->cm_id.ib, NULL, 0)) in rdma_disconnect()
4778 trace_cm_sent_drep(id_priv); in rdma_disconnect()
4780 trace_cm_sent_dreq(id_priv); in rdma_disconnect()
4783 ret = iw_cm_disconnect(id_priv->cm_id.iw, 0); in rdma_disconnect()
4792 static void cma_make_mc_event(int status, struct rdma_id_private *id_priv, in cma_make_mc_event() argument
4812 dev_addr = &id_priv->id.route.addr.dev_addr; in cma_make_mc_event()
4815 id_priv->cma_dev in cma_make_mc_event()
4816 ->default_gid_type[id_priv->id.port_num - in cma_make_mc_event()
4818 id_priv->cma_dev->device)]; in cma_make_mc_event()
4821 if (ib_init_ah_from_mcmember(id_priv->id.device, id_priv->id.port_num, in cma_make_mc_event()
4829 event->param.ud.qkey = id_priv->qkey; in cma_make_mc_event()
4838 struct rdma_id_private *id_priv = mc->id_priv; in cma_ib_mc_handler() local
4842 mutex_lock(&id_priv->handler_mutex); in cma_ib_mc_handler()
4843 if (READ_ONCE(id_priv->state) == RDMA_CM_DEVICE_REMOVAL || in cma_ib_mc_handler()
4844 READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING) in cma_ib_mc_handler()
4847 ret = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey)); in cma_ib_mc_handler()
4849 cma_make_mc_event(status, id_priv, multicast, &event, mc); in cma_ib_mc_handler()
4850 ret = cma_cm_event_handler(id_priv, &event); in cma_ib_mc_handler()
4856 mutex_unlock(&id_priv->handler_mutex); in cma_ib_mc_handler()
4860 static void cma_set_mgid(struct rdma_id_private *id_priv, in cma_set_mgid() argument
4864 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_set_mgid()
4879 if (id_priv->id.ps == RDMA_PS_UDP) in cma_set_mgid()
4884 if (id_priv->id.ps == RDMA_PS_UDP) in cma_set_mgid()
4890 static int cma_join_ib_multicast(struct rdma_id_private *id_priv, in cma_join_ib_multicast() argument
4894 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_join_ib_multicast()
4899 ret = ib_sa_get_mcmember_rec(id_priv->id.device, id_priv->id.port_num, in cma_join_ib_multicast()
4904 if (!id_priv->qkey) { in cma_join_ib_multicast()
4905 ret = cma_set_default_qkey(id_priv); in cma_join_ib_multicast()
4910 cma_set_mgid(id_priv, (struct sockaddr *) &mc->addr, &rec.mgid); in cma_join_ib_multicast()
4911 rec.qkey = cpu_to_be32(id_priv->qkey); in cma_join_ib_multicast()
4922 if (id_priv->id.ps == RDMA_PS_IPOIB) in cma_join_ib_multicast()
4929 mc->sa_mc = ib_sa_join_multicast(&sa_client, id_priv->id.device, in cma_join_ib_multicast()
4930 id_priv->id.port_num, &rec, comp_mask, in cma_join_ib_multicast()
4964 static int cma_iboe_join_multicast(struct rdma_id_private *id_priv, in cma_iboe_join_multicast() argument
4967 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; in cma_iboe_join_multicast()
4980 gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num - in cma_iboe_join_multicast()
4981 rdma_start_port(id_priv->cma_dev->device)]; in cma_iboe_join_multicast()
5010 if (!id_priv->qkey) in cma_iboe_join_multicast()
5011 cma_set_default_qkey(id_priv); in cma_iboe_join_multicast()
5013 rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr, in cma_iboe_join_multicast()
5016 cma_make_mc_event(0, id_priv, &ib, &mc->iboe_join.event, mc); in cma_iboe_join_multicast()
5024 struct rdma_id_private *id_priv = in rdma_join_multicast() local
5034 if (!id->device || (READ_ONCE(id_priv->state) != RDMA_CM_ADDR_BOUND && in rdma_join_multicast()
5035 READ_ONCE(id_priv->state) != RDMA_CM_ADDR_RESOLVED)) in rdma_join_multicast()
5038 if (id_priv->id.qp_type != IB_QPT_UD) in rdma_join_multicast()
5047 mc->id_priv = id_priv; in rdma_join_multicast()
5051 ret = cma_iboe_join_multicast(id_priv, mc); in rdma_join_multicast()
5055 ret = cma_join_ib_multicast(id_priv, mc); in rdma_join_multicast()
5063 spin_lock(&id_priv->lock); in rdma_join_multicast()
5064 list_add(&mc->list, &id_priv->mc_list); in rdma_join_multicast()
5065 spin_unlock(&id_priv->lock); in rdma_join_multicast()
5076 struct rdma_id_private *id_priv; in rdma_leave_multicast() local
5079 id_priv = container_of(id, struct rdma_id_private, id); in rdma_leave_multicast()
5080 spin_lock_irq(&id_priv->lock); in rdma_leave_multicast()
5081 list_for_each_entry(mc, &id_priv->mc_list, list) { in rdma_leave_multicast()
5085 spin_unlock_irq(&id_priv->lock); in rdma_leave_multicast()
5087 WARN_ON(id_priv->cma_dev->device != id->device); in rdma_leave_multicast()
5088 destroy_mc(id_priv, mc); in rdma_leave_multicast()
5091 spin_unlock_irq(&id_priv->lock); in rdma_leave_multicast()
5095 static int cma_netdev_change(struct net_device *ndev, struct rdma_id_private *id_priv) in cma_netdev_change() argument
5100 dev_addr = &id_priv->id.route.addr.dev_addr; in cma_netdev_change()
5106 ndev->name, &id_priv->id); in cma_netdev_change()
5112 work->id = id_priv; in cma_netdev_change()
5114 cma_id_get(id_priv); in cma_netdev_change()
5126 struct rdma_id_private *id_priv; in cma_netdev_callback() local
5137 list_for_each_entry(id_priv, &cma_dev->id_list, device_item) { in cma_netdev_callback()
5138 ret = cma_netdev_change(ndev, id_priv); in cma_netdev_callback()
5150 struct rdma_id_private *id_priv = in cma_netevent_work_handler() local
5154 mutex_lock(&id_priv->handler_mutex); in cma_netevent_work_handler()
5156 if (READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING || in cma_netevent_work_handler()
5157 READ_ONCE(id_priv->state) == RDMA_CM_DEVICE_REMOVAL) in cma_netevent_work_handler()
5163 if (cma_cm_event_handler(id_priv, &event)) { in cma_netevent_work_handler()
5164 __acquire(&id_priv->handler_mutex); in cma_netevent_work_handler()
5165 id_priv->cm_id.ib = NULL; in cma_netevent_work_handler()
5166 cma_id_put(id_priv); in cma_netevent_work_handler()
5167 destroy_id_handler_unlock(id_priv); in cma_netevent_work_handler()
5172 mutex_unlock(&id_priv->handler_mutex); in cma_netevent_work_handler()
5173 cma_id_put(id_priv); in cma_netevent_work_handler()
5229 static void cma_send_device_removal_put(struct rdma_id_private *id_priv) in cma_send_device_removal_put() argument
5235 mutex_lock(&id_priv->handler_mutex); in cma_send_device_removal_put()
5237 spin_lock_irqsave(&id_priv->lock, flags); in cma_send_device_removal_put()
5238 state = id_priv->state; in cma_send_device_removal_put()
5240 spin_unlock_irqrestore(&id_priv->lock, flags); in cma_send_device_removal_put()
5241 mutex_unlock(&id_priv->handler_mutex); in cma_send_device_removal_put()
5242 cma_id_put(id_priv); in cma_send_device_removal_put()
5245 id_priv->state = RDMA_CM_DEVICE_REMOVAL; in cma_send_device_removal_put()
5246 spin_unlock_irqrestore(&id_priv->lock, flags); in cma_send_device_removal_put()
5248 if (cma_cm_event_handler(id_priv, &event)) { in cma_send_device_removal_put()
5253 cma_id_put(id_priv); in cma_send_device_removal_put()
5254 mutex_unlock(&id_priv->handler_mutex); in cma_send_device_removal_put()
5255 trace_cm_id_destroy(id_priv); in cma_send_device_removal_put()
5256 _destroy_id(id_priv, state); in cma_send_device_removal_put()
5259 mutex_unlock(&id_priv->handler_mutex); in cma_send_device_removal_put()
5265 cma_cancel_operation(id_priv, state); in cma_send_device_removal_put()
5266 cma_id_put(id_priv); in cma_send_device_removal_put()
5273 struct rdma_id_private *id_priv = list_first_entry( in cma_process_remove() local
5276 list_del_init(&id_priv->listen_item); in cma_process_remove()
5277 list_del_init(&id_priv->device_item); in cma_process_remove()
5278 cma_id_get(id_priv); in cma_process_remove()
5281 cma_send_device_removal_put(id_priv); in cma_process_remove()
5306 struct rdma_id_private *id_priv; in cma_add_one() local
5354 list_for_each_entry(id_priv, &listen_any_list, listen_any_item) { in cma_add_one()
5355 ret = cma_listen_on_dev(id_priv, cma_dev, &to_destroy); in cma_add_one()