Skip to content

Commit

Permalink
txhash: Add socket option to control TX hash rethink behavior
Browse files Browse the repository at this point in the history
Add the SO_TXREHASH socket option to control hash rethink behavior per socket.
When default mode is set, sockets disable rehash at initialization and use
sysctl option when entering listen state. setsockopt() overrides default
behavior.

Signed-off-by: Akhmat Karakotov <hmukos@yandex-team.ru>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Akhmat Karakotov authored and David S. Miller committed Jan 31, 2022
1 parent e187013 commit 2685924
Show file tree
Hide file tree
Showing 9 changed files with 30 additions and 9 deletions.
2 changes: 2 additions & 0 deletions arch/alpha/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@

#define SO_RESERVE_MEM 73

#define SO_TXREHASH 74

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
Expand Down
2 changes: 2 additions & 0 deletions arch/mips/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@

#define SO_RESERVE_MEM 73

#define SO_TXREHASH 74

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
Expand Down
2 changes: 2 additions & 0 deletions arch/parisc/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@

#define SO_RESERVE_MEM 0x4047

#define SO_TXREHASH 0x4048

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
Expand Down
2 changes: 2 additions & 0 deletions arch/sparc/include/uapi/asm/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@

#define SO_RESERVE_MEM 0x0052

#define SO_TXREHASH 0x0053


#if !defined(__KERNEL__)

Expand Down
12 changes: 3 additions & 9 deletions include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ struct sk_filter;
* @sk_rcvtimeo: %SO_RCVTIMEO setting
* @sk_sndtimeo: %SO_SNDTIMEO setting
* @sk_txhash: computed flow hash for use on transmit
* @sk_txrehash: enable TX hash rethink
* @sk_filter: socket filtering instructions
* @sk_timer: sock cleanup timer
* @sk_stamp: time stamp of last packet received
Expand Down Expand Up @@ -491,6 +492,7 @@ struct sock {
u32 sk_ack_backlog;
u32 sk_max_ack_backlog;
kuid_t sk_uid;
u8 sk_txrehash;
#ifdef CONFIG_NET_RX_BUSY_POLL
u8 sk_prefer_busy_poll;
u16 sk_busy_poll_budget;
Expand Down Expand Up @@ -2066,18 +2068,10 @@ static inline void sk_set_txhash(struct sock *sk)

static inline bool sk_rethink_txhash(struct sock *sk)
{
u8 rehash;

if (!sk->sk_txhash)
return false;

rehash = READ_ONCE(sock_net(sk)->core.sysctl_txrehash);

if (rehash) {
if (sk->sk_txhash && sk->sk_txrehash == SOCK_TXREHASH_ENABLED) {
sk_set_txhash(sk);
return true;
}

return false;
}

Expand Down
2 changes: 2 additions & 0 deletions include/uapi/asm-generic/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@

#define SO_RESERVE_MEM 73

#define SO_TXREHASH 74

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
Expand Down
1 change: 1 addition & 0 deletions include/uapi/linux/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct __kernel_sockaddr_storage {

#define SOCK_BUF_LOCK_MASK (SOCK_SNDBUF_LOCK | SOCK_RCVBUF_LOCK)

#define SOCK_TXREHASH_DEFAULT ((u8)-1)
#define SOCK_TXREHASH_DISABLED 0
#define SOCK_TXREHASH_ENABLED 1

Expand Down
13 changes: 13 additions & 0 deletions net/core/sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -1447,6 +1447,14 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
break;
}

case SO_TXREHASH:
if (val < -1 || val > 1) {
ret = -EINVAL;
break;
}
sk->sk_txrehash = (u8)val;
break;

default:
ret = -ENOPROTOOPT;
break;
Expand Down Expand Up @@ -1834,6 +1842,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sk->sk_reserved_mem;
break;

case SO_TXREHASH:
v.val = sk->sk_txrehash;
break;

default:
/* We implement the SO_SNDLOWAT etc to not be settable
* (1003.1g 7).
Expand Down Expand Up @@ -3279,6 +3291,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
sk->sk_pacing_rate = ~0UL;
WRITE_ONCE(sk->sk_pacing_shift, 10);
sk->sk_incoming_cpu = -1;
sk->sk_txrehash = SOCK_TXREHASH_DEFAULT;

sk_rx_queue_clear(sk);
/*
Expand Down
3 changes: 3 additions & 0 deletions net/ipv4/inet_connection_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -1046,6 +1046,9 @@ int inet_csk_listen_start(struct sock *sk)
sk->sk_ack_backlog = 0;
inet_csk_delack_init(sk);

if (sk->sk_txrehash == SOCK_TXREHASH_DEFAULT)
sk->sk_txrehash = READ_ONCE(sock_net(sk)->core.sysctl_txrehash);

/* There is race window here: we announce ourselves listening,
* but this transition is still not validated by get_port().
* It is OK, because this socket enters to hash table only
Expand Down

0 comments on commit 2685924

Please sign in to comment.