Revert "net: Add a second bind table hashed by port and address"
This reverts: commitd5a42de8bd("net: Add a second bind table hashed by port and address") commit538aaf9b23("selftests: Add test for timing a bind request to a port with a populated bhash entry") Link: https://lore.kernel.org/netdev/20220520001834.2247810-1-kuba@kernel.org/ There are a few things that need to be fixed here: * Updating bhash2 in cases where the socket's rcv saddr changes * Adding bhash2 hashbucket locks Links to syzbot reports: https://lore.kernel.org/netdev/00000000000022208805e0df247a@google.com/ https://lore.kernel.org/netdev/0000000000003f33bc05dfaf44fe@google.com/ Fixes:d5a42de8bd("net: Add a second bind table hashed by port and address") Reported-by: syzbot+015d756bbd1f8b5c8f09@syzkaller.appspotmail.com Reported-by: syzbot+98fd2d1422063b0f8c44@syzkaller.appspotmail.com Reported-by: syzbot+0a847a982613c6438fba@syzkaller.appspotmail.com Signed-off-by: Joanne Koong <joannelkoong@gmail.com> Link: https://lore.kernel.org/r/20220615193213.2419568-1-joannelkoong@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
219b51a6f0
commit
593d1ebe00
10 changed files with 83 additions and 611 deletions
|
|
@ -25,7 +25,6 @@
|
|||
#undef INET_CSK_CLEAR_TIMERS
|
||||
|
||||
struct inet_bind_bucket;
|
||||
struct inet_bind2_bucket;
|
||||
struct tcp_congestion_ops;
|
||||
|
||||
/*
|
||||
|
|
@ -58,7 +57,6 @@ struct inet_connection_sock_af_ops {
|
|||
*
|
||||
* @icsk_accept_queue: FIFO of established children
|
||||
* @icsk_bind_hash: Bind node
|
||||
* @icsk_bind2_hash: Bind node in the bhash2 table
|
||||
* @icsk_timeout: Timeout
|
||||
* @icsk_retransmit_timer: Resend (no ack)
|
||||
* @icsk_rto: Retransmit timeout
|
||||
|
|
@ -85,7 +83,6 @@ struct inet_connection_sock {
|
|||
struct inet_sock icsk_inet;
|
||||
struct request_sock_queue icsk_accept_queue;
|
||||
struct inet_bind_bucket *icsk_bind_hash;
|
||||
struct inet_bind2_bucket *icsk_bind2_hash;
|
||||
unsigned long icsk_timeout;
|
||||
struct timer_list icsk_retransmit_timer;
|
||||
struct timer_list icsk_delack_timer;
|
||||
|
|
|
|||
|
|
@ -90,32 +90,11 @@ struct inet_bind_bucket {
|
|||
struct hlist_head owners;
|
||||
};
|
||||
|
||||
struct inet_bind2_bucket {
|
||||
possible_net_t ib_net;
|
||||
int l3mdev;
|
||||
unsigned short port;
|
||||
union {
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
struct in6_addr v6_rcv_saddr;
|
||||
#endif
|
||||
__be32 rcv_saddr;
|
||||
};
|
||||
/* Node in the inet2_bind_hashbucket chain */
|
||||
struct hlist_node node;
|
||||
/* List of sockets hashed to this bucket */
|
||||
struct hlist_head owners;
|
||||
};
|
||||
|
||||
static inline struct net *ib_net(struct inet_bind_bucket *ib)
|
||||
{
|
||||
return read_pnet(&ib->ib_net);
|
||||
}
|
||||
|
||||
static inline struct net *ib2_net(struct inet_bind2_bucket *ib)
|
||||
{
|
||||
return read_pnet(&ib->ib_net);
|
||||
}
|
||||
|
||||
#define inet_bind_bucket_for_each(tb, head) \
|
||||
hlist_for_each_entry(tb, head, node)
|
||||
|
||||
|
|
@ -124,15 +103,6 @@ struct inet_bind_hashbucket {
|
|||
struct hlist_head chain;
|
||||
};
|
||||
|
||||
/* This is synchronized using the inet_bind_hashbucket's spinlock.
|
||||
* Instead of having separate spinlocks, the inet_bind2_hashbucket can share
|
||||
* the inet_bind_hashbucket's given that in every case where the bhash2 table
|
||||
* is useful, a lookup in the bhash table also occurs.
|
||||
*/
|
||||
struct inet_bind2_hashbucket {
|
||||
struct hlist_head chain;
|
||||
};
|
||||
|
||||
/* Sockets can be hashed in established or listening table.
|
||||
* We must use different 'nulls' end-of-chain value for all hash buckets :
|
||||
* A socket might transition from ESTABLISH to LISTEN state without
|
||||
|
|
@ -164,12 +134,6 @@ struct inet_hashinfo {
|
|||
*/
|
||||
struct kmem_cache *bind_bucket_cachep;
|
||||
struct inet_bind_hashbucket *bhash;
|
||||
/* The 2nd binding table hashed by port and address.
|
||||
* This is used primarily for expediting the resolution of bind
|
||||
* conflicts.
|
||||
*/
|
||||
struct kmem_cache *bind2_bucket_cachep;
|
||||
struct inet_bind2_hashbucket *bhash2;
|
||||
unsigned int bhash_size;
|
||||
|
||||
/* The 2nd listener table hashed by local port and address */
|
||||
|
|
@ -229,36 +193,6 @@ inet_bind_bucket_create(struct kmem_cache *cachep, struct net *net,
|
|||
void inet_bind_bucket_destroy(struct kmem_cache *cachep,
|
||||
struct inet_bind_bucket *tb);
|
||||
|
||||
static inline bool check_bind_bucket_match(struct inet_bind_bucket *tb,
|
||||
struct net *net,
|
||||
const unsigned short port,
|
||||
int l3mdev)
|
||||
{
|
||||
return net_eq(ib_net(tb), net) && tb->port == port &&
|
||||
tb->l3mdev == l3mdev;
|
||||
}
|
||||
|
||||
struct inet_bind2_bucket *
|
||||
inet_bind2_bucket_create(struct kmem_cache *cachep, struct net *net,
|
||||
struct inet_bind2_hashbucket *head,
|
||||
const unsigned short port, int l3mdev,
|
||||
const struct sock *sk);
|
||||
|
||||
void inet_bind2_bucket_destroy(struct kmem_cache *cachep,
|
||||
struct inet_bind2_bucket *tb);
|
||||
|
||||
struct inet_bind2_bucket *
|
||||
inet_bind2_bucket_find(struct inet_hashinfo *hinfo, struct net *net,
|
||||
const unsigned short port, int l3mdev,
|
||||
struct sock *sk,
|
||||
struct inet_bind2_hashbucket **head);
|
||||
|
||||
bool check_bind2_bucket_match_nulladdr(struct inet_bind2_bucket *tb,
|
||||
struct net *net,
|
||||
const unsigned short port,
|
||||
int l3mdev,
|
||||
const struct sock *sk);
|
||||
|
||||
static inline u32 inet_bhashfn(const struct net *net, const __u16 lport,
|
||||
const u32 bhash_size)
|
||||
{
|
||||
|
|
@ -266,7 +200,7 @@ static inline u32 inet_bhashfn(const struct net *net, const __u16 lport,
|
|||
}
|
||||
|
||||
void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb,
|
||||
struct inet_bind2_bucket *tb2, const unsigned short snum);
|
||||
const unsigned short snum);
|
||||
|
||||
/* Caller must disable local BH processing. */
|
||||
int __inet_inherit_port(const struct sock *sk, struct sock *child);
|
||||
|
|
|
|||
|
|
@ -348,7 +348,6 @@ struct sk_filter;
|
|||
* @sk_txtime_report_errors: set report errors mode for SO_TXTIME
|
||||
* @sk_txtime_unused: unused txtime flags
|
||||
* @ns_tracker: tracker for netns reference
|
||||
* @sk_bind2_node: bind node in the bhash2 table
|
||||
*/
|
||||
struct sock {
|
||||
/*
|
||||
|
|
@ -538,7 +537,6 @@ struct sock {
|
|||
#endif
|
||||
struct rcu_head sk_rcu;
|
||||
netns_tracker ns_tracker;
|
||||
struct hlist_node sk_bind2_node;
|
||||
};
|
||||
|
||||
enum sk_pacing {
|
||||
|
|
@ -819,16 +817,6 @@ static inline void sk_add_bind_node(struct sock *sk,
|
|||
hlist_add_head(&sk->sk_bind_node, list);
|
||||
}
|
||||
|
||||
static inline void __sk_del_bind2_node(struct sock *sk)
|
||||
{
|
||||
__hlist_del(&sk->sk_bind2_node);
|
||||
}
|
||||
|
||||
static inline void sk_add_bind2_node(struct sock *sk, struct hlist_head *list)
|
||||
{
|
||||
hlist_add_head(&sk->sk_bind2_node, list);
|
||||
}
|
||||
|
||||
#define sk_for_each(__sk, list) \
|
||||
hlist_for_each_entry(__sk, list, sk_node)
|
||||
#define sk_for_each_rcu(__sk, list) \
|
||||
|
|
@ -846,8 +834,6 @@ static inline void sk_add_bind2_node(struct sock *sk, struct hlist_head *list)
|
|||
hlist_for_each_entry_safe(__sk, tmp, list, sk_node)
|
||||
#define sk_for_each_bound(__sk, list) \
|
||||
hlist_for_each_entry(__sk, list, sk_bind_node)
|
||||
#define sk_for_each_bound_bhash2(__sk, list) \
|
||||
hlist_for_each_entry(__sk, list, sk_bind2_node)
|
||||
|
||||
/**
|
||||
* sk_for_each_entry_offset_rcu - iterate over a list at a given struct offset
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue