From: Amir Vadai Date: Wed, 25 Nov 2009 12:59:46 +0000 (+0200) Subject: sdp: take a reference during zcopy_send X-Git-Tag: v4.1.12-92~264^2~5^2~239 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=f76a974a43f0bb04f79f925c9ad6df8d0b9ef769;p=users%2Fjedix%2Flinux-maple.git sdp: take a reference during zcopy_send Signed-off-by: Amir Vadai --- diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index a1de85b535aa1..d6ba236ec1c88 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -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 diff --git a/drivers/infiniband/ulp/sdp/sdp_dbg.h b/drivers/infiniband/ulp/sdp/sdp_dbg.h index 3229436ad1ed6..10ef4f0605527 100644 --- a/drivers/infiniband/ulp/sdp/sdp_dbg.h +++ b/drivers/infiniband/ulp/sdp/sdp_dbg.h @@ -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) diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index eaa42d1a24015..9db3e166905c6 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -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); diff --git a/drivers/infiniband/ulp/sdp/sdp_zcopy.c b/drivers/infiniband/ulp/sdp/sdp_zcopy.c index 8d734ec4115e5..a712f3b61e0f2 100644 --- a/drivers/infiniband/ulp/sdp/sdp_zcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_zcopy.c @@ -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; }