HomeFreeBSD

MFC r367944: cpuset_setproc: use the appropriate parent for new anon. sets

Description

MFC r367944: cpuset_setproc: use the appropriate parent for new anon. sets

As far as I can tell, this has been the case since initially committed in

  1. cpuset_setproc is the executor of cpuset reassignment; note this

excerpt from the description:

  • 1) Set is non-null. This reparents all anonymous sets to the provided
  • set and replaces all non-anonymous td_cpusets with the provided set.

However, reviewing cpuset_setproc_setthread() for some jail related work
unearthed the error: if tdset was not anonymous, we were replacing it with
set. If it was anonymous, then we'd rebase it onto set (i.e. copy the
thread's mask over and AND it with set) but give the new anonymous set
the original tdset as the parent (i.e. the base of the set we're supposed to
be leaving behind).

The primary visible consequences were that:

1.) cpuset_getid() following such assignment returns the wrong result, the

setid that we left behind rather than the one we joined.

2.) When a process attached to the jail, the base set of any anonymous

threads was a set outside of the jail.

This was initially bundled in D27298, but it's a minor fix that's fairly
easy to verify the correctness of.

A test is included in D27307 ("badparent"), which demonstrates the issue
with, effectively:

osetid = cpuset_getid()
newsetid = cpuset()
cpuset_setaffinity(thread)
cpuset_setid(osetid)
cpuset_getid(thread) -> observe that it matches newsetid instead of osetid.

Details

Provenance
kevansAuthored on
Parents
rS368321: MFC r368116: kern: cpuset: drop the lock to allocate domainsets
Branches
Unknown
Tags
Unknown