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) { size_t i; fi_addr_t addr; ofi_rbfdread(&cq->cq_rbfd, buf, cq_entry_len * count); for (i = 0; i < count; i++) { ofi_rbread(&cq->addr_rb, &addr, sizeof(addr)); if (src_addr) src_addr[i] = addr; } sock_cq_copy_overflow_list(cq, count); return count; }
ssize_t sock_comm_recv(struct sock_pe_entry *pe_entry, void *buf, size_t len) { ssize_t read_len; if (ofi_rbempty(&pe_entry->comm_buf)) { if (len <= pe_entry->cache_sz) { sock_comm_recv_buffer(pe_entry); } else { return sock_comm_recv_socket(pe_entry->conn, buf, len); } } read_len = MIN(len, ofi_rbused(&pe_entry->comm_buf)); ofi_rbread(&pe_entry->comm_buf, buf, read_len); SOCK_LOG_DBG("read from buffer: %lu\n", read_len); return read_len; }
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; struct fi_cq_err_entry entry; uint32_t api_version; size_t err_data_size = 0; void *err_data = NULL; 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 (ofi_rbused(&sock_cq->cqerr_rb) >= sizeof(struct fi_cq_err_entry)) { api_version = sock_cq->domain->fab->fab_fid.api_version; ofi_rbread(&sock_cq->cqerr_rb, &entry, sizeof(entry)); if ((FI_VERSION_GE(api_version, FI_VERSION(1, 5))) && buf->err_data && buf->err_data_size) { err_data = buf->err_data; err_data_size = buf->err_data_size; *buf = entry; buf->err_data = err_data; /* Fill provided user's buffer */ buf->err_data_size = MIN(entry.err_data_size, err_data_size); memcpy(buf->err_data, entry.err_data, buf->err_data_size); } else { *buf = entry; } ret = 1; } else { ret = -FI_EAGAIN; } fastlock_release(&sock_cq->lock); return ret; }