All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: "David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>
Cc: Eric Dumazet <edumazet@google.com>,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	Jon Maloy <jmaloy@redhat.com>, Ying Xue <ying.xue@windriver.com>,
	drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org,
	linux-rdma@vger.kernel.org, linux-nvme@lists.infradead.org,
	target-devel@vger.kernel.org, linux-afs@lists.infradead.org,
	linux-cifs@vger.kernel.org, cluster-devel@redhat.com,
	ocfs2-devel@oss.oracle.com, netdev@vger.kernel.org,
	ceph-devel@vger.kernel.org, rds-devel@oss.oracle.com,
	linux-nfs@vger.kernel.org, tipc-discussion@lists.sourceforge.net
Subject: [PATCH 12/28] tcp: add tcp_sock_set_quickack
Date: Thu, 28 May 2020 07:12:20 +0200	[thread overview]
Message-ID: <20200528051236.620353-13-hch@lst.de> (raw)
In-Reply-To: <20200528051236.620353-1-hch@lst.de>

Add a helper to directly set the TCP_QUICKACK sockopt from kernel space
without going through a fake uaccess.  Cleanup the callers to avoid
pointless wrappers now that this is a simple function call.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/drbd/drbd_int.h      |  7 ------
 drivers/block/drbd/drbd_receiver.c |  5 ++--
 include/linux/tcp.h                |  1 +
 net/ipv4/tcp.c                     | 39 ++++++++++++++++++++----------
 4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index e24bba87c8e02..14345a87c7cc5 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1570,13 +1570,6 @@ extern void drbd_set_recv_tcq(struct drbd_device *device, int tcq_enabled);
 extern void _drbd_clear_done_ee(struct drbd_device *device, struct list_head *to_be_freed);
 extern int drbd_connected(struct drbd_peer_device *);
 
-static inline void drbd_tcp_quickack(struct socket *sock)
-{
-	int val = 2;
-	(void) kernel_setsockopt(sock, SOL_TCP, TCP_QUICKACK,
-			(char*)&val, sizeof(val));
-}
-
 /* sets the number of 512 byte sectors of our virtual device */
 void drbd_set_my_capacity(struct drbd_device *device, sector_t size);
 
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 20a5e94494acd..3a3f2b6a821f3 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1223,7 +1223,7 @@ static int drbd_recv_header_maybe_unplug(struct drbd_connection *connection, str
 		 * quickly as possible, and let remote TCP know what we have
 		 * received so far. */
 		if (err == -EAGAIN) {
-			drbd_tcp_quickack(connection->data.socket);
+			tcp_sock_set_quickack(connection->data.socket->sk, 2);
 			drbd_unplug_all_devices(connection);
 		}
 		if (err > 0) {
@@ -4959,8 +4959,7 @@ static int receive_UnplugRemote(struct drbd_connection *connection, struct packe
 {
 	/* Make sure we've acked all the TCP data associated
 	 * with the data requests being unplugged */
-	drbd_tcp_quickack(connection->data.socket);
-
+	tcp_sock_set_quickack(connection->data.socket->sk, 2);
 	return 0;
 }
 
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 9e42c7fe50a8b..2eaf8320b9db0 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -499,5 +499,6 @@ int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount,
 
 void tcp_sock_set_cork(struct sock *sk, bool on);
 void tcp_sock_set_nodelay(struct sock *sk);
+void tcp_sock_set_quickack(struct sock *sk, int val);
 
 #endif	/* _LINUX_TCP_H */
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index a65f293a19fac..27b5e7a4e2ef9 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2856,6 +2856,31 @@ void tcp_sock_set_nodelay(struct sock *sk)
 }
 EXPORT_SYMBOL(tcp_sock_set_nodelay);
 
+static void __tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	if (!val) {
+		inet_csk_enter_pingpong_mode(sk);
+		return;
+	}
+
+	inet_csk_exit_pingpong_mode(sk);
+	if ((1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
+	    inet_csk_ack_scheduled(sk)) {
+		inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_PUSHED;
+		tcp_cleanup_rbuf(sk, 1);
+		if (!(val & 1))
+			inet_csk_enter_pingpong_mode(sk);
+	}
+}
+
+void tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	lock_sock(sk);
+	__tcp_sock_set_quickack(sk, val);
+	release_sock(sk);
+}
+EXPORT_SYMBOL(tcp_sock_set_quickack);
+
 /*
  *	Socket option code for TCP.
  */
@@ -3096,19 +3121,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
 		break;
 
 	case TCP_QUICKACK:
-		if (!val) {
-			inet_csk_enter_pingpong_mode(sk);
-		} else {
-			inet_csk_exit_pingpong_mode(sk);
-			if ((1 << sk->sk_state) &
-			    (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
-			    inet_csk_ack_scheduled(sk)) {
-				icsk->icsk_ack.pending |= ICSK_ACK_PUSHED;
-				tcp_cleanup_rbuf(sk, 1);
-				if (!(val & 1))
-					inet_csk_enter_pingpong_mode(sk);
-			}
-		}
+		__tcp_sock_set_quickack(sk, val);
 		break;
 
 #ifdef CONFIG_TCP_MD5SIG
-- 
2.26.2


WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: "David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>
Cc: Eric Dumazet <edumazet@google.com>,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	Jon Maloy <jmaloy@redhat.com>, Ying Xue <ying.xue@windriver.com>,
	drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org,
	linux-rdma@vger.kernel.org, linux-nvme@lists.infradead.org,
	target-devel@vger.kernel.org, linux-afs@lists.infradead.org,
	linux-cifs@vger.kernel.org, cluster-devel@redhat.com,
	ocfs2-devel@oss.oracle.com, netdev@vger.kernel.org,
	ceph-devel@vger.kernel.org, rds-devel@oss.oracle.com,
	linux-nfs@vger.kernel.org, tipc-discussion@lists.sourceforge.net
Subject: [PATCH 12/28] tcp: add tcp_sock_set_quickack
Date: Thu, 28 May 2020 05:12:20 +0000	[thread overview]
Message-ID: <20200528051236.620353-13-hch@lst.de> (raw)
In-Reply-To: <20200528051236.620353-1-hch@lst.de>

Add a helper to directly set the TCP_QUICKACK sockopt from kernel space
without going through a fake uaccess.  Cleanup the callers to avoid
pointless wrappers now that this is a simple function call.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/drbd/drbd_int.h      |  7 ------
 drivers/block/drbd/drbd_receiver.c |  5 ++--
 include/linux/tcp.h                |  1 +
 net/ipv4/tcp.c                     | 39 ++++++++++++++++++++----------
 4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index e24bba87c8e02..14345a87c7cc5 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1570,13 +1570,6 @@ extern void drbd_set_recv_tcq(struct drbd_device *device, int tcq_enabled);
 extern void _drbd_clear_done_ee(struct drbd_device *device, struct list_head *to_be_freed);
 extern int drbd_connected(struct drbd_peer_device *);
 
-static inline void drbd_tcp_quickack(struct socket *sock)
-{
-	int val = 2;
-	(void) kernel_setsockopt(sock, SOL_TCP, TCP_QUICKACK,
-			(char*)&val, sizeof(val));
-}
-
 /* sets the number of 512 byte sectors of our virtual device */
 void drbd_set_my_capacity(struct drbd_device *device, sector_t size);
 
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 20a5e94494acd..3a3f2b6a821f3 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1223,7 +1223,7 @@ static int drbd_recv_header_maybe_unplug(struct drbd_connection *connection, str
 		 * quickly as possible, and let remote TCP know what we have
 		 * received so far. */
 		if (err = -EAGAIN) {
-			drbd_tcp_quickack(connection->data.socket);
+			tcp_sock_set_quickack(connection->data.socket->sk, 2);
 			drbd_unplug_all_devices(connection);
 		}
 		if (err > 0) {
@@ -4959,8 +4959,7 @@ static int receive_UnplugRemote(struct drbd_connection *connection, struct packe
 {
 	/* Make sure we've acked all the TCP data associated
 	 * with the data requests being unplugged */
-	drbd_tcp_quickack(connection->data.socket);
-
+	tcp_sock_set_quickack(connection->data.socket->sk, 2);
 	return 0;
 }
 
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 9e42c7fe50a8b..2eaf8320b9db0 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -499,5 +499,6 @@ int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount,
 
 void tcp_sock_set_cork(struct sock *sk, bool on);
 void tcp_sock_set_nodelay(struct sock *sk);
+void tcp_sock_set_quickack(struct sock *sk, int val);
 
 #endif	/* _LINUX_TCP_H */
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index a65f293a19fac..27b5e7a4e2ef9 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2856,6 +2856,31 @@ void tcp_sock_set_nodelay(struct sock *sk)
 }
 EXPORT_SYMBOL(tcp_sock_set_nodelay);
 
+static void __tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	if (!val) {
+		inet_csk_enter_pingpong_mode(sk);
+		return;
+	}
+
+	inet_csk_exit_pingpong_mode(sk);
+	if ((1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
+	    inet_csk_ack_scheduled(sk)) {
+		inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_PUSHED;
+		tcp_cleanup_rbuf(sk, 1);
+		if (!(val & 1))
+			inet_csk_enter_pingpong_mode(sk);
+	}
+}
+
+void tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	lock_sock(sk);
+	__tcp_sock_set_quickack(sk, val);
+	release_sock(sk);
+}
+EXPORT_SYMBOL(tcp_sock_set_quickack);
+
 /*
  *	Socket option code for TCP.
  */
@@ -3096,19 +3121,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
 		break;
 
 	case TCP_QUICKACK:
-		if (!val) {
-			inet_csk_enter_pingpong_mode(sk);
-		} else {
-			inet_csk_exit_pingpong_mode(sk);
-			if ((1 << sk->sk_state) &
-			    (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
-			    inet_csk_ack_scheduled(sk)) {
-				icsk->icsk_ack.pending |= ICSK_ACK_PUSHED;
-				tcp_cleanup_rbuf(sk, 1);
-				if (!(val & 1))
-					inet_csk_enter_pingpong_mode(sk);
-			}
-		}
+		__tcp_sock_set_quickack(sk, val);
 		break;
 
 #ifdef CONFIG_TCP_MD5SIG
-- 
2.26.2

WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: "David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>
Cc: linux-cifs@vger.kernel.org, rds-devel@oss.oracle.com,
	cluster-devel@redhat.com,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-nvme@lists.infradead.org, Jon Maloy <jmaloy@redhat.com>,
	linux-rdma@vger.kernel.org, Eric Dumazet <edumazet@google.com>,
	target-devel@vger.kernel.org,
	tipc-discussion@lists.sourceforge.net, linux-nfs@vger.kernel.org,
	Ying Xue <ying.xue@windriver.com>,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	ceph-devel@vger.kernel.org, linux-afs@lists.infradead.org,
	ocfs2-devel@oss.oracle.com, drbd-dev@lists.linbit.com
Subject: [PATCH 12/28] tcp: add tcp_sock_set_quickack
Date: Thu, 28 May 2020 07:12:20 +0200	[thread overview]
Message-ID: <20200528051236.620353-13-hch@lst.de> (raw)
In-Reply-To: <20200528051236.620353-1-hch@lst.de>

Add a helper to directly set the TCP_QUICKACK sockopt from kernel space
without going through a fake uaccess.  Cleanup the callers to avoid
pointless wrappers now that this is a simple function call.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/drbd/drbd_int.h      |  7 ------
 drivers/block/drbd/drbd_receiver.c |  5 ++--
 include/linux/tcp.h                |  1 +
 net/ipv4/tcp.c                     | 39 ++++++++++++++++++++----------
 4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index e24bba87c8e02..14345a87c7cc5 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1570,13 +1570,6 @@ extern void drbd_set_recv_tcq(struct drbd_device *device, int tcq_enabled);
 extern void _drbd_clear_done_ee(struct drbd_device *device, struct list_head *to_be_freed);
 extern int drbd_connected(struct drbd_peer_device *);
 
-static inline void drbd_tcp_quickack(struct socket *sock)
-{
-	int val = 2;
-	(void) kernel_setsockopt(sock, SOL_TCP, TCP_QUICKACK,
-			(char*)&val, sizeof(val));
-}
-
 /* sets the number of 512 byte sectors of our virtual device */
 void drbd_set_my_capacity(struct drbd_device *device, sector_t size);
 
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 20a5e94494acd..3a3f2b6a821f3 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1223,7 +1223,7 @@ static int drbd_recv_header_maybe_unplug(struct drbd_connection *connection, str
 		 * quickly as possible, and let remote TCP know what we have
 		 * received so far. */
 		if (err == -EAGAIN) {
-			drbd_tcp_quickack(connection->data.socket);
+			tcp_sock_set_quickack(connection->data.socket->sk, 2);
 			drbd_unplug_all_devices(connection);
 		}
 		if (err > 0) {
@@ -4959,8 +4959,7 @@ static int receive_UnplugRemote(struct drbd_connection *connection, struct packe
 {
 	/* Make sure we've acked all the TCP data associated
 	 * with the data requests being unplugged */
-	drbd_tcp_quickack(connection->data.socket);
-
+	tcp_sock_set_quickack(connection->data.socket->sk, 2);
 	return 0;
 }
 
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 9e42c7fe50a8b..2eaf8320b9db0 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -499,5 +499,6 @@ int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount,
 
 void tcp_sock_set_cork(struct sock *sk, bool on);
 void tcp_sock_set_nodelay(struct sock *sk);
+void tcp_sock_set_quickack(struct sock *sk, int val);
 
 #endif	/* _LINUX_TCP_H */
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index a65f293a19fac..27b5e7a4e2ef9 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2856,6 +2856,31 @@ void tcp_sock_set_nodelay(struct sock *sk)
 }
 EXPORT_SYMBOL(tcp_sock_set_nodelay);
 
+static void __tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	if (!val) {
+		inet_csk_enter_pingpong_mode(sk);
+		return;
+	}
+
+	inet_csk_exit_pingpong_mode(sk);
+	if ((1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
+	    inet_csk_ack_scheduled(sk)) {
+		inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_PUSHED;
+		tcp_cleanup_rbuf(sk, 1);
+		if (!(val & 1))
+			inet_csk_enter_pingpong_mode(sk);
+	}
+}
+
+void tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	lock_sock(sk);
+	__tcp_sock_set_quickack(sk, val);
+	release_sock(sk);
+}
+EXPORT_SYMBOL(tcp_sock_set_quickack);
+
 /*
  *	Socket option code for TCP.
  */
@@ -3096,19 +3121,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
 		break;
 
 	case TCP_QUICKACK:
-		if (!val) {
-			inet_csk_enter_pingpong_mode(sk);
-		} else {
-			inet_csk_exit_pingpong_mode(sk);
-			if ((1 << sk->sk_state) &
-			    (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
-			    inet_csk_ack_scheduled(sk)) {
-				icsk->icsk_ack.pending |= ICSK_ACK_PUSHED;
-				tcp_cleanup_rbuf(sk, 1);
-				if (!(val & 1))
-					inet_csk_enter_pingpong_mode(sk);
-			}
-		}
+		__tcp_sock_set_quickack(sk, val);
 		break;
 
 #ifdef CONFIG_TCP_MD5SIG
-- 
2.26.2


_______________________________________________
linux-nvme mailing list
linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: "David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>
Cc: Eric Dumazet <edumazet@google.com>,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	Jon Maloy <jmaloy@redhat.com>, Ying Xue <ying.xue@windriver.com>,
	drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org,
	linux-rdma@vger.kernel.org, linux-nvme@lists.infradead.org,
	target-devel@vger.kernel.org, linux-afs@lists.infradead.org,
	linux-cifs@vger.kernel.org, cluster-devel@redhat.com,
	ocfs2-devel@oss.oracle.com, netdev@vger.kernel.org,
	ceph-devel@vger.kernel.org, rds-devel@oss.oracle.com,
	linux-nfs@vger.kernel.org, tipc-discussion@lists.sourceforge.net
Subject: [Ocfs2-devel] [PATCH 12/28] tcp: add tcp_sock_set_quickack
Date: Thu, 28 May 2020 07:12:20 +0200	[thread overview]
Message-ID: <20200528051236.620353-13-hch@lst.de> (raw)
In-Reply-To: <20200528051236.620353-1-hch@lst.de>

Add a helper to directly set the TCP_QUICKACK sockopt from kernel space
without going through a fake uaccess.  Cleanup the callers to avoid
pointless wrappers now that this is a simple function call.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/drbd/drbd_int.h      |  7 ------
 drivers/block/drbd/drbd_receiver.c |  5 ++--
 include/linux/tcp.h                |  1 +
 net/ipv4/tcp.c                     | 39 ++++++++++++++++++++----------
 4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index e24bba87c8e02..14345a87c7cc5 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1570,13 +1570,6 @@ extern void drbd_set_recv_tcq(struct drbd_device *device, int tcq_enabled);
 extern void _drbd_clear_done_ee(struct drbd_device *device, struct list_head *to_be_freed);
 extern int drbd_connected(struct drbd_peer_device *);
 
-static inline void drbd_tcp_quickack(struct socket *sock)
-{
-	int val = 2;
-	(void) kernel_setsockopt(sock, SOL_TCP, TCP_QUICKACK,
-			(char*)&val, sizeof(val));
-}
-
 /* sets the number of 512 byte sectors of our virtual device */
 void drbd_set_my_capacity(struct drbd_device *device, sector_t size);
 
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 20a5e94494acd..3a3f2b6a821f3 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1223,7 +1223,7 @@ static int drbd_recv_header_maybe_unplug(struct drbd_connection *connection, str
 		 * quickly as possible, and let remote TCP know what we have
 		 * received so far. */
 		if (err == -EAGAIN) {
-			drbd_tcp_quickack(connection->data.socket);
+			tcp_sock_set_quickack(connection->data.socket->sk, 2);
 			drbd_unplug_all_devices(connection);
 		}
 		if (err > 0) {
@@ -4959,8 +4959,7 @@ static int receive_UnplugRemote(struct drbd_connection *connection, struct packe
 {
 	/* Make sure we've acked all the TCP data associated
 	 * with the data requests being unplugged */
-	drbd_tcp_quickack(connection->data.socket);
-
+	tcp_sock_set_quickack(connection->data.socket->sk, 2);
 	return 0;
 }
 
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 9e42c7fe50a8b..2eaf8320b9db0 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -499,5 +499,6 @@ int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount,
 
 void tcp_sock_set_cork(struct sock *sk, bool on);
 void tcp_sock_set_nodelay(struct sock *sk);
+void tcp_sock_set_quickack(struct sock *sk, int val);
 
 #endif	/* _LINUX_TCP_H */
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index a65f293a19fac..27b5e7a4e2ef9 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2856,6 +2856,31 @@ void tcp_sock_set_nodelay(struct sock *sk)
 }
 EXPORT_SYMBOL(tcp_sock_set_nodelay);
 
+static void __tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	if (!val) {
+		inet_csk_enter_pingpong_mode(sk);
+		return;
+	}
+
+	inet_csk_exit_pingpong_mode(sk);
+	if ((1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
+	    inet_csk_ack_scheduled(sk)) {
+		inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_PUSHED;
+		tcp_cleanup_rbuf(sk, 1);
+		if (!(val & 1))
+			inet_csk_enter_pingpong_mode(sk);
+	}
+}
+
+void tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	lock_sock(sk);
+	__tcp_sock_set_quickack(sk, val);
+	release_sock(sk);
+}
+EXPORT_SYMBOL(tcp_sock_set_quickack);
+
 /*
  *	Socket option code for TCP.
  */
@@ -3096,19 +3121,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
 		break;
 
 	case TCP_QUICKACK:
-		if (!val) {
-			inet_csk_enter_pingpong_mode(sk);
-		} else {
-			inet_csk_exit_pingpong_mode(sk);
-			if ((1 << sk->sk_state) &
-			    (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
-			    inet_csk_ack_scheduled(sk)) {
-				icsk->icsk_ack.pending |= ICSK_ACK_PUSHED;
-				tcp_cleanup_rbuf(sk, 1);
-				if (!(val & 1))
-					inet_csk_enter_pingpong_mode(sk);
-			}
-		}
+		__tcp_sock_set_quickack(sk, val);
 		break;
 
 #ifdef CONFIG_TCP_MD5SIG
-- 
2.26.2

WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 12/28] tcp: add tcp_sock_set_quickack
Date: Thu, 28 May 2020 07:12:20 +0200	[thread overview]
Message-ID: <20200528051236.620353-13-hch@lst.de> (raw)
In-Reply-To: <20200528051236.620353-1-hch@lst.de>

Add a helper to directly set the TCP_QUICKACK sockopt from kernel space
without going through a fake uaccess.  Cleanup the callers to avoid
pointless wrappers now that this is a simple function call.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/drbd/drbd_int.h      |  7 ------
 drivers/block/drbd/drbd_receiver.c |  5 ++--
 include/linux/tcp.h                |  1 +
 net/ipv4/tcp.c                     | 39 ++++++++++++++++++++----------
 4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index e24bba87c8e02..14345a87c7cc5 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1570,13 +1570,6 @@ extern void drbd_set_recv_tcq(struct drbd_device *device, int tcq_enabled);
 extern void _drbd_clear_done_ee(struct drbd_device *device, struct list_head *to_be_freed);
 extern int drbd_connected(struct drbd_peer_device *);
 
-static inline void drbd_tcp_quickack(struct socket *sock)
-{
-	int val = 2;
-	(void) kernel_setsockopt(sock, SOL_TCP, TCP_QUICKACK,
-			(char*)&val, sizeof(val));
-}
-
 /* sets the number of 512 byte sectors of our virtual device */
 void drbd_set_my_capacity(struct drbd_device *device, sector_t size);
 
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 20a5e94494acd..3a3f2b6a821f3 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1223,7 +1223,7 @@ static int drbd_recv_header_maybe_unplug(struct drbd_connection *connection, str
 		 * quickly as possible, and let remote TCP know what we have
 		 * received so far. */
 		if (err == -EAGAIN) {
-			drbd_tcp_quickack(connection->data.socket);
+			tcp_sock_set_quickack(connection->data.socket->sk, 2);
 			drbd_unplug_all_devices(connection);
 		}
 		if (err > 0) {
@@ -4959,8 +4959,7 @@ static int receive_UnplugRemote(struct drbd_connection *connection, struct packe
 {
 	/* Make sure we've acked all the TCP data associated
 	 * with the data requests being unplugged */
-	drbd_tcp_quickack(connection->data.socket);
-
+	tcp_sock_set_quickack(connection->data.socket->sk, 2);
 	return 0;
 }
 
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 9e42c7fe50a8b..2eaf8320b9db0 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -499,5 +499,6 @@ int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount,
 
 void tcp_sock_set_cork(struct sock *sk, bool on);
 void tcp_sock_set_nodelay(struct sock *sk);
+void tcp_sock_set_quickack(struct sock *sk, int val);
 
 #endif	/* _LINUX_TCP_H */
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index a65f293a19fac..27b5e7a4e2ef9 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2856,6 +2856,31 @@ void tcp_sock_set_nodelay(struct sock *sk)
 }
 EXPORT_SYMBOL(tcp_sock_set_nodelay);
 
+static void __tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	if (!val) {
+		inet_csk_enter_pingpong_mode(sk);
+		return;
+	}
+
+	inet_csk_exit_pingpong_mode(sk);
+	if ((1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
+	    inet_csk_ack_scheduled(sk)) {
+		inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_PUSHED;
+		tcp_cleanup_rbuf(sk, 1);
+		if (!(val & 1))
+			inet_csk_enter_pingpong_mode(sk);
+	}
+}
+
+void tcp_sock_set_quickack(struct sock *sk, int val)
+{
+	lock_sock(sk);
+	__tcp_sock_set_quickack(sk, val);
+	release_sock(sk);
+}
+EXPORT_SYMBOL(tcp_sock_set_quickack);
+
 /*
  *	Socket option code for TCP.
  */
@@ -3096,19 +3121,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
 		break;
 
 	case TCP_QUICKACK:
-		if (!val) {
-			inet_csk_enter_pingpong_mode(sk);
-		} else {
-			inet_csk_exit_pingpong_mode(sk);
-			if ((1 << sk->sk_state) &
-			    (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
-			    inet_csk_ack_scheduled(sk)) {
-				icsk->icsk_ack.pending |= ICSK_ACK_PUSHED;
-				tcp_cleanup_rbuf(sk, 1);
-				if (!(val & 1))
-					inet_csk_enter_pingpong_mode(sk);
-			}
-		}
+		__tcp_sock_set_quickack(sk, val);
 		break;
 
 #ifdef CONFIG_TCP_MD5SIG
-- 
2.26.2



  parent reply	other threads:[~2020-05-28  5:16 UTC|newest]

Thread overview: 165+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-28  5:12 remove most callers of kernel_setsockopt v3 Christoph Hellwig
2020-05-28  5:12 ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12 ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12 ` Christoph Hellwig
2020-05-28  5:12 ` Christoph Hellwig
2020-05-28  5:12 ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 01/28] net: add sock_set_reuseaddr Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 02/28] net: add sock_no_linger Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 03/28] net: add sock_set_priority Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 04/28] net: add sock_set_sndtimeo Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 05/28] net: add sock_bindtoindex Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 06/28] net: add sock_enable_timestamps Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 07/28] net: add sock_set_keepalive Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 08/28] net: add sock_set_rcvbuf Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 09/28] net: add sock_set_reuseport Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 10/28] tcp: add tcp_sock_set_cork Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 11/28] tcp: add tcp_sock_set_nodelay Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` Christoph Hellwig [this message]
2020-05-28  5:12   ` [Cluster-devel] [PATCH 12/28] tcp: add tcp_sock_set_quickack Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 13/28] tcp: add tcp_sock_set_syncnt Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 14/28] tcp: add tcp_sock_set_user_timeout Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 15/28] tcp: add tcp_sock_set_keepidle Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 16/28] tcp: add tcp_sock_set_keepintvl Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 17/28] tcp: add tcp_sock_set_keepcnt Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 18/28] ipv4: add ip_sock_set_tos Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 19/28] ipv4: add ip_sock_set_freebind Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 20/28] ipv4: add ip_sock_set_recverr Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 21/28] ipv4: add ip_sock_set_mtu_discover Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 22/28] ipv4: add ip_sock_set_pktinfo Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 23/28] ipv6: add ip6_sock_set_v6only Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 24/28] ipv6: add ip6_sock_set_recverr Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 25/28] ipv6: add ip6_sock_set_addr_preferences Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 26/28] ipv6: add ip6_sock_set_recvpktinfo Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 27/28] rxrpc: add rxrpc_sock_set_min_security_level Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12 ` [PATCH 28/28] tipc: call tsk_set_importance from tipc_topsrv_create_listener Christoph Hellwig
2020-05-28  5:12   ` [Cluster-devel] " Christoph Hellwig
2020-05-28  5:12   ` [Ocfs2-devel] " Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28  5:12   ` Christoph Hellwig
2020-05-28 18:12 ` remove most callers of kernel_setsockopt v3 David Miller
2020-05-28 18:12   ` [Cluster-devel] " David Miller
2020-05-28 18:12   ` [Ocfs2-devel] " David Miller
2020-05-28 18:12   ` David Miller
2020-05-28 18:12   ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200528051236.620353-13-hch@lst.de \
    --to=hch@lst.de \
    --cc=ceph-devel@vger.kernel.org \
    --cc=cluster-devel@redhat.com \
    --cc=davem@davemloft.net \
    --cc=drbd-dev@lists.linbit.com \
    --cc=edumazet@google.com \
    --cc=jmaloy@redhat.com \
    --cc=kuba@kernel.org \
    --cc=kuznet@ms2.inr.ac.ru \
    --cc=linux-afs@lists.infradead.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=ocfs2-devel@oss.oracle.com \
    --cc=rds-devel@oss.oracle.com \
    --cc=target-devel@vger.kernel.org \
    --cc=tipc-discussion@lists.sourceforge.net \
    --cc=ying.xue@windriver.com \
    --cc=yoshfuji@linux-ipv6.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.