Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Jun 2013 18:37:52 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r252167 - stable/8/sys/kern
Message-ID:  <201306241837.r5OIbqoo091981@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Mon Jun 24 18:37:52 2013
New Revision: 252167
URL: http://svnweb.freebsd.org/changeset/base/252167

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/8/sys/kern/kern_cpuset.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/kern/   (props changed)

Modified: stable/8/sys/kern/kern_cpuset.c
==============================================================================
--- stable/8/sys/kern/kern_cpuset.c	Mon Jun 24 18:30:44 2013	(r252166)
+++ stable/8/sys/kern/kern_cpuset.c	Mon Jun 24 18:37:52 2013	(r252167)
@@ -298,7 +298,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;
@@ -307,13 +307,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);
 }
@@ -365,11 +368,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);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306241837.r5OIbqoo091981>