From 75d9e8af6c5bb807b00db91f7d10266a8b123908 Mon Sep 17 00:00:00 2001 From: Amir Vadai Date: Thu, 4 Jun 2009 17:42:13 +0300 Subject: [PATCH] sdp: two bug fixes fix bad HELLO/HELLO_ACK buffer size matching let recvmsg do posts on data packets too Signed-off-by: Amir Vadai --- drivers/infiniband/ulp/sdp/sdp_cma.c | 7 ++++--- drivers/infiniband/ulp/sdp/sdp_rx.c | 3 +-- drivers/infiniband/ulp/sdp/sdp_tx.c | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/infiniband/ulp/sdp/sdp_cma.c b/drivers/infiniband/ulp/sdp/sdp_cma.c index bbc69c66302d..83e39dc24097 100644 --- a/drivers/infiniband/ulp/sdp/sdp_cma.c +++ b/drivers/infiniband/ulp/sdp/sdp_cma.c @@ -215,7 +215,7 @@ static int sdp_response_handler(struct sock *sk, struct rdma_cm_id *id, sdp_sk(sk)->max_bufs = ntohs(h->bsdh.bufs); atomic_set(&sdp_sk(sk)->tx_ring.credits, sdp_sk(sk)->max_bufs); sdp_sk(sk)->min_bufs = tx_credits(sdp_sk(sk)) / 4; - sdp_sk(sk)->xmit_size_goal = ntohl(h->actrcvsz) - SDP_HEAD_SIZE; + sdp_sk(sk)->xmit_size_goal = ntohl(h->actrcvsz) - sizeof(struct sdp_bsdh); sdp_sk(sk)->send_frags = MIN(PAGE_ALIGN(sdp_sk(sk)->xmit_size_goal) / PAGE_SIZE, MAX_SKB_FRAGS) + 1; /* The +1 is to conpensate on not aligned buffers */ sdp_sk(sk)->xmit_size_goal = MIN(sdp_sk(sk)->xmit_size_goal, @@ -352,7 +352,7 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) hh.majv_minv = SDP_MAJV_MINV; sdp_init_buffers(sdp_sk(sk), rcvbuf_initial_size); hh.localrcvsz = hh.desremrcvsz = htonl(sdp_sk(sk)->recv_frags * - PAGE_SIZE + SDP_HEAD_SIZE); + PAGE_SIZE + sizeof(struct sdp_bsdh)); hh.max_adverts = 0x1; inet_sk(sk)->saddr = inet_sk(sk)->rcv_saddr = ((struct sockaddr_in *)&id->route.addr.src_addr)->sin_addr.s_addr; @@ -385,7 +385,8 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) hah.majv_minv = SDP_MAJV_MINV; hah.ext_max_adverts = 1; /* Doesn't seem to be mandated by spec, but just in case */ - hah.actrcvsz = htonl(sdp_sk(child)->recv_frags * PAGE_SIZE + SDP_HEAD_SIZE); + hah.actrcvsz = htonl(sdp_sk(child)->recv_frags * PAGE_SIZE + + sizeof(struct sdp_bsdh)); memset(&conn_param, 0, sizeof conn_param); conn_param.private_data_len = sizeof hah; conn_param.private_data = &hah; diff --git a/drivers/infiniband/ulp/sdp/sdp_rx.c b/drivers/infiniband/ulp/sdp/sdp_rx.c index b3611ae82317..1ef28acd0238 100644 --- a/drivers/infiniband/ulp/sdp/sdp_rx.c +++ b/drivers/infiniband/ulp/sdp/sdp_rx.c @@ -753,8 +753,7 @@ static void sdp_rx_irq(struct ib_cq *cq, void *cq_context) credits_before, tx_credits(ssk)); if (posts_handler(ssk) || - (!skb_queue_empty(&ssk->rx_ctl_q) && - (sk->sk_socket && (sk->sk_socket->flags & SOCK_ASYNC_WAITDATA)))) { + (sk->sk_socket && test_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags))) { sdp_prf(&ssk->isk.sk, NULL, "Somebody is doing the post work for me. %d", posts_handler(ssk)); diff --git a/drivers/infiniband/ulp/sdp/sdp_tx.c b/drivers/infiniband/ulp/sdp/sdp_tx.c index bb0d81d67884..9cc37a341aab 100644 --- a/drivers/infiniband/ulp/sdp/sdp_tx.c +++ b/drivers/infiniband/ulp/sdp/sdp_tx.c @@ -205,6 +205,8 @@ static int sdp_handle_send_comp(struct sdp_sock *ssk, struct ib_wc *wc) if (unlikely(wc->status)) { if (wc->status != IB_WC_WR_FLUSH_ERR) { struct sock *sk = &ssk->isk.sk; + sdp_prf(sk, skb, "Send completion with error. " + "Status %d", wc->status); sdp_warn(sk, "Send completion with error. " "Status %d\n", wc->status); sdp_set_error(sk, -ECONNRESET); -- 2.50.1