Lines Matching refs:ctx
95 struct ucma_context *ctx; member
105 struct ucma_context *ctx; member
119 struct ucma_context *ctx; in _ucma_find_context() local
121 ctx = idr_find(&ctx_idr, id); in _ucma_find_context()
122 if (!ctx) in _ucma_find_context()
123 ctx = ERR_PTR(-ENOENT); in _ucma_find_context()
124 else if (ctx->file != file) in _ucma_find_context()
125 ctx = ERR_PTR(-EINVAL); in _ucma_find_context()
126 return ctx; in _ucma_find_context()
131 struct ucma_context *ctx; in ucma_get_ctx() local
134 ctx = _ucma_find_context(id, file); in ucma_get_ctx()
135 if (!IS_ERR(ctx)) in ucma_get_ctx()
136 atomic_inc(&ctx->ref); in ucma_get_ctx()
138 return ctx; in ucma_get_ctx()
141 static void ucma_put_ctx(struct ucma_context *ctx) in ucma_put_ctx() argument
143 if (atomic_dec_and_test(&ctx->ref)) in ucma_put_ctx()
144 complete(&ctx->comp); in ucma_put_ctx()
149 struct ucma_context *ctx; in ucma_alloc_ctx() local
151 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); in ucma_alloc_ctx()
152 if (!ctx) in ucma_alloc_ctx()
155 atomic_set(&ctx->ref, 1); in ucma_alloc_ctx()
156 init_completion(&ctx->comp); in ucma_alloc_ctx()
157 INIT_LIST_HEAD(&ctx->mc_list); in ucma_alloc_ctx()
158 ctx->file = file; in ucma_alloc_ctx()
161 ctx->id = idr_alloc(&ctx_idr, ctx, 0, 0, GFP_KERNEL); in ucma_alloc_ctx()
163 if (ctx->id < 0) in ucma_alloc_ctx()
166 list_add_tail(&ctx->list, &file->ctx_list); in ucma_alloc_ctx()
167 return ctx; in ucma_alloc_ctx()
170 kfree(ctx); in ucma_alloc_ctx()
174 static struct ucma_multicast* ucma_alloc_multicast(struct ucma_context *ctx) in ucma_alloc_multicast() argument
188 mc->ctx = ctx; in ucma_alloc_multicast()
189 list_add_tail(&mc->list, &ctx->mc_list); in ucma_alloc_multicast()
225 static void ucma_set_event_context(struct ucma_context *ctx, in ucma_set_event_context() argument
229 uevent->ctx = ctx; in ucma_set_event_context()
239 uevent->resp.uid = ctx->uid; in ucma_set_event_context()
240 uevent->resp.id = ctx->id; in ucma_set_event_context()
249 struct ucma_context *ctx = cm_id->context; in ucma_event_handler() local
256 mutex_lock(&ctx->file->mut); in ucma_event_handler()
258 ucma_set_event_context(ctx, event, uevent); in ucma_event_handler()
268 if (!ctx->backlog) { in ucma_event_handler()
273 ctx->backlog--; in ucma_event_handler()
274 } else if (!ctx->uid || ctx->cm_id != cm_id) { in ucma_event_handler()
285 list_add_tail(&uevent->list, &ctx->file->event_list); in ucma_event_handler()
286 wake_up_interruptible(&ctx->file->poll_wait); in ucma_event_handler()
288 mutex_unlock(&ctx->file->mut); in ucma_event_handler()
295 struct ucma_context *ctx; in ucma_get_event() local
323 ctx = ucma_alloc_ctx(file); in ucma_get_event()
324 if (!ctx) { in ucma_get_event()
328 uevent->ctx->backlog++; in ucma_get_event()
329 ctx->cm_id = uevent->cm_id; in ucma_get_event()
330 ctx->cm_id->context = ctx; in ucma_get_event()
331 uevent->resp.id = ctx->id; in ucma_get_event()
341 uevent->ctx->events_reported++; in ucma_get_event()
373 struct ucma_context *ctx; in ucma_create_id() local
388 ctx = ucma_alloc_ctx(file); in ucma_create_id()
390 if (!ctx) in ucma_create_id()
393 ctx->uid = cmd.uid; in ucma_create_id()
394 ctx->cm_id = rdma_create_id(ucma_event_handler, ctx, cmd.ps, qp_type); in ucma_create_id()
395 if (IS_ERR(ctx->cm_id)) { in ucma_create_id()
396 ret = PTR_ERR(ctx->cm_id); in ucma_create_id()
400 resp.id = ctx->id; in ucma_create_id()
409 rdma_destroy_id(ctx->cm_id); in ucma_create_id()
412 idr_remove(&ctx_idr, ctx->id); in ucma_create_id()
414 kfree(ctx); in ucma_create_id()
418 static void ucma_cleanup_multicast(struct ucma_context *ctx) in ucma_cleanup_multicast() argument
423 list_for_each_entry_safe(mc, tmp, &ctx->mc_list, list) { in ucma_cleanup_multicast()
435 list_for_each_entry_safe(uevent, tmp, &mc->ctx->file->event_list, list) { in ucma_cleanup_mc_events()
449 static int ucma_free_ctx(struct ucma_context *ctx) in ucma_free_ctx() argument
456 rdma_destroy_id(ctx->cm_id); in ucma_free_ctx()
458 ucma_cleanup_multicast(ctx); in ucma_free_ctx()
461 mutex_lock(&ctx->file->mut); in ucma_free_ctx()
462 list_for_each_entry_safe(uevent, tmp, &ctx->file->event_list, list) { in ucma_free_ctx()
463 if (uevent->ctx == ctx) in ucma_free_ctx()
466 list_del(&ctx->list); in ucma_free_ctx()
467 mutex_unlock(&ctx->file->mut); in ucma_free_ctx()
476 events_reported = ctx->events_reported; in ucma_free_ctx()
477 kfree(ctx); in ucma_free_ctx()
486 struct ucma_context *ctx; in ucma_destroy_id() local
496 ctx = _ucma_find_context(cmd.id, file); in ucma_destroy_id()
497 if (!IS_ERR(ctx)) in ucma_destroy_id()
498 idr_remove(&ctx_idr, ctx->id); in ucma_destroy_id()
501 if (IS_ERR(ctx)) in ucma_destroy_id()
502 return PTR_ERR(ctx); in ucma_destroy_id()
504 ucma_put_ctx(ctx); in ucma_destroy_id()
505 wait_for_completion(&ctx->comp); in ucma_destroy_id()
506 resp.events_reported = ucma_free_ctx(ctx); in ucma_destroy_id()
519 struct ucma_context *ctx; in ucma_bind_ip() local
525 ctx = ucma_get_ctx(file, cmd.id); in ucma_bind_ip()
526 if (IS_ERR(ctx)) in ucma_bind_ip()
527 return PTR_ERR(ctx); in ucma_bind_ip()
529 ret = rdma_bind_addr(ctx->cm_id, (struct sockaddr *) &cmd.addr); in ucma_bind_ip()
530 ucma_put_ctx(ctx); in ucma_bind_ip()
539 struct ucma_context *ctx; in ucma_bind() local
549 ctx = ucma_get_ctx(file, cmd.id); in ucma_bind()
550 if (IS_ERR(ctx)) in ucma_bind()
551 return PTR_ERR(ctx); in ucma_bind()
553 ret = rdma_bind_addr(ctx->cm_id, addr); in ucma_bind()
554 ucma_put_ctx(ctx); in ucma_bind()
563 struct ucma_context *ctx; in ucma_resolve_ip() local
569 ctx = ucma_get_ctx(file, cmd.id); in ucma_resolve_ip()
570 if (IS_ERR(ctx)) in ucma_resolve_ip()
571 return PTR_ERR(ctx); in ucma_resolve_ip()
573 ret = rdma_resolve_addr(ctx->cm_id, (struct sockaddr *) &cmd.src_addr, in ucma_resolve_ip()
576 ucma_put_ctx(ctx); in ucma_resolve_ip()
586 struct ucma_context *ctx; in ucma_resolve_addr() local
598 ctx = ucma_get_ctx(file, cmd.id); in ucma_resolve_addr()
599 if (IS_ERR(ctx)) in ucma_resolve_addr()
600 return PTR_ERR(ctx); in ucma_resolve_addr()
602 ret = rdma_resolve_addr(ctx->cm_id, src, dst, cmd.timeout_ms); in ucma_resolve_addr()
603 ucma_put_ctx(ctx); in ucma_resolve_addr()
612 struct ucma_context *ctx; in ucma_resolve_route() local
618 ctx = ucma_get_ctx(file, cmd.id); in ucma_resolve_route()
619 if (IS_ERR(ctx)) in ucma_resolve_route()
620 return PTR_ERR(ctx); in ucma_resolve_route()
622 ret = rdma_resolve_route(ctx->cm_id, cmd.timeout_ms); in ucma_resolve_route()
623 ucma_put_ctx(ctx); in ucma_resolve_route()
697 struct ucma_context *ctx; in ucma_query_route() local
707 ctx = ucma_get_ctx(file, cmd.id); in ucma_query_route()
708 if (IS_ERR(ctx)) in ucma_query_route()
709 return PTR_ERR(ctx); in ucma_query_route()
712 addr = (struct sockaddr *) &ctx->cm_id->route.addr.src_addr; in ucma_query_route()
716 addr = (struct sockaddr *) &ctx->cm_id->route.addr.dst_addr; in ucma_query_route()
720 if (!ctx->cm_id->device) in ucma_query_route()
723 resp.node_guid = (__force __u64) ctx->cm_id->device->node_guid; in ucma_query_route()
724 resp.port_num = ctx->cm_id->port_num; in ucma_query_route()
725 switch (rdma_node_get_transport(ctx->cm_id->device->node_type)) { in ucma_query_route()
727 switch (rdma_port_get_link_layer(ctx->cm_id->device, in ucma_query_route()
728 ctx->cm_id->port_num)) { in ucma_query_route()
730 ucma_copy_ib_route(&resp, &ctx->cm_id->route); in ucma_query_route()
733 ucma_copy_iboe_route(&resp, &ctx->cm_id->route); in ucma_query_route()
740 ucma_copy_iw_route(&resp, &ctx->cm_id->route); in ucma_query_route()
751 ucma_put_ctx(ctx); in ucma_query_route()
767 static ssize_t ucma_query_addr(struct ucma_context *ctx, in ucma_query_addr() argument
779 addr = (struct sockaddr *) &ctx->cm_id->route.addr.src_addr; in ucma_query_addr()
783 addr = (struct sockaddr *) &ctx->cm_id->route.addr.dst_addr; in ucma_query_addr()
787 ucma_query_device_addr(ctx->cm_id, &resp); in ucma_query_addr()
795 static ssize_t ucma_query_path(struct ucma_context *ctx, in ucma_query_path() argument
808 resp->num_paths = ctx->cm_id->route.num_paths; in ucma_query_path()
815 ib_sa_pack_path(&ctx->cm_id->route.path_rec[i], in ucma_query_path()
827 static ssize_t ucma_query_gid(struct ucma_context *ctx, in ucma_query_gid() argument
839 ucma_query_device_addr(ctx->cm_id, &resp); in ucma_query_gid()
843 if (ctx->cm_id->route.addr.src_addr.ss_family == AF_IB) { in ucma_query_gid()
844 memcpy(addr, &ctx->cm_id->route.addr.src_addr, resp.src_size); in ucma_query_gid()
848 rdma_addr_get_sgid(&ctx->cm_id->route.addr.dev_addr, in ucma_query_gid()
850 addr->sib_sid = rdma_get_service_id(ctx->cm_id, (struct sockaddr *) in ucma_query_gid()
851 &ctx->cm_id->route.addr.src_addr); in ucma_query_gid()
856 if (ctx->cm_id->route.addr.dst_addr.ss_family == AF_IB) { in ucma_query_gid()
857 memcpy(addr, &ctx->cm_id->route.addr.dst_addr, resp.dst_size); in ucma_query_gid()
861 rdma_addr_get_dgid(&ctx->cm_id->route.addr.dev_addr, in ucma_query_gid()
863 addr->sib_sid = rdma_get_service_id(ctx->cm_id, (struct sockaddr *) in ucma_query_gid()
864 &ctx->cm_id->route.addr.dst_addr); in ucma_query_gid()
878 struct ucma_context *ctx; in ucma_query() local
886 ctx = ucma_get_ctx(file, cmd.id); in ucma_query()
887 if (IS_ERR(ctx)) in ucma_query()
888 return PTR_ERR(ctx); in ucma_query()
892 ret = ucma_query_addr(ctx, response, out_len); in ucma_query()
895 ret = ucma_query_path(ctx, response, out_len); in ucma_query()
898 ret = ucma_query_gid(ctx, response, out_len); in ucma_query()
905 ucma_put_ctx(ctx); in ucma_query()
930 struct ucma_context *ctx; in ucma_connect() local
939 ctx = ucma_get_ctx(file, cmd.id); in ucma_connect()
940 if (IS_ERR(ctx)) in ucma_connect()
941 return PTR_ERR(ctx); in ucma_connect()
943 ucma_copy_conn_param(ctx->cm_id, &conn_param, &cmd.conn_param); in ucma_connect()
944 ret = rdma_connect(ctx->cm_id, &conn_param); in ucma_connect()
945 ucma_put_ctx(ctx); in ucma_connect()
953 struct ucma_context *ctx; in ucma_listen() local
959 ctx = ucma_get_ctx(file, cmd.id); in ucma_listen()
960 if (IS_ERR(ctx)) in ucma_listen()
961 return PTR_ERR(ctx); in ucma_listen()
963 ctx->backlog = cmd.backlog > 0 && cmd.backlog < max_backlog ? in ucma_listen()
965 ret = rdma_listen(ctx->cm_id, ctx->backlog); in ucma_listen()
966 ucma_put_ctx(ctx); in ucma_listen()
975 struct ucma_context *ctx; in ucma_accept() local
981 ctx = ucma_get_ctx(file, cmd.id); in ucma_accept()
982 if (IS_ERR(ctx)) in ucma_accept()
983 return PTR_ERR(ctx); in ucma_accept()
986 ucma_copy_conn_param(ctx->cm_id, &conn_param, &cmd.conn_param); in ucma_accept()
988 ret = rdma_accept(ctx->cm_id, &conn_param); in ucma_accept()
990 ctx->uid = cmd.uid; in ucma_accept()
993 ret = rdma_accept(ctx->cm_id, NULL); in ucma_accept()
995 ucma_put_ctx(ctx); in ucma_accept()
1003 struct ucma_context *ctx; in ucma_reject() local
1009 ctx = ucma_get_ctx(file, cmd.id); in ucma_reject()
1010 if (IS_ERR(ctx)) in ucma_reject()
1011 return PTR_ERR(ctx); in ucma_reject()
1013 ret = rdma_reject(ctx->cm_id, cmd.private_data, cmd.private_data_len); in ucma_reject()
1014 ucma_put_ctx(ctx); in ucma_reject()
1022 struct ucma_context *ctx; in ucma_disconnect() local
1028 ctx = ucma_get_ctx(file, cmd.id); in ucma_disconnect()
1029 if (IS_ERR(ctx)) in ucma_disconnect()
1030 return PTR_ERR(ctx); in ucma_disconnect()
1032 ret = rdma_disconnect(ctx->cm_id); in ucma_disconnect()
1033 ucma_put_ctx(ctx); in ucma_disconnect()
1043 struct ucma_context *ctx; in ucma_init_qp_attr() local
1053 ctx = ucma_get_ctx(file, cmd.id); in ucma_init_qp_attr()
1054 if (IS_ERR(ctx)) in ucma_init_qp_attr()
1055 return PTR_ERR(ctx); in ucma_init_qp_attr()
1060 ret = rdma_init_qp_attr(ctx->cm_id, &qp_attr, &resp.qp_attr_mask); in ucma_init_qp_attr()
1070 ucma_put_ctx(ctx); in ucma_init_qp_attr()
1074 static int ucma_set_option_id(struct ucma_context *ctx, int optname, in ucma_set_option_id() argument
1085 rdma_set_service_type(ctx->cm_id, *((u8 *) optval)); in ucma_set_option_id()
1092 ret = rdma_set_reuseaddr(ctx->cm_id, *((int *) optval) ? 1 : 0); in ucma_set_option_id()
1099 ret = rdma_set_afonly(ctx->cm_id, *((int *) optval) ? 1 : 0); in ucma_set_option_id()
1108 static int ucma_set_ib_path(struct ucma_context *ctx, in ucma_set_ib_path() argument
1131 ret = rdma_set_ib_paths(ctx->cm_id, &sa_path, 1); in ucma_set_ib_path()
1137 return ucma_event_handler(ctx->cm_id, &event); in ucma_set_ib_path()
1140 static int ucma_set_option_ib(struct ucma_context *ctx, int optname, in ucma_set_option_ib() argument
1147 ret = ucma_set_ib_path(ctx, optval, optlen); in ucma_set_option_ib()
1156 static int ucma_set_option_level(struct ucma_context *ctx, int level, in ucma_set_option_level() argument
1163 ret = ucma_set_option_id(ctx, optname, optval, optlen); in ucma_set_option_level()
1166 ret = ucma_set_option_ib(ctx, optname, optval, optlen); in ucma_set_option_level()
1179 struct ucma_context *ctx; in ucma_set_option() local
1186 ctx = ucma_get_ctx(file, cmd.id); in ucma_set_option()
1187 if (IS_ERR(ctx)) in ucma_set_option()
1188 return PTR_ERR(ctx); in ucma_set_option()
1197 ret = ucma_set_option_level(ctx, cmd.level, cmd.optname, optval, in ucma_set_option()
1202 ucma_put_ctx(ctx); in ucma_set_option()
1210 struct ucma_context *ctx; in ucma_notify() local
1216 ctx = ucma_get_ctx(file, cmd.id); in ucma_notify()
1217 if (IS_ERR(ctx)) in ucma_notify()
1218 return PTR_ERR(ctx); in ucma_notify()
1220 ret = rdma_notify(ctx->cm_id, (enum ib_event_type) cmd.event); in ucma_notify()
1221 ucma_put_ctx(ctx); in ucma_notify()
1229 struct ucma_context *ctx; in ucma_process_join() local
1241 ctx = ucma_get_ctx(file, cmd->id); in ucma_process_join()
1242 if (IS_ERR(ctx)) in ucma_process_join()
1243 return PTR_ERR(ctx); in ucma_process_join()
1246 mc = ucma_alloc_multicast(ctx); in ucma_process_join()
1254 ret = rdma_join_multicast(ctx->cm_id, (struct sockaddr *) &mc->addr, mc); in ucma_process_join()
1266 ucma_put_ctx(ctx); in ucma_process_join()
1270 rdma_leave_multicast(ctx->cm_id, (struct sockaddr *) &mc->addr); in ucma_process_join()
1280 ucma_put_ctx(ctx); in ucma_process_join()
1335 else if (mc->ctx->file != file) in ucma_leave_multicast()
1339 atomic_inc(&mc->ctx->ref); in ucma_leave_multicast()
1348 rdma_leave_multicast(mc->ctx->cm_id, (struct sockaddr *) &mc->addr); in ucma_leave_multicast()
1349 mutex_lock(&mc->ctx->file->mut); in ucma_leave_multicast()
1352 mutex_unlock(&mc->ctx->file->mut); in ucma_leave_multicast()
1354 ucma_put_ctx(mc->ctx); in ucma_leave_multicast()
1388 static void ucma_move_events(struct ucma_context *ctx, struct ucma_file *file) in ucma_move_events() argument
1392 list_for_each_entry_safe(uevent, tmp, &ctx->file->event_list, list) in ucma_move_events()
1393 if (uevent->ctx == ctx) in ucma_move_events()
1403 struct ucma_context *ctx; in ucma_migrate_id() local
1417 ctx = ucma_get_ctx(f.file->private_data, cmd.id); in ucma_migrate_id()
1418 if (IS_ERR(ctx)) { in ucma_migrate_id()
1419 ret = PTR_ERR(ctx); in ucma_migrate_id()
1423 cur_file = ctx->file; in ucma_migrate_id()
1425 resp.events_reported = ctx->events_reported; in ucma_migrate_id()
1436 list_move_tail(&ctx->list, &new_file->ctx_list); in ucma_migrate_id()
1437 ucma_move_events(ctx, new_file); in ucma_migrate_id()
1438 ctx->file = new_file; in ucma_migrate_id()
1439 resp.events_reported = ctx->events_reported; in ucma_migrate_id()
1449 ucma_put_ctx(ctx); in ucma_migrate_id()
1558 struct ucma_context *ctx, *tmp; in ucma_close() local
1561 list_for_each_entry_safe(ctx, tmp, &file->ctx_list, list) { in ucma_close()
1565 idr_remove(&ctx_idr, ctx->id); in ucma_close()
1568 ucma_free_ctx(ctx); in ucma_close()