Commit ddd061b8 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David S. Miller

tcp: add tcp_sock_set_quickack

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 12abc5ee
......@@ -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);
......
......@@ -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;
}
......
......@@ -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 */
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment