----- On Feb 19, 2020, at 11:12 AM, Tejun Heo tj@xxxxxxxxxx wrote: > On Wed, Feb 19, 2020 at 11:08:39AM -0500, Mathieu Desnoyers wrote: >> I wonder if applying the online cpu masks to the per-thread affinity mask >> is the correct approach ? I suspect what we may be looking for here is to keep > > Oh, the whole thing is wrong. > >> the affinity mask independent of cpu hotplug, and look-up both the per-thread >> affinity mask and the online cpu mask whenever the scheduler needs to perform >> "is_cpu_allowed()" to check task placement. > > Yes, that's what it should have done from the get-go. The way it's > implemented now, maybe we can avoid some specific cases like cpuset > not being used at all but it'll constantly get in the way if you're > expecting thread affinity to retain its value across offlines. Looking into solving this, one key issue seems to get in the way: cpuset appear to care about not allowing to create a cpuset which has no currently active CPU where to run, e.g.: # it is forbidden to create an empty cpuset if the cpu is offlined first: mkdir /sys/fs/cgroup/cpuset/test echo 2 > /sys/fs/cgroup/cpuset/test/cpusets.cpus cat /sys/fs/cgroup/cpuset/test/cpusets.cpu 2 echo 0 > /sys/devices/system/cpu/cpu1/online echo 1 > /sys/fs/cgroup/cpuset/test/cpuset.cpus bash: echo: write error: Invalid argument cat /sys/fs/cgroup/cpuset/test/cpusets.cpu 2 # but it's perfectly fine to generate this empty cpuset by offlining # a cpu _after_ creating the cpuset: echo 0 > /sys/devices/system/cpu/cpu2/online cat /sys/fs/cgroup/cpuset/test/cpusets.cpu <----- empty (nothing) Some further testing seems to show that tasks belonging to that empty cpuset are placed anywhere on active cpus. Clearly, there is an intent that cpusets take the active mask into account to prohibit creating an empty cpuset, but nothing prevents cpu hotplug from creating an empty cpuset. I wonder how to solve this inconsistency ? Thanks, Mathieu -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com