]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: two bug fixes
authorAmir Vadai <amirv@mellanox.co.il>
Thu, 4 Jun 2009 14:42:13 +0000 (17:42 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:31 +0000 (05:04 -0700)
fix bad HELLO/HELLO_ACK buffer size matching
let recvmsg do posts on data packets too

Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp_cma.c
drivers/infiniband/ulp/sdp/sdp_rx.c
drivers/infiniband/ulp/sdp/sdp_tx.c

index bbc69c66302d49b08c4897d46275a9216c05f282..83e39dc2409748cf3fb6b1aa78d55c69c9417eb0 100644 (file)
@@ -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;
index b3611ae82317f8c7af2ffedf3ab3d5242aba42e1..1ef28acd02383a3cf8f22060a46ea7805b2bd41f 100644 (file)
@@ -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));
index bb0d81d67884880aa516786f5b509145d5367d28..9cc37a341aabb981113b38e23dafe7b3590c6b7a 100644 (file)
@@ -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);