]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
SDP: fix initial recv buffer size
authorAmir Vadai <amirv@mellanox.co.il>
Tue, 15 Jul 2008 18:17:00 +0000 (21:17 +0300)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:18 +0000 (05:04 -0700)
Set initial recv buffer according to incoming hha header.

Fixed bugzilla 1086: SDP Linux and SDP windows don't work togeather

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

index bcf21254ab2d039cc13e8412de1f4345d64be65b..2f09073326f0aabfd8baa6d5fe2f9e96d3dd4b72 100644 (file)
@@ -196,6 +196,7 @@ struct bzcopy_state {
        struct page         **pages;
 };
 
+extern int rcvbuf_initial_size;
 
 extern struct proto sdp_proto;
 extern struct workqueue_struct *sdp_workqueue;
@@ -311,6 +312,7 @@ void sdp_add_sock(struct sdp_sock *ssk);
 void sdp_remove_sock(struct sdp_sock *ssk);
 void sdp_remove_large_sock(struct sdp_sock *ssk);
 int sdp_resize_buffers(struct sdp_sock *ssk, u32 new_size);
+int sdp_init_buffers(struct sdp_sock *ssk, u32 new_size);
 void sdp_post_keepalive(struct sdp_sock *ssk);
 void sdp_start_keepalive_timer(struct sock *sk);
 void sdp_bzcopy_write_space(struct sdp_sock *ssk);
index 7553003a9bcc809ff29bcdb6510908a4fde5bfc9..20f6a330ddbeb82b5b23f17f59a46156fdf4736c 100644 (file)
@@ -45,6 +45,10 @@ struct sdp_chrecvbuf {
 
 static int rcvbuf_scale = 0x10;
 
+int rcvbuf_initial_size = SDP_HEAD_SIZE;
+module_param_named(rcvbuf_initial_size, rcvbuf_initial_size, int, 0644);
+MODULE_PARM_DESC(rcvbuf_initial_size, "Receive buffer initial size in bytes.");
+
 module_param_named(rcvbuf_scale, rcvbuf_scale, int, 0644);
 MODULE_PARM_DESC(rcvbuf_scale, "Receive buffer size scale factor.");
 
@@ -578,6 +582,17 @@ void sdp_post_sends(struct sdp_sock *ssk, int nonagle)
        }
 }
 
+int sdp_init_buffers(struct sdp_sock *ssk, u32 new_size)
+{
+       ssk->recv_frags = PAGE_ALIGN(new_size - SDP_HEAD_SIZE) / PAGE_SIZE;
+       if (ssk->recv_frags > SDP_MAX_SEND_SKB_FRAGS)
+               ssk->recv_frags = SDP_MAX_SEND_SKB_FRAGS;
+
+       sdp_post_recvs(ssk);
+
+       return 0;
+}
+
 int sdp_resize_buffers(struct sdp_sock *ssk, u32 new_size)
 {
        u32 curr_size = SDP_HEAD_SIZE + ssk->recv_frags * PAGE_SIZE;
index 6126902689ac4f2a6044ac7984ce52250ba71a2a..ba4609836b2bd5479b93f48b27e89b38ff0e842d 100644 (file)
@@ -176,10 +176,6 @@ int sdp_init_qp(struct sock *sk, struct rdma_cm_id *id)
 
        init_waitqueue_head(&sdp_sk(sk)->wq);
 
-       sdp_sk(sk)->recv_frags = 0;
-       sdp_sk(sk)->rcvbuf_scale = 1;
-       sdp_post_recvs(sdp_sk(sk));
-
        sdp_dbg(sk, "%s done\n", __func__);
        return 0;
 
@@ -241,7 +237,7 @@ int sdp_connect_handler(struct sock *sk, struct rdma_cm_id *id,
                sizeof(struct sdp_bsdh);
        sdp_sk(child)->send_frags = PAGE_ALIGN(sdp_sk(child)->xmit_size_goal) /
                PAGE_SIZE;
-       sdp_resize_buffers(sdp_sk(child), ntohl(h->desremrcvsz));
+       sdp_init_buffers(sdp_sk(child), ntohl(h->desremrcvsz));
 
        sdp_dbg(child, "%s bufs %d xmit_size_goal %d send trigger %d\n",
                __func__,
@@ -419,6 +415,7 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
                hh.bsdh.len = htonl(sizeof(struct sdp_bsdh) + SDP_HH_SIZE);
                hh.max_adverts = 1;
                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);
                hh.max_adverts = 0x1;