Commit 26859240 authored by Akhmat Karakotov's avatar Akhmat Karakotov Committed by David S. Miller
Browse files

txhash: Add socket option to control TX hash rethink behavior



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: default avatarAkhmat Karakotov <hmukos@yandex-team.ru>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e187013a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -133,6 +133,8 @@

#define SO_RESERVE_MEM		73

#define SO_TXREHASH		74

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+2 −0
Original line number Diff line number Diff line
@@ -144,6 +144,8 @@

#define SO_RESERVE_MEM		73

#define SO_TXREHASH		74

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+2 −0
Original line number Diff line number Diff line
@@ -125,6 +125,8 @@

#define SO_RESERVE_MEM		0x4047

#define SO_TXREHASH		0x4048

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64
+2 −0
Original line number Diff line number Diff line
@@ -126,6 +126,8 @@

#define SO_RESERVE_MEM           0x0052

#define SO_TXREHASH              0x0053


#if !defined(__KERNEL__)

+3 −9
Original line number Diff line number Diff line
@@ -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
@@ -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;
@@ -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;
}

Loading