Files
linux/include/net
Cong Wang f75a2804da xfrm: destroy xfrm_state synchronously on net exit path
xfrm_state_put() moves struct xfrm_state to the GC list
and schedules the GC work to clean it up. On net exit call
path, xfrm_state_flush() is called to clean up and
xfrm_flush_gc() is called to wait for the GC work to complete
before exit.

However, this doesn't work because one of the ->destructor(),
ipcomp_destroy(), schedules the same GC work again inside
the GC work. It is hard to wait for such a nested async
callback. This is also why syzbot still reports the following
warning:

 WARNING: CPU: 1 PID: 33 at net/ipv6/xfrm6_tunnel.c:351 xfrm6_tunnel_net_exit+0x2cb/0x500 net/ipv6/xfrm6_tunnel.c:351
 ...
  ops_exit_list.isra.0+0xb0/0x160 net/core/net_namespace.c:153
  cleanup_net+0x51d/0xb10 net/core/net_namespace.c:551
  process_one_work+0xd0c/0x1ce0 kernel/workqueue.c:2153
  worker_thread+0x143/0x14a0 kernel/workqueue.c:2296
  kthread+0x357/0x430 kernel/kthread.c:246
  ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:352

In fact, it is perfectly fine to bypass GC and destroy xfrm_state
synchronously on net exit call path, because it is in process context
and doesn't need a work struct to do any blocking work.

This patch introduces xfrm_state_put_sync() which simply bypasses
GC, and lets its callers to decide whether to use this synchronous
version. On net exit path, xfrm_state_fini() and
xfrm6_tunnel_net_exit() use it. And, as ipcomp_destroy() itself is
blocking, it can use xfrm_state_put_sync() directly too.

Also rename xfrm_state_gc_destroy() to ___xfrm_state_destroy() to
reflect this change.

Fixes: b48c05ab5d ("xfrm: Fix warning in xfrm6_tunnel_net_exit.")
Reported-and-tested-by: syzbot+e9aebef558e3ed673934@syzkaller.appspotmail.com
Cc: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
2019-02-05 06:29:20 +01:00
..
2018-09-08 01:39:47 +09:00
2018-01-19 14:02:12 -05:00
2018-09-18 19:55:01 -07:00
2018-12-10 15:54:34 -08:00
2018-10-31 12:37:12 -07:00
2019-01-23 11:18:00 -08:00
2018-09-26 20:22:19 -07:00
2018-07-30 09:10:25 -07:00
2016-07-08 12:20:57 +02:00
2016-04-25 16:44:27 -04:00
2016-04-25 16:44:27 -04:00
2018-02-28 11:43:28 -05:00
2018-04-23 10:21:24 -04:00
2017-10-11 09:49:34 +02:00
2018-11-07 23:00:23 -08:00
2017-12-11 14:10:06 -05:00
2018-11-07 16:23:05 -08:00
2016-08-17 19:36:23 -04:00
2018-09-13 09:04:58 -07:00
2016-10-03 02:00:22 -04:00
2018-04-07 22:32:31 -04:00
2016-07-08 12:20:57 +02:00
2017-11-08 16:12:33 +09:00
2018-09-25 20:17:35 -07:00
2017-12-05 14:37:13 -05:00
2018-05-16 07:23:35 +02:00
2018-06-22 13:43:27 +09:00
2018-12-20 16:56:04 -08:00
2019-01-01 09:47:59 -08:00
2018-12-07 12:59:08 -08:00
2018-08-29 12:25:53 -07:00