static int send_destroy_ctx(struct pingpong_context *ctx, struct perftest_parameters *user_param, struct mcast_parameters *mcg_params) { int i; if (user_param->use_mcg) { for (i=0; i < user_param->num_of_qps; i++) { if (ibv_detach_mcast(ctx->qp[i],&mcg_params->base_mgid,mcg_params->base_mlid)) { fprintf(stderr, "Couldn't dettach QP to MultiCast group\n"); return FAILURE; } } if (!strcmp(link_layer_str(user_param->link_type),"IB")) { if (join_multicast_group(SUBN_ADM_METHOD_DELETE,mcg_params)) { fprintf(stderr,"Couldn't Unregister the Mcast group on the SM\n"); return FAILURE; } memcpy(mcg_params->mgid.raw,mcg_params->base_mgid.raw,16); if (join_multicast_group(SUBN_ADM_METHOD_DELETE,mcg_params)) { fprintf(stderr,"Couldn't Unregister the Mcast group on the SM\n"); return FAILURE; } } } return destroy_ctx(ctx,user_param); }
static int send_destroy_ctx( struct pingpong_context *ctx, struct perftest_parameters *user_param, struct mcast_parameters *mcg_params) { int i; if (user_param->use_mcg) { if (user_param->duplex || user_param->machine == SERVER) { for (i=0; i < user_param->num_of_qps; i++) { if (ibv_detach_mcast(ctx->qp[i],&mcg_params->mgid,mcg_params->mlid)) { fprintf(stderr, "Couldn't attach QP to MultiCast group"); return FAILURE; } } } /* Removal Request for Mcast group in SM if needed. */ if (!strcmp(link_layer_str(user_param->link_type),"IB")) { if (join_multicast_group(SUBN_ADM_METHOD_DELETE,mcg_params)) { fprintf(stderr,"Couldn't Unregister the Mcast group on the SM\n"); return FAILURE; } } } return destroy_ctx(ctx,user_param); }
int rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr) { struct ucma_abi_destroy_id *cmd; struct ucma_abi_destroy_id_resp *resp; struct cma_id_private *id_priv; struct cma_multicast *mc, **pos; void *msg; int ret, size, addrlen; addrlen = ucma_addrlen(addr); if (!addrlen) return ERR(EINVAL); id_priv = container_of(id, struct cma_id_private, id); pthread_mutex_lock(&id_priv->mut); for (pos = &id_priv->mc_list; *pos; pos = &(*pos)->next) if (!memcmp(&(*pos)->addr, addr, addrlen)) break; mc = *pos; if (*pos) *pos = mc->next; pthread_mutex_unlock(&id_priv->mut); if (!mc) return ERR(EADDRNOTAVAIL); if (id->qp) ibv_detach_mcast(id->qp, &mc->mgid, mc->mlid); CMA_CREATE_MSG_CMD_RESP(msg, cmd, resp, UCMA_CMD_LEAVE_MCAST, size); cmd->id = mc->handle; ret = write(id->channel->fd, msg, size); if (ret != size) { ret = (ret >= 0) ? ERR(ECONNREFUSED) : -1; goto free; } VALGRIND_MAKE_MEM_DEFINED(resp, sizeof *resp); pthread_mutex_lock(&id_priv->mut); while (mc->events_completed < resp->events_reported) pthread_cond_wait(&mc->cond, &id_priv->mut); pthread_mutex_unlock(&id_priv->mut); ret = 0; free: free(mc); return ret; }
int __ibv_detach_mcast_1_0(struct ibv_qp_1_0 *qp, union ibv_gid *gid, uint16_t lid) { return ibv_detach_mcast(qp->real_qp, gid, lid); }
int __ibv_detach_mcast_1_0(struct ibv_qp_1_0 *qp, union ibv_gid *gid, uint16_t lid) { fprintf(stderr, "%s:%s:%d \n", __func__, __FILE__, __LINE__); return ibv_detach_mcast(qp->real_qp, gid, lid); }