u32 bytes_completed);
int sdp_handle_rdma_read_cqe(struct sdp_sock *ssk);
int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb,
- int len);
+ unsigned long *used);
int sdp_post_rdma_rd_compl(struct sdp_sock *ssk,
struct rx_srcavail_state *rx_sa);
int sdp_post_sendsm(struct sock *sk);
/* or advertised for RDMA */
lock_sock(sk);
- sdp_dbg_data(sk, "iovlen: %ld iov_len: %ld flags: 0x%x peek: 0x%x\n",
+ sdp_dbg_data(sk, "iovlen: %ld iov_len: 0x%lx flags: 0x%x peek: 0x%x\n",
msg->msg_iovlen, msg->msg_iov[0].iov_len, flags,
MSG_PEEK);
if (rx_sa && rx_sa->used >= skb->len) {
/* No more payload - start rdma copy */
sdp_dbg_data(sk, "RDMA copy of %ld bytes\n", used);
- err = sdp_rdma_to_iovec(sk, msg->msg_iov, skb,
- used);
+ err = sdp_rdma_to_iovec(sk, msg->msg_iov, skb, &used);
if (err == -EAGAIN) {
sdp_dbg_data(sk, "RDMA Read aborted\n");
- used = 0;
goto skb_cleanup;
}
} else {
ssk->tx_sa = tx_sa;
/* must have payload inlined in SrcAvail packet in combined mode */
- payload_len = tx_sa->umem->page_size - off;
+ payload_len = MIN(tx_sa->umem->page_size - off, len);
+ payload_len = MIN(payload_len, ssk->xmit_size_goal - sizeof(struct sdp_srcah));
payload_pg = sg_page(&chunk->page_list[0]);
get_page(payload_pg);
static int sdp_update_iov_used(struct sock *sk, struct iovec *iov, int len)
{
- sdp_dbg_data(sk, "updating consumed %d bytes from iov\n", len);
+ sdp_dbg_data(sk, "updating consumed 0x%x bytes from iov\n", len);
while (len > 0) {
if (iov->iov_len) {
int copy = min_t(unsigned int, iov->iov_len, len);
}
int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb,
- int len)
+ unsigned long *used)
{
struct sdp_sock *ssk = sdp_sk(sk);
struct rx_srcavail_state *rx_sa = RX_SRCAVAIL_STATE(skb);
int got_srcavail_cancel;
int rc = 0;
+ int len = *used;
sdp_dbg_data(&ssk->isk.sk, "preparing RDMA read."
" len: 0x%x. buffer len: 0x%lx\n", len, iov->iov_len);
sdp_update_iov_used(sk, iov, copied);
rx_sa->used += copied;
atomic_add(copied, &ssk->rcv_nxt);
+ *used += copied;
}
ssk->tx_ring.rdma_inflight = NULL;