Qian Cai d22cc7f67d locking/percpu-rwsem: Fix a task_struct refcount
The following commit:

  7f26482a872c ("locking/percpu-rwsem: Remove the embedded rwsem")

introduced task_struct memory leaks due to messing up the task_struct
refcount.

At the beginning of percpu_rwsem_wake_function(), it calls get_task_struct(),
but if the trylock failed, it will remain in the waitqueue. However, it
will run percpu_rwsem_wake_function() again with get_task_struct() to
increase the refcount but then only call put_task_struct() once the trylock
succeeded.

Fix it by adjusting percpu_rwsem_wake_function() a bit to guard against
when percpu_rwsem_wait() observing !private, terminating the wait and
doing a quick exit() while percpu_rwsem_wake_function() then doing
wake_up_process(p) as a use-after-free.

Fixes: 7f26482a872c ("locking/percpu-rwsem: Remove the embedded rwsem")
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Qian Cai <cai@lca.pw>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/20200330213002.2374-1-cai@lca.pw
2020-04-08 12:05:06 +02:00
..
2020-04-03 13:12:26 -07:00
2020-04-04 10:12:47 -07:00
2020-03-30 19:14:28 -07:00
2019-11-27 11:42:01 -08:00
2020-04-05 10:36:18 -07:00
2019-12-18 18:07:31 +01:00
\n
2020-04-06 08:58:42 -07:00
2020-03-31 15:04:17 -07:00
2020-03-30 18:06:39 -07:00
2020-03-21 16:00:24 +01:00
2019-12-04 19:44:14 -08:00
2020-01-08 16:32:55 +00:00
2020-03-21 18:56:06 -07:00
2020-01-14 12:20:48 +01:00
2019-12-04 15:18:39 +01:00
2020-03-30 18:06:39 -07:00
2019-12-18 18:07:31 +01:00
2019-07-08 19:36:47 -07:00
2019-07-08 19:36:47 -07:00