static int sock_cq_control(struct fid *fid, int command, void *arg) { struct sock_cq *cq; int ret = 0; cq = container_of(fid, struct sock_cq, cq_fid); switch (command) { case FI_GETWAIT: switch (cq->attr.wait_obj) { case FI_WAIT_NONE: case FI_WAIT_FD: case FI_WAIT_UNSPEC: memcpy(arg, &cq->cq_rbfd.fd[RB_READ_FD], sizeof(int)); break; case FI_WAIT_SET: case FI_WAIT_MUTEX_COND: sock_wait_get_obj(cq->waitset, arg); break; default: ret = -FI_EINVAL; break; } break; default: ret = -FI_EINVAL; break; } return ret; }
static int sock_cntr_control(struct fid *fid, int command, void *arg) { int ret = 0; struct sock_cntr *cntr; cntr = container_of(fid, struct sock_cntr, cntr_fid); switch (command) { case FI_GETWAIT: if (cntr->domain->progress_mode == FI_PROGRESS_MANUAL) return -FI_ENOSYS; switch (cntr->attr.wait_obj) { case FI_WAIT_NONE: case FI_WAIT_UNSPEC: case FI_WAIT_MUTEX_COND: memcpy(arg, &cntr->mut, sizeof(cntr->mut)); memcpy((char *)arg + sizeof(cntr->mut), &cntr->cond, sizeof(cntr->cond)); break; case FI_WAIT_SET: case FI_WAIT_FD: sock_wait_get_obj(cntr->waitset, arg); break; default: ret = -FI_EINVAL; break; } break; case FI_GETOPSFLAG: memcpy(arg, &cntr->attr.flags, sizeof(uint64_t)); break; case FI_SETOPSFLAG: memcpy(&cntr->attr.flags, arg, sizeof(uint64_t)); break; default: ret = -FI_EINVAL; break; } return ret; }