Commit d507204d authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

tcp/dccp: add tw->tw_bslot



We want to allow inet_twsk_kill() working even if netns
has been dismantled/freed, to get rid of inet_twsk_purge().

This patch adds tw->tw_bslot to cache the bind bucket slot
so that inet_twsk_kill() no longer needs to dereference twsk_net(tw)

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8a0de61c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ struct inet_timewait_sock {
				tw_tos		: 8;
	u32			tw_txhash;
	u32			tw_priority;
	u32			tw_bslot; /* bind bucket slot */
	struct timer_list	tw_timer;
	struct inet_bind_bucket	*tw_tb;
};
+7 −4
Original line number Diff line number Diff line
@@ -52,8 +52,7 @@ static void inet_twsk_kill(struct inet_timewait_sock *tw)
	spin_unlock(lock);

	/* Disassociate with bind bucket. */
	bhead = &hashinfo->bhash[inet_bhashfn(twsk_net(tw), tw->tw_num,
			hashinfo->bhash_size)];
	bhead = &hashinfo->bhash[tw->tw_bslot];

	spin_lock(&bhead->lock);
	inet_twsk_bind_unhash(tw, hashinfo);
@@ -110,8 +109,12 @@ void inet_twsk_hashdance(struct inet_timewait_sock *tw, struct sock *sk,
	   Note, that any socket with inet->num != 0 MUST be bound in
	   binding cache, even if it is closed.
	 */
	bhead = &hashinfo->bhash[inet_bhashfn(twsk_net(tw), inet->inet_num,
			hashinfo->bhash_size)];
	/* Cache inet_bhashfn(), because 'struct net' might be no longer
	 * available later in inet_twsk_kill().
	 */
	tw->tw_bslot = inet_bhashfn(twsk_net(tw), inet->inet_num,
				    hashinfo->bhash_size);
	bhead = &hashinfo->bhash[tw->tw_bslot];
	spin_lock(&bhead->lock);
	tw->tw_tb = icsk->icsk_bind_hash;
	WARN_ON(!icsk->icsk_bind_hash);