kern: cpuset: plug a unr leak
cpuset_rel_defer() is supposed to be functionally equivalent to cpuset_rel() but with anything that might sleep deferred until cpuset_rel_complete -- this setup is used specifically for cpuset_setproc. Add in the missing unr free to match cpuset_rel. This fixes a leak that was observed when I wrote a small userland application to try and debug another issue, which effectively did: cpuset(&newid); cpuset(&scratch); newid gets leaked when scratch is created; it's off the list, so there's no mechanism for anything else to relinquish it. A more realistic reproducer would likely be a process that inherits some cpuset that it's the only ref for, but it creates a new one to modify. Alternatively, administratively reassigning a process' cpuset that it's the last ref for will have the same effect. Discovered through D27498. MFC after: 1 week
This commit is contained in:
parent
95e1f42eb9
commit
9c83dab96c
@ -246,9 +246,14 @@ cpuset_rel_defer(struct setlist *head, struct cpuset *set)
|
|||||||
static void
|
static void
|
||||||
cpuset_rel_complete(struct cpuset *set)
|
cpuset_rel_complete(struct cpuset *set)
|
||||||
{
|
{
|
||||||
|
cpusetid_t id;
|
||||||
|
|
||||||
|
id = set->cs_id;
|
||||||
LIST_REMOVE(set, cs_link);
|
LIST_REMOVE(set, cs_link);
|
||||||
cpuset_rel(set->cs_parent);
|
cpuset_rel(set->cs_parent);
|
||||||
uma_zfree(cpuset_zone, set);
|
uma_zfree(cpuset_zone, set);
|
||||||
|
if (id != CPUSET_INVALID)
|
||||||
|
free_unr(cpuset_unr, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user