Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}