xfrm: Fix xfrm_policy_gc_lock handling.

From: Alexey Dobriyan <adobriyan@gmail.com>

Based upon a lockdep trace by Simon Arlott.

xfrm_policy_kill() can be called from both BH and
non-BH contexts, so we have to grab xfrm_policy_gc_lock
with BH disabling.

Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Alexey Dobriyan and committed by David S. Miller bbb770e7 19ecb6ba

+2 -2
+2 -2
net/xfrm/xfrm_policy.c
··· 315 return; 316 } 317 318 - spin_lock(&xfrm_policy_gc_lock); 319 hlist_add_head(&policy->bydst, &xfrm_policy_gc_list); 320 - spin_unlock(&xfrm_policy_gc_lock); 321 322 schedule_work(&xfrm_policy_gc_work); 323 }
··· 315 return; 316 } 317 318 + spin_lock_bh(&xfrm_policy_gc_lock); 319 hlist_add_head(&policy->bydst, &xfrm_policy_gc_list); 320 + spin_unlock_bh(&xfrm_policy_gc_lock); 321 322 schedule_work(&xfrm_policy_gc_work); 323 }