From: Amir Vadai Date: Tue, 15 Jul 2008 18:17:00 +0000 (+0300) Subject: SDP: fix initial recv buffer size X-Git-Tag: v4.1.12-92~264^2~5^2~314 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=da4384d97c35c76024eb71acae853a559e757d30;p=users%2Fjedix%2Flinux-maple.git SDP: fix initial recv buffer size 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 --- diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index bcf21254ab2d0..2f09073326f0a 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -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); diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index 7553003a9bcc8..20f6a330ddbeb 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -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; diff --git a/drivers/infiniband/ulp/sdp/sdp_cma.c b/drivers/infiniband/ulp/sdp/sdp_cma.c index 6126902689ac4..ba4609836b2bd 100644 --- a/drivers/infiniband/ulp/sdp/sdp_cma.c +++ b/drivers/infiniband/ulp/sdp/sdp_cma.c @@ -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;