static inline ssize_t sock_cq_rbuf_read(struct sock_cq *cq, void *buf, size_t count, fi_addr_t *src_addr, size_t cq_entry_len) { ssize_t i; fi_addr_t addr; rbfdread(&cq->cq_rbfd, buf, cq_entry_len * count); for (i = 0; i < count; i++) { rbread(&cq->addr_rb, &addr, sizeof(addr)); if (src_addr) src_addr[i] = addr; } return count; }
static ssize_t sock_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *buf, uint64_t flags) { struct sock_cq *sock_cq; ssize_t ret; sock_cq = container_of(cq, struct sock_cq, cq_fid); if (sock_cq->domain->progress_mode == FI_PROGRESS_MANUAL) sock_cq_progress(sock_cq); fastlock_acquire(&sock_cq->lock); if (rbused(&sock_cq->cqerr_rb) >= sizeof(struct fi_cq_err_entry)) { rbread(&sock_cq->cqerr_rb, buf, sizeof(*buf)); ret = 1; } else { ret = -FI_EAGAIN; } fastlock_release(&sock_cq->lock); return ret; }
ssize_t sock_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count, fi_addr_t *src_addr, const void *cond, int timeout) { int ret; fi_addr_t addr; int64_t threshold; ssize_t i, bytes_read, num_read, cq_entry_len; struct sock_cq *sock_cq; sock_cq = container_of(cq, struct sock_cq, cq_fid); cq_entry_len = sock_cq->cq_entry_size; if (sock_cq->attr.wait_cond == FI_CQ_COND_THRESHOLD) { threshold = MIN((int64_t)cond, count); }else{ threshold = count; } fastlock_acquire(&sock_cq->lock); bytes_read = rbfdsread(&sock_cq->cq_rbfd, buf, cq_entry_len*threshold, timeout); if(bytes_read == 0) { ret = -FI_ETIMEDOUT; goto out; } num_read = bytes_read/cq_entry_len; for(i=0; i < num_read; i++) { rbread(&sock_cq->addr_rb, &addr, sizeof(fi_addr_t)); if(src_addr) src_addr[i] = addr; } ret = num_read; out: fastlock_release(&sock_cq->lock); return ret; }
ssize_t sock_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *buf, size_t len, uint64_t flags) { ssize_t num_read; struct sock_cq *sock_cq; sock_cq = container_of(cq, struct sock_cq, cq_fid); if(len < sizeof(struct fi_cq_err_entry)) return -FI_ETOOSMALL; num_read = 0; fastlock_acquire(&sock_cq->lock); while(rbused(&sock_cq->cqerr_rb) >= sizeof(struct fi_cq_err_entry)) { rbread(&sock_cq->cqerr_rb, (char*)buf +sizeof(struct fi_cq_err_entry) * num_read, sizeof(struct fi_cq_err_entry)); num_read++; } fastlock_release(&sock_cq->lock); return num_read; }
ssize_t sock_comm_recv(struct sock_conn *conn, void *buf, size_t len) { int ret = 0; ssize_t used, read_len; used = rbused(&conn->inbuf); if (used == 0) { ret = sock_comm_recv_socket(conn, buf, len); sock_comm_recv_buffer(conn); return ret; } read_len = MIN(len, used); rbread(&conn->inbuf, buf, read_len); if (len > used) { ret = sock_comm_recv_socket(conn, (char*) buf + used, len - used); if (ret <= 0) ret = 0; sock_comm_recv_buffer(conn); } SOCK_LOG_INFO("read from buffer: %lu\n", ret + read_len); return ret + read_len; }