• Will Deacon's avatar
    cpuset: Call set_cpus_allowed_ptr() with appropriate mask for task · 7a2127e6
    Will Deacon authored
    set_cpus_allowed_ptr() will fail with -EINVAL if the requested
    affinity mask is not a subset of the task_cpu_possible_mask() for the
    task being updated. Consequently, on a heterogeneous system with cpusets
    spanning the different CPU types, updates to the cgroup hierarchy can
    silently fail to update task affinities when the effective affinity
    mask for the cpuset is expanded.
    
    For example, consider an arm64 system with 4 CPUs, where CPUs 2-3 are
    the only cores capable of executing 32-bit tasks. Attaching a 32-bit
    task to a cpuset containing CPUs 0-2 will correctly affine the task to
    CPU 2. Extending the cpuset to CPUs 0-3, however, will fail to extend
    the affinity mask of the 32-bit task because update_tasks_cpumask() will
    pass the full 0-3 mask to set_cpus_allowed_ptr().
    
    Extend update_tasks_cpumask() to take a temporary 'cpumask' paramater
    and use it to mask the 'effective_cpus' mask with the possible mask for
    each task being updated.
    
    Fixes: 431c69fa ("cpuset: Honour task_cpu_possible_mask() in guarantee_online_cpus()")
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    Acked-by: default avatarWaiman Long <longman@redhat.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    7a2127e6
cpuset.c 113 KB