linux-uconsole/include/linux/sched
Eric W. Biederman ab7709b551 exec: Transform exec_update_mutex into a rw_semaphore
[ Upstream commit f7cfd871ae ]

Recently syzbot reported[0] that there is a deadlock amongst the users
of exec_update_mutex.  The problematic lock ordering found by lockdep
was:

   perf_event_open  (exec_update_mutex -> ovl_i_mutex)
   chown            (ovl_i_mutex       -> sb_writes)
   sendfile         (sb_writes         -> p->lock)
     by reading from a proc file and writing to overlayfs
   proc_pid_syscall (p->lock           -> exec_update_mutex)

While looking at possible solutions it occured to me that all of the
users and possible users involved only wanted to state of the given
process to remain the same.  They are all readers.  The only writer is
exec.

There is no reason for readers to block on each other.  So fix
this deadlock by transforming exec_update_mutex into a rw_semaphore
named exec_update_lock that only exec takes for writing.

Cc: Jann Horn <jannh@google.com>
Cc: Vasiliy Kulikov <segoon@openwall.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Bernd Edlinger <bernd.edlinger@hotmail.de>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Christopher Yeoh <cyeoh@au1.ibm.com>
Cc: Cyrill Gorcunov <gorcunov@gmail.com>
Cc: Sargun Dhillon <sargun@sargun.me>
Cc: Christian Brauner <christian.brauner@ubuntu.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Fixes: eea9673250 ("exec: Add exec_update_mutex to replace cred_guard_mutex")
[0] https://lkml.kernel.org/r/00000000000063640c05ade8e3de@google.com
Reported-by: syzbot+db9cdf3dd1f64252c6ef@syzkaller.appspotmail.com
Link: https://lkml.kernel.org/r/87ft4mbqen.fsf@x220.int.ebiederm.org
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-01-09 13:46:24 +01:00
..
autogroup.h
clock.h
coredump.h mm, oom_adj: don't loop through tasks in __set_oom_adj when not necessary 2020-10-13 18:38:35 -07:00
cpufreq.h
cputime.h
deadline.h
debug.h treewide: Convert macro and uses of __section(foo) to __section("foo") 2020-10-25 14:51:49 -07:00
hotplug.h
idle.h
init.h
isolation.h
jobctl.h
loadavg.h sched: nohz: stop passing around unused "ticks" parameter. 2020-07-22 10:22:04 +02:00
mm.h mm: kmem: prepare remote memcg charging infra for interrupt contexts 2020-10-18 09:27:09 -07:00
nohz.h
numa_balancing.h
prio.h
rt.h
sd_flags.h sched/topology: Mark SD_NUMA as SDF_NEEDS_GROUPS 2020-08-19 10:49:50 +02:00
signal.h exec: Transform exec_update_mutex into a rw_semaphore 2021-01-09 13:46:24 +01:00
smt.h
stat.h
sysctl.h sched/uclamp: Add a new sysctl to control RT default boost value 2020-07-29 13:51:47 +02:00
task.h sched: remove _do_fork() 2020-08-20 13:12:59 +02:00
task_stack.h
topology.h sched/topology: Move SD_DEGENERATE_GROUPS_MASK out of linux/sched/topology.h 2020-08-26 12:41:59 +02:00
types.h
user.h watch_queue: Limit the number of watches a user can hold 2020-08-17 09:39:18 -07:00
wake_q.h
xacct.h