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>
struct page **pages;
};
+extern int rcvbuf_initial_size;
extern struct proto sdp_proto;
extern struct workqueue_struct *sdp_workqueue;
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);
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.");
}
}
+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;
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;
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__,
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;