]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: ZCopy SrcAvail payload size limit fixed + fix ZCopy rx for small packets
authorAmir Vadai <amirv@mellanox.co.il>
Sun, 20 Dec 2009 09:45:37 +0000 (11:45 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:44 +0000 (05:04 -0700)
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp.h
drivers/infiniband/ulp/sdp/sdp_main.c
drivers/infiniband/ulp/sdp/sdp_zcopy.c

index 8af80dea46f41485a99f229d438ff79ea5e71947..f436c90c74ef0b3bcba1467617ca886ee730f37a 100644 (file)
@@ -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);
index 732398e3937ba0b8c51bb15454739b3b2f71b1a6..2590514881dbc5c4c4cdbed69700c6c5cd0b5798 100644 (file)
@@ -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 {
index 81baa6ed5b8efffb77b8df7266db757cc3c658f1..cfa3beec1e7d75617f3a7ed744c018120f3398d9 100644 (file)
@@ -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;