Revert "udp: lockless UDP_ENCAP_L2TPINUDP / UDP_GRO"
This reverts commit 8d929b6c11 which is
commit ac9a7f4ce5dda1472e8f44096f33066c6ec1a3b4 upstream.
It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.
Bug: 161946584
Change-Id: Iabf0e545238fb27b7fd2750918ec9b079d5bba45
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
f9f95b82b2
commit
cdf5cfe6d1
5 changed files with 20 additions and 12 deletions
|
|
@ -37,7 +37,6 @@ enum {
|
||||||
UDP_FLAGS_GRO_ENABLED, /* Request GRO aggregation */
|
UDP_FLAGS_GRO_ENABLED, /* Request GRO aggregation */
|
||||||
UDP_FLAGS_ACCEPT_FRAGLIST,
|
UDP_FLAGS_ACCEPT_FRAGLIST,
|
||||||
UDP_FLAGS_ACCEPT_L4,
|
UDP_FLAGS_ACCEPT_L4,
|
||||||
UDP_FLAGS_ENCAP_ENABLED, /* This socket enabled encap */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct udp_sock {
|
struct udp_sock {
|
||||||
|
|
@ -51,7 +50,11 @@ struct udp_sock {
|
||||||
|
|
||||||
int pending; /* Any pending frames ? */
|
int pending; /* Any pending frames ? */
|
||||||
__u8 encap_type; /* Is this an Encapsulation socket? */
|
__u8 encap_type; /* Is this an Encapsulation socket? */
|
||||||
|
unsigned char encap_enabled:1; /* This socket enabled encap
|
||||||
|
* processing; UDP tunnels and
|
||||||
|
* different encapsulation layer set
|
||||||
|
* this
|
||||||
|
*/
|
||||||
/* indicator bits used by pcflag: */
|
/* indicator bits used by pcflag: */
|
||||||
#define UDPLITE_BIT 0x1 /* set by udplite proto init function */
|
#define UDPLITE_BIT 0x1 /* set by udplite proto init function */
|
||||||
#define UDPLITE_SEND_CC 0x2 /* set via udplite setsockopt */
|
#define UDPLITE_SEND_CC 0x2 /* set via udplite setsockopt */
|
||||||
|
|
@ -95,8 +98,6 @@ struct udp_sock {
|
||||||
test_bit(UDP_FLAGS_##nr, &udp_sk(sk)->udp_flags)
|
test_bit(UDP_FLAGS_##nr, &udp_sk(sk)->udp_flags)
|
||||||
#define udp_set_bit(nr, sk) \
|
#define udp_set_bit(nr, sk) \
|
||||||
set_bit(UDP_FLAGS_##nr, &udp_sk(sk)->udp_flags)
|
set_bit(UDP_FLAGS_##nr, &udp_sk(sk)->udp_flags)
|
||||||
#define udp_test_and_set_bit(nr, sk) \
|
|
||||||
test_and_set_bit(UDP_FLAGS_##nr, &udp_sk(sk)->udp_flags)
|
|
||||||
#define udp_clear_bit(nr, sk) \
|
#define udp_clear_bit(nr, sk) \
|
||||||
clear_bit(UDP_FLAGS_##nr, &udp_sk(sk)->udp_flags)
|
clear_bit(UDP_FLAGS_##nr, &udp_sk(sk)->udp_flags)
|
||||||
#define udp_assign_bit(nr, sk, val) \
|
#define udp_assign_bit(nr, sk, val) \
|
||||||
|
|
|
||||||
|
|
@ -174,13 +174,16 @@ static inline int udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void udp_tunnel_encap_enable(struct sock *sk)
|
static inline void udp_tunnel_encap_enable(struct socket *sock)
|
||||||
{
|
{
|
||||||
if (udp_test_and_set_bit(ENCAP_ENABLED, sk))
|
struct udp_sock *up = udp_sk(sock->sk);
|
||||||
|
|
||||||
|
if (up->encap_enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
up->encap_enabled = 1;
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
if (READ_ONCE(sk->sk_family) == PF_INET6)
|
if (sock->sk->sk_family == PF_INET6)
|
||||||
ipv6_stub->udpv6_encap_enable();
|
ipv6_stub->udpv6_encap_enable();
|
||||||
#endif
|
#endif
|
||||||
udp_encap_enable();
|
udp_encap_enable();
|
||||||
|
|
|
||||||
|
|
@ -2645,7 +2645,7 @@ void udp_destroy_sock(struct sock *sk)
|
||||||
if (encap_destroy)
|
if (encap_destroy)
|
||||||
encap_destroy(sk);
|
encap_destroy(sk);
|
||||||
}
|
}
|
||||||
if (udp_test_bit(ENCAP_ENABLED, sk))
|
if (up->encap_enabled)
|
||||||
static_branch_dec(&udp_encap_needed_key);
|
static_branch_dec(&udp_encap_needed_key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2700,7 +2700,9 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
|
||||||
fallthrough;
|
fallthrough;
|
||||||
case UDP_ENCAP_L2TPINUDP:
|
case UDP_ENCAP_L2TPINUDP:
|
||||||
up->encap_type = val;
|
up->encap_type = val;
|
||||||
udp_tunnel_encap_enable(sk);
|
lock_sock(sk);
|
||||||
|
udp_tunnel_encap_enable(sk->sk_socket);
|
||||||
|
release_sock(sk);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
err = -ENOPROTOOPT;
|
err = -ENOPROTOOPT;
|
||||||
|
|
@ -2723,12 +2725,14 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UDP_GRO:
|
case UDP_GRO:
|
||||||
|
lock_sock(sk);
|
||||||
|
|
||||||
/* when enabling GRO, accept the related GSO packet type */
|
/* when enabling GRO, accept the related GSO packet type */
|
||||||
if (valbool)
|
if (valbool)
|
||||||
udp_tunnel_encap_enable(sk);
|
udp_tunnel_encap_enable(sk->sk_socket);
|
||||||
udp_assign_bit(GRO_ENABLED, sk, valbool);
|
udp_assign_bit(GRO_ENABLED, sk, valbool);
|
||||||
udp_assign_bit(ACCEPT_L4, sk, valbool);
|
udp_assign_bit(ACCEPT_L4, sk, valbool);
|
||||||
|
release_sock(sk);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
|
||||||
udp_sk(sk)->gro_receive = cfg->gro_receive;
|
udp_sk(sk)->gro_receive = cfg->gro_receive;
|
||||||
udp_sk(sk)->gro_complete = cfg->gro_complete;
|
udp_sk(sk)->gro_complete = cfg->gro_complete;
|
||||||
|
|
||||||
udp_tunnel_encap_enable(sk);
|
udp_tunnel_encap_enable(sock);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
|
EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1688,7 +1688,7 @@ void udpv6_destroy_sock(struct sock *sk)
|
||||||
if (encap_destroy)
|
if (encap_destroy)
|
||||||
encap_destroy(sk);
|
encap_destroy(sk);
|
||||||
}
|
}
|
||||||
if (udp_test_bit(ENCAP_ENABLED, sk)) {
|
if (up->encap_enabled) {
|
||||||
static_branch_dec(&udpv6_encap_needed_key);
|
static_branch_dec(&udpv6_encap_needed_key);
|
||||||
udp_encap_disable();
|
udp_encap_disable();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue