[ofa-general] [PATCH] SDP: fix initial recv buffer size
Amir Vadai
amirv at mellanox.co.il
Sun Oct 5 06:34:42 PDT 2008
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 at mellanox.co.il>
---
drivers/infiniband/ulp/sdp/sdp.h | 2 ++
drivers/infiniband/ulp/sdp/sdp_bcopy.c | 15 +++++++++++++++
drivers/infiniband/ulp/sdp/sdp_cma.c | 7 ++-----
3 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h
index bcf2125..2f09073 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 7553003..20f6a33 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 6126902..ba46098 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;
--
1.5.3
More information about the general
mailing list