svn commit: r252165 - stable/9/sys/kern
John Baldwin
jhb at FreeBSD.org
Mon Jun 24 18:27:45 UTC 2013
Author: jhb
Date: Mon Jun 24 18:27:44 2013
New Revision: 252165
URL: http://svnweb.freebsd.org/changeset/base/252165
Log:
MFC 251470:
Do not compare the existing mask of a cpuset with a new mask when changing
the mask of a cpuset. Also, change the cpuset's mask before updating the
masks of all children. Previously changing a cpuset's mask first required
setting the mask to a super-set of both the old and new masks and then
changing it a second time to the new mask.
Modified:
stable/9/sys/kern/kern_cpuset.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/kern/kern_cpuset.c
==============================================================================
--- stable/9/sys/kern/kern_cpuset.c Mon Jun 24 17:09:28 2013 (r252164)
+++ stable/9/sys/kern/kern_cpuset.c Mon Jun 24 18:27:44 2013 (r252165)
@@ -303,7 +303,7 @@ cpuset_create(struct cpuset **setp, stru
* empty as well as RDONLY flags.
*/
static int
-cpuset_testupdate(struct cpuset *set, cpuset_t *mask)
+cpuset_testupdate(struct cpuset *set, cpuset_t *mask, int check_mask)
{
struct cpuset *nset;
cpuset_t newmask;
@@ -312,13 +312,16 @@ cpuset_testupdate(struct cpuset *set, cp
mtx_assert(&cpuset_lock, MA_OWNED);
if (set->cs_flags & CPU_SET_RDONLY)
return (EPERM);
- if (!CPU_OVERLAP(&set->cs_mask, mask))
- return (EDEADLK);
- CPU_COPY(&set->cs_mask, &newmask);
- CPU_AND(&newmask, mask);
+ if (check_mask) {
+ if (!CPU_OVERLAP(&set->cs_mask, mask))
+ return (EDEADLK);
+ CPU_COPY(&set->cs_mask, &newmask);
+ CPU_AND(&newmask, mask);
+ } else
+ CPU_COPY(mask, &newmask);
error = 0;
LIST_FOREACH(nset, &set->cs_children, cs_siblings)
- if ((error = cpuset_testupdate(nset, &newmask)) != 0)
+ if ((error = cpuset_testupdate(nset, &newmask, 1)) != 0)
break;
return (error);
}
@@ -370,11 +373,11 @@ cpuset_modify(struct cpuset *set, cpuset
if (root && !CPU_SUBSET(&root->cs_mask, mask))
return (EINVAL);
mtx_lock_spin(&cpuset_lock);
- error = cpuset_testupdate(set, mask);
+ error = cpuset_testupdate(set, mask, 0);
if (error)
goto out;
- cpuset_update(set, mask);
CPU_COPY(mask, &set->cs_mask);
+ cpuset_update(set, mask);
out:
mtx_unlock_spin(&cpuset_lock);
More information about the svn-src-stable-9
mailing list