udp: move udp->accept_udp_{l4|fraglist} to udp->udp_flags
[ Upstream commit f5f52f0884a595ff99ab1a608643fe4025fca2d5 ] These are read locklessly, move them to udp_flags to fix data-races. Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Stable-dep-of: 70a36f571362 ("udp: annotate data-races around udp->encap_type") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
268e92e323
commit
8b2069d5c1
|
@ -37,6 +37,8 @@ enum {
|
|||
UDP_FLAGS_NO_CHECK6_TX, /* Send zero UDP6 checksums on TX? */
|
||||
UDP_FLAGS_NO_CHECK6_RX, /* Allow zero UDP6 checksums on RX? */
|
||||
UDP_FLAGS_GRO_ENABLED, /* Request GRO aggregation */
|
||||
UDP_FLAGS_ACCEPT_FRAGLIST,
|
||||
UDP_FLAGS_ACCEPT_L4,
|
||||
};
|
||||
|
||||
struct udp_sock {
|
||||
|
@ -50,13 +52,11 @@ struct udp_sock {
|
|||
|
||||
int pending; /* Any pending frames ? */
|
||||
__u8 encap_type; /* Is this an Encapsulation socket? */
|
||||
unsigned char encap_enabled:1, /* This socket enabled encap
|
||||
unsigned char encap_enabled:1; /* This socket enabled encap
|
||||
* processing; UDP tunnels and
|
||||
* different encapsulation layer set
|
||||
* this
|
||||
*/
|
||||
accept_udp_l4:1,
|
||||
accept_udp_fraglist:1;
|
||||
/* indicator bits used by pcflag: */
|
||||
#define UDPLITE_BIT 0x1 /* set by udplite proto init function */
|
||||
#define UDPLITE_SEND_CC 0x2 /* set via udplite setsockopt */
|
||||
|
@ -149,10 +149,12 @@ static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb)
|
|||
if (!skb_is_gso(skb))
|
||||
return false;
|
||||
|
||||
if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4 && !udp_sk(sk)->accept_udp_l4)
|
||||
if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4 &&
|
||||
!udp_test_bit(ACCEPT_L4, sk))
|
||||
return true;
|
||||
|
||||
if (skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST && !udp_sk(sk)->accept_udp_fraglist)
|
||||
if (skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST &&
|
||||
!udp_test_bit(ACCEPT_FRAGLIST, sk))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -160,8 +162,8 @@ static inline bool udp_unexpected_gso(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
static inline void udp_allow_gso(struct sock *sk)
|
||||
{
|
||||
udp_sk(sk)->accept_udp_l4 = 1;
|
||||
udp_sk(sk)->accept_udp_fraglist = 1;
|
||||
udp_set_bit(ACCEPT_L4, sk);
|
||||
udp_set_bit(ACCEPT_FRAGLIST, sk);
|
||||
}
|
||||
|
||||
#define udp_portaddr_for_each_entry(__sk, list) \
|
||||
|
|
|
@ -2716,7 +2716,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
|
|||
if (valbool)
|
||||
udp_tunnel_encap_enable(sk->sk_socket);
|
||||
udp_assign_bit(GRO_ENABLED, sk, valbool);
|
||||
up->accept_udp_l4 = valbool;
|
||||
udp_assign_bit(ACCEPT_L4, sk, valbool);
|
||||
release_sock(sk);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue