Author: jhb
Date: Thu Jun  6 14:43:19 2013
New Revision: 251470
URL: http://svnweb.freebsd.org/changeset/base/251470

Log:
  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:
  head/sys/kern/kern_cpuset.c

Modified: head/sys/kern/kern_cpuset.c
==============================================================================
--- head/sys/kern/kern_cpuset.c Thu Jun  6 13:47:36 2013        (r251469)
+++ head/sys/kern/kern_cpuset.c Thu Jun  6 14:43:19 2013        (r251470)
@@ -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);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to