mirror of
https://github.com/torvalds/linux.git
synced 2026-10-23 07:11:03 +02:00
cgroup/cpuset: Call is_in_v2_mode() after acquiring cpuset_mutex in cpuset_handle_hotplug()
It is reported by sashiko that calling is_in_v2_mode() outside of
cpuset_mutex critical section in cpuset_handle_hotplug() can introduce
a TOCTOU race where cgroup hierarchy may have changed from v1 to v2 or
vice versa after is_in_v2_mode() is called leading to erroneously skip
the allocation of tmpmasks or incorrectly modify cpus_allowed masks,
resulting in cpuset state corruption. Fix that by calling is_in_v2_mode()
after acquiring the cpuset_mutex.
Fixes: b8d1b8ee93 ("cpuset: Allow v2 behavior in v1 cgroup")
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
23b1ab15ca
commit
b8eb5fd5bd
|
|
@ -4062,15 +4062,16 @@ static void cpuset_handle_hotplug(void)
|
|||
static cpumask_t new_cpus;
|
||||
static nodemask_t new_mems;
|
||||
bool cpus_updated, mems_updated;
|
||||
bool on_dfl = is_in_v2_mode();
|
||||
bool on_dfl;
|
||||
struct tmpmasks tmp, *ptmp = NULL;
|
||||
|
||||
if (on_dfl && !alloc_tmpmasks(&tmp))
|
||||
ptmp = &tmp;
|
||||
|
||||
lockdep_assert_cpus_held();
|
||||
mutex_lock(&cpuset_mutex);
|
||||
|
||||
on_dfl = is_in_v2_mode();
|
||||
if (on_dfl && !alloc_tmpmasks(&tmp))
|
||||
ptmp = &tmp;
|
||||
|
||||
/* fetch the available cpus/mems and find out which changed how */
|
||||
cpumask_copy(&new_cpus, cpu_active_mask);
|
||||
new_mems = node_states[N_MEMORY];
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user