From 581c14d1f29ae193cbe6d5747cdcd63bdac44750 Mon Sep 17 00:00:00 2001 From: Amir Vadai Date: Sun, 20 Dec 2009 11:45:37 +0200 Subject: [PATCH] sdp: ZCopy SrcAvail payload size limit fixed + fix ZCopy rx for small packets Signed-off-by: Amir Vadai --- drivers/infiniband/ulp/sdp/sdp.h | 2 +- drivers/infiniband/ulp/sdp/sdp_main.c | 6 ++---- drivers/infiniband/ulp/sdp/sdp_zcopy.c | 9 ++++++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index 8af80dea46f4..f436c90c74ef 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -771,7 +771,7 @@ void sdp_handle_rdma_read_compl(struct sdp_sock *ssk, u32 mseq_ack, 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); diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index 732398e3937b..2590514881db 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -2042,7 +2042,7 @@ static int sdp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, /* 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); @@ -2249,11 +2249,9 @@ static int sdp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, 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 { diff --git a/drivers/infiniband/ulp/sdp/sdp_zcopy.c b/drivers/infiniband/ulp/sdp/sdp_zcopy.c index 81baa6ed5b8e..cfa3beec1e7d 100644 --- a/drivers/infiniband/ulp/sdp/sdp_zcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_zcopy.c @@ -81,7 +81,8 @@ static int sdp_post_srcavail(struct sock *sk, struct tx_srcavail_state *tx_sa) 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); @@ -304,7 +305,7 @@ int sdp_post_sendsm(struct sock *sk) 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); @@ -508,12 +509,13 @@ static int sdp_post_rdma_read(struct sock *sk, struct rx_srcavail_state *rx_sa) } 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); @@ -562,6 +564,7 @@ int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb, 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; -- 2.50.1