Re: [PATCH v9 3/7] cgroup/cpuset: Refining features and constraints of a partition

From: Michal Koutný
Date: Wed Dec 15 2021 - 09:49:50 EST


On Sun, Dec 05, 2021 at 01:32:16PM -0500, Waiman Long <longman@xxxxxxxxxx> wrote:
> @@ -1455,34 +1450,16 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)
> switch (parent->partition_root_state) {
> [...]
> -
> case PRS_ENABLED:
> - if (update_parent_subparts_cpumask(cp, partcmd_update, NULL, tmp))
> - update_tasks_cpumask(parent);
> + update_parent = true;
> [...]
> + if (update_parent) {
> + if (update_parent_subparts_cpumask(cp, partcmd_update, NULL, tmp))
> + update_tasks_cpumask(parent);
> + /*
> + * The cpuset partition_root_state may be changed
> + * to PRS_ERROR. Capture it.
> + */
> + new_prs = cp->partition_root_state;
> + }

IIUC, this ensures that when a parent becomes partition root again, this
would propagate downwards to invalidated children.

However, the documentation says:

> + Changing a partition root (valid or invalid) to "member" is
> + always allowed. If there are child partition roots underneath
> + it, they will become invalid and unrecoverable. So care must
> + be taken to double check for this condition before disabling
> + a partition root.

I.e. it suggests a child can be trapped in the unrecoverable state (i.e.
not fixable by writing into cpuset.cpus.partition).
But this does not happen, right?

Michal