From: Ridge Kennedy <ridge.kenn...@alliedtelesis.co.nz>
Date: Wed, 22 Feb 2017 14:59:49 +1300

> While destroying a network namespace that contains a L2TP tunnel a
> "BUG: scheduling while atomic" can be observed.
> 
> Enabling lockdep shows that this is happening because l2tp_exit_net()
> is calling l2tp_tunnel_closeall() (via l2tp_tunnel_delete()) from
> within an RCU critical section.
 ...
> This bug can easily be reproduced with a few steps:
> 
>  $ sudo unshare -n bash  # Create a shell in a new namespace
>  # ip link set lo up
>  # ip addr add 127.0.0.1 dev lo
>  # ip l2tp add tunnel remote 127.0.0.1 local 127.0.0.1 tunnel_id 1 \
>     peer_tunnel_id 1 udp_sport 50000 udp_dport 50000
>  # ip l2tp add session name foo tunnel_id 1 session_id 1 \
>     peer_session_id 1
>  # ip link set foo up
>  # exit  # Exit the shell, in turn exiting the namespace
>  $ dmesg
>  ...
>  [942121.089216] BUG: scheduling while atomic: kworker/u16:3/13872/0x00000200
>  ...
> 
> To fix this, move the call to l2tp_tunnel_closeall() out of the RCU
> critical section, and instead call it from l2tp_tunnel_del_work(), which
> is running from the l2tp_wq workqueue.
> 
> Fixes: 2b551c6e7d5b ("l2tp: close sessions before initiating tunnel delete")
> Signed-off-by: Ridge Kennedy <ridge.kenn...@alliedtelesis.co.nz>

Applied and queued up for -stable, thanks.

Reply via email to