]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: take a reference during zcopy_send
authorAmir Vadai <amirv@mellanox.co.il>
Wed, 25 Nov 2009 12:59:46 +0000 (14:59 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:41 +0000 (05:04 -0700)
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp.h
drivers/infiniband/ulp/sdp/sdp_dbg.h
drivers/infiniband/ulp/sdp/sdp_main.c
drivers/infiniband/ulp/sdp/sdp_zcopy.c

index a1de85b535aa12e43abf4966710c30bacdf05dc7..d6ba236ec1c88f3ed3afd98b9139bfbe8bbf6059 100644 (file)
@@ -777,5 +777,6 @@ int sdp_post_rdma_rd_compl(struct sdp_sock *ssk,
                struct rx_srcavail_state *rx_sa);
 int sdp_post_sendsm(struct sock *sk);
 void srcavail_cancel_timeout(struct work_struct *work);
+void sdp_unmap_dma(struct sock *sk, u64 *addrs, int page_cnt);
 
 #endif
index 3229436ad1ed668db482a3d0ca6e4e892c97311c..10ef4f0605527b189f54147b8a4e697c185ad12b 100644 (file)
@@ -145,6 +145,7 @@ extern int sdp_data_debug_level;
 #define SOCK_REF_CM_TW "CM_TW" /* TIMEWAIT_ENTER -> TIMEWAIT_EXIT */
 #define SOCK_REF_SEQ "SEQ" /* during proc read */
 #define SOCK_REF_DREQ_TO "DREQ_TO" /* dreq timeout is pending */
+#define SOCK_REF_ZCOPY "ZCOPY" /* zcopy send in process */
 
 #define sock_hold(sk, msg)  sock_ref(sk, msg, sock_hold)
 #define sock_put(sk, msg)  sock_ref(sk, msg, sock_put)
index eaa42d1a240150ba91eec8e5652d6c495b2d9ee2..9db3e166905c637df2556eab32870c68934676fa 100644 (file)
@@ -434,6 +434,11 @@ void sdp_reset_sk(struct sock *sk, int rc)
        if (ssk->tx_ring.cq)
                sdp_xmit_poll(ssk, 1);
 
+       if (ssk->tx_sa) {
+               sdp_unmap_dma(sk, ssk->tx_sa->addrs, ssk->tx_sa->page_cnt);
+               ssk->tx_sa->addrs = NULL;
+       }
+
        if (!(sk->sk_shutdown & RCV_SHUTDOWN) || !sk_stream_memory_free(sk)) {
                sdp_dbg(sk, "setting state to error\n");
                sdp_set_error(sk, rc);
index 8d734ec4115e52f1a20b5d69d4a22be89227b057..a712f3b61e0f2d67686cb6ec1f87397196db9ebd 100644 (file)
@@ -205,10 +205,6 @@ static int sdp_wait_rdmardcompl(struct sdp_sock *ssk, long *timeo_p, int len,
                *timeo_p = current_timeo;
        }
 
-       if (!ssk->qp_active) {
-               sdp_warn(sk, "qp is not active\n");
-       }
-
        finish_wait(sk->sk_sleep, &wait);
 
        sdp_dbg_data(sk, "Finished waiting - RdmaRdCompl: %d/%d bytes, flags: 0x%x\n",
@@ -513,7 +509,7 @@ err:
        return -1;
 }
 
-static void sdp_unmap_dma(struct sock *sk, u64 *addrs, int page_cnt)
+void sdp_unmap_dma(struct sock *sk, u64 *addrs, int page_cnt)
 {
        int i;
        struct ib_device *dev = sdp_sk(sk)->ib_device;
@@ -891,6 +887,7 @@ int sdp_sendmsg_zcopy(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        }
 
        lock_sock(sk);
+       sock_hold(&ssk->isk.sk, SOCK_REF_ZCOPY);
 
        SDPSTATS_COUNTER_INC(sendmsg_zcopy_segment);
 
@@ -961,7 +958,8 @@ int sdp_sendmsg_zcopy(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                        sdp_warn(sk, "Error sending SrcAvail. rc = %d\n", rc);
 
 
-               sdp_unmap_dma(sk, tx_sa->addrs, page_cnt);
+               if (tx_sa->addrs)
+                       sdp_unmap_dma(sk, tx_sa->addrs, page_cnt);
 err_map_dma:   
                sdp_put_pages(sk, tx_sa->pages, page_cnt);
 err_get_pages:
@@ -977,6 +975,7 @@ err:
        sdp_prf1(sk, NULL, "sdp_sendmsg_zcopy end rc: %d copied: %d", rc, copied);
        posts_handler_put(ssk);
        release_sock(sk);
+       sock_put(&ssk->isk.sk, SOCK_REF_ZCOPY);
 
        return rc ?: copied;
 }