On 2016/1/1 20:09, Chen Yu wrote:[Yu] Ah, I see, we were just a little confused with it before.
Commit be4c9dd7aee5 ("cpuset: enable onlined cpu/node in effective
masks") leverages cpuset's cpus_allowed and its parent's
effective_cpus to calculate the new_cpus by:
cpumask_and(&new_cpus, cs->cpus_allowed,
parent_cs(cs)->effective_cpus);
However cpus_allowed will also be updated after the CPU is offline, in
hotplug_update_tasks_legacy, so when the CPU is online again, it will
use the old cpus_allowed mask to calculate the new_cpus, thus new_cpus
will get incorrect value after each round of offline/online.
This problem is found on ubuntu 15.10 with cpuset mounted:
1. echo 0 > /sys/devices/system/cpu/cpu2/online
2. echo 1 > /sys/devices/system/cpu/cpu2/online
3. cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-3
4. cat /sys/fs/cgroup/cpuset/user.slice/cpuset.cpus
0-1,3
5. taskset -c 2 ls
taskset: failed to set pid 0's affinity: Invalid argument
This is the expected behavior...In legacy hierachy onlining an offlined cpu
won't restore cpuset configurations automatically.
So if we want to online an offlined cpu in legacy hierarchy, we
should not only echo 1 to 'online' sysfs, but also restore the mask manually?
It seems that we should not rely on /sys/devices/system/cpu/cpu2/online,
if cpuset has been mounted.