Thread (2 messages) flat view 2 messages, 2 authors, 2014-03-12

RE: [PATCHv6 net-next 20/31] iw_cxgb4: adjust tcp snd/rcv window based on link speed

From: Steve Wise <hidden>
Date: 2014-03-12 21:29:27
Also in: linux-rdma
Subsystem: cxgb4 iwarp rnic driver (iw_cxgb4), infiniband subsystem, networking [general], networking [tcp], the rest · Maintainers: Potnuri Bharat Teja, Jason Gunthorpe, Leon Romanovsky, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Neal Cardwell, Linus Torvalds

Possibly related (same subject, not in this thread)

quoted
quoted
You can just use the TCP settings the kernel already provides for
the real TCP stack.
Do you mean use sysctl_tcp_*mem, sysctl_tcp_timestamps, sysctl_tcp_window_scaling,
etc?
quoted
I'll look into this.
And the socket memory limits, which we use to compute default window
sizes.
How's this look (compile-tested only)?  Note I had to export some of the tcp limits.
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index e2fe4a2..ff95fa3 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -81,19 +81,6 @@ int c4iw_max_read_depth = 8;
 module_param(c4iw_max_read_depth, int, 0644);
 MODULE_PARM_DESC(c4iw_max_read_depth, "Per-connection max ORD/IRD (default=8)");
 
-static int enable_tcp_timestamps;
-module_param(enable_tcp_timestamps, int, 0644);
-MODULE_PARM_DESC(enable_tcp_timestamps, "Enable tcp timestamps (default=0)");
-
-static int enable_tcp_sack;
-module_param(enable_tcp_sack, int, 0644);
-MODULE_PARM_DESC(enable_tcp_sack, "Enable tcp SACK (default=0)");
-
-static int enable_tcp_window_scaling = 1;
-module_param(enable_tcp_window_scaling, int, 0644);
-MODULE_PARM_DESC(enable_tcp_window_scaling,
-		 "Enable tcp window scaling (default=1)");
-
 int c4iw_debug;
 module_param(c4iw_debug, int, 0644);
 MODULE_PARM_DESC(c4iw_debug, "Enable debug logging (default=0)");
@@ -126,19 +113,6 @@ static int crc_enabled = 1;
 module_param(crc_enabled, int, 0644);
 MODULE_PARM_DESC(crc_enabled, "Enable MPA CRC (default(1)=enabled)");
 
-static int rcv_win = 256 * 1024;
-module_param(rcv_win, int, 0644);
-MODULE_PARM_DESC(rcv_win, "TCP receive window in bytes (default=256KB)");
-
-static int snd_win = 128 * 1024;
-module_param(snd_win, int, 0644);
-MODULE_PARM_DESC(snd_win, "TCP send window in bytes (default=128KB)");
-
-static int adjust_win = 1;
-module_param(adjust_win, int, 0644);
-MODULE_PARM_DESC(adjust_win,
-		 "Adjust TCP window based on link speed (default=1)");
-
 static struct workqueue_struct *workq;
 
 static struct sk_buff_head rxq;
@@ -572,7 +546,7 @@ static int send_connect(struct c4iw_ep *ep)
 	set_wr_txq(skb, CPL_PRIORITY_SETUP, ep->ctrlq_idx);
 
 	cxgb4_best_mtu(ep->com.dev->rdev.lldi.mtus, ep->mtu, &mtu_idx);
-	wscale = compute_wscale(rcv_win);
+	wscale = compute_wscale(ep->rcv_win);
 
 	/*
 	 * Specify the largest window that will fit in opt0. The
@@ -596,11 +570,11 @@ static int send_connect(struct c4iw_ep *ep)
 	opt2 = RX_CHANNEL(0) |
 	       CCTRL_ECN(enable_ecn) |
 	       RSS_QUEUE_VALID | RSS_QUEUE(ep->rss_qid);
-	if (enable_tcp_timestamps)
+	if (sysctl_tcp_timestamps)
 		opt2 |= TSTAMPS_EN(1);
-	if (enable_tcp_sack)
+	if (sysctl_tcp_sack)
 		opt2 |= SACK_EN(1);
-	if (wscale && enable_tcp_window_scaling)
+	if (wscale && sysctl_tcp_window_scaling)
 		opt2 |= WND_SCALE_EN(1);
 	t4_set_arp_err_handler(skb, NULL, act_open_req_arp_failure);
 
@@ -1652,7 +1626,7 @@ static void send_fw_act_open_req(struct c4iw_ep *ep, unsigned int
atid)
 	req->tcb.tx_max = (__force __be32) jiffies;
 	req->tcb.rcv_adv = htons(1);
 	cxgb4_best_mtu(ep->com.dev->rdev.lldi.mtus, ep->mtu, &mtu_idx);
-	wscale = compute_wscale(rcv_win);
+	wscale = compute_wscale(ep->rcv_win);
 
 	/*
 	 * Specify the largest window that will fit in opt0. The
@@ -1679,11 +1653,11 @@ static void send_fw_act_open_req(struct c4iw_ep *ep, unsigned int
atid)
 		RX_CHANNEL(0) |
 		CCTRL_ECN(enable_ecn) |
 		RSS_QUEUE_VALID | RSS_QUEUE(ep->rss_qid));
-	if (enable_tcp_timestamps)
+	if (sysctl_tcp_timestamps)
 		req->tcb.opt2 |= (__force __be32) TSTAMPS_EN(1);
-	if (enable_tcp_sack)
+	if (sysctl_tcp_sack)
 		req->tcb.opt2 |= (__force __be32) SACK_EN(1);
-	if (wscale && enable_tcp_window_scaling)
+	if (wscale && sysctl_tcp_window_scaling)
 		req->tcb.opt2 |= (__force __be32) WND_SCALE_EN(1);
 	req->tcb.opt0 = cpu_to_be64((__force u64) req->tcb.opt0);
 	req->tcb.opt2 = cpu_to_be32((__force u32) req->tcb.opt2);
@@ -1712,11 +1686,14 @@ static int is_neg_adv(unsigned int status)
 
 static void set_tcp_window(struct c4iw_ep *ep, struct port_info *pi)
 {
+	u32 snd_win = max_t(u32, sysctl_tcp_rmem[2], sysctl_rmem_max);
+	u32 rcv_win = max_t(u32, sysctl_tcp_wmem[2], sysctl_wmem_max);
+
 	ep->snd_win = snd_win;
 	ep->rcv_win = rcv_win;
-	if (adjust_win && pi->link_cfg.speed == 40000) {
-		ep->snd_win *= 4;
-		ep->rcv_win *= 4;
+	if (pi->link_cfg.speed == 40000) {
+		ep->snd_win = min_t(u32, ep->snd_win * 4, snd_win);
+		ep->rcv_win = min_t(u32, ep->rcv_win * 4, rcv_win);
 	}
 	PDBG("%s snd_win %d rcv_win %d\n", __func__, ep->snd_win, ep->rcv_win);
 }
@@ -2026,7 +2003,7 @@ static void accept_cr(struct c4iw_ep *ep, struct sk_buff *skb,
 	skb_trim(skb, sizeof(*rpl));
 	skb_get(skb);
 	cxgb4_best_mtu(ep->com.dev->rdev.lldi.mtus, ep->mtu, &mtu_idx);
-	wscale = compute_wscale(rcv_win);
+	wscale = compute_wscale(ep->rcv_win);
 
 	/*
 	 * Specify the largest window that will fit in opt0. The
@@ -2049,11 +2026,11 @@ static void accept_cr(struct c4iw_ep *ep, struct sk_buff *skb,
 	opt2 = RX_CHANNEL(0) |
 	       RSS_QUEUE_VALID | RSS_QUEUE(ep->rss_qid);
 
-	if (enable_tcp_timestamps && req->tcpopt.tstamp)
+	if (sysctl_tcp_timestamps && req->tcpopt.tstamp)
 		opt2 |= TSTAMPS_EN(1);
-	if (enable_tcp_sack && req->tcpopt.sack)
+	if (sysctl_tcp_sack && req->tcpopt.sack)
 		opt2 |= SACK_EN(1);
-	if (wscale && enable_tcp_window_scaling)
+	if (wscale && sysctl_tcp_window_scaling)
 		opt2 |= WND_SCALE_EN(1);
 	if (enable_ecn) {
 		const struct tcphdr *tcph;
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 227cba7..65ed4e8 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -76,8 +76,11 @@
 #include <net/netdma.h>
 
 int sysctl_tcp_timestamps __read_mostly = 1;
+EXPORT_SYMBOL(sysctl_tcp_timestamps);
 int sysctl_tcp_window_scaling __read_mostly = 1;
+EXPORT_SYMBOL(sysctl_tcp_window_scaling);
 int sysctl_tcp_sack __read_mostly = 1;
+EXPORT_SYMBOL(sysctl_tcp_sack);
 int sysctl_tcp_fack __read_mostly = 1;
 int sysctl_tcp_reordering __read_mostly = TCP_FASTRETRANS_THRESH;
 EXPORT_SYMBOL(sysctl_tcp_reordering);

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help