uint64_t addr;
uint32_t rkey;
uint32_t len = sge->length;
+ int ret;
rs->sseq_no++;
rs->sqe_avail--;
rs->target_sge = 0;
}
- return rs_post_write(rs, rs_wrid_set(1, len), sge, 1,
- rs_msg_set(RS_OP_DATA, len), flags, addr, rkey);
+ ret = rs_post_write(rs, rs_wrid_set(1, len), sge, 1,
+ rs_msg_set(RS_OP_DATA, len), flags, addr, rkey);
+ if (len < rs_sbuf_left(rs))
+ rs->ssge.addr += len;
+ else
+ rs->ssge.addr = (uintptr_t) rs->sbuf;
+ return ret;
}
static uint32_t rs_sbuf_left(struct rsocket *rs)
sge.length = xfer_size;
sge.lkey = 0;
ret = rs_write_data(rs, &sge, IBV_SEND_INLINE);
- if (xfer_size == rs_sbuf_left(rs))
- rs->ssge.addr = (uintptr_t) rs->sbuf;
} else {
memcpy((void *) (uintptr_t) rs->ssge.addr, buf, xfer_size);
rs->ssge.length = xfer_size;
ret = rs_write_data(rs, &rs->ssge, 0);
- if (xfer_size < rs_sbuf_left(rs))
- rs->ssge.addr += xfer_size;
- else
- rs->ssge.addr = (uintptr_t) rs->sbuf;
}
if (ret)
break;
len += iov[i].iov_len;
fastlock_acquire(&rs->slock);
- for (left = len; left; left -= xfer_size) {
+ for (left = len; left && !ret; left -= xfer_size) {
if (!rs_can_send(rs)) {
ret = rs_get_comp(rs, rs_nonblocking(rs, flags),
rs_conn_can_send);
rs->ssge.length = xfer_size;
ret = rs_write_data(rs, &rs->ssge, xfer_size <= rs->sq_inline ?
IBV_SEND_INLINE : 0);
- if (ret)
- break;
-
- if (xfer_size < rs_sbuf_left(rs))
- rs->ssge.addr += xfer_size;
- else
- rs->ssge.addr = (uintptr_t) rs->sbuf;
}
fastlock_release(&rs->slock);