svn commit: r327713 - user/jeff/numa/sys/kern

Jeff Roberson jeff at FreeBSD.org
Tue Jan 9 01:41:07 UTC 2018


Author: jeff
Date: Tue Jan  9 01:41:06 2018
New Revision: 327713
URL: https://svnweb.freebsd.org/changeset/base/327713

Log:
  Simplify cpuset_getdomain()
  Correctly limit restricting sets of preferred policies.

Modified:
  user/jeff/numa/sys/kern/kern_cpuset.c

Modified: user/jeff/numa/sys/kern/kern_cpuset.c
==============================================================================
--- user/jeff/numa/sys/kern/kern_cpuset.c	Tue Jan  9 00:27:02 2018	(r327712)
+++ user/jeff/numa/sys/kern/kern_cpuset.c	Tue Jan  9 01:41:06 2018	(r327713)
@@ -426,6 +426,15 @@ domainset_valid(const struct domainset *parent, const 
 	return (DOMAINSET_ISSET(child->ds_prefer, &parent->ds_mask));
 }
 
+static int
+domainset_restrict(const struct domainset *parent,
+    const struct domainset *child)
+{
+	if (child->ds_policy != DOMAINSET_POLICY_PREFER)
+		return (DOMAINSET_OVERLAP(&parent->ds_mask, &child->ds_mask));
+	return (DOMAINSET_ISSET(child->ds_prefer, &parent->ds_mask));
+}
+
 /*
  * Lookup or create a domainset.  The key is provided in ds_mask and
  * ds_policy.  If the domainset does not yet exist the storage in
@@ -635,7 +644,7 @@ cpuset_testupdate_domain(struct cpuset *set, struct do
 	domain = set->cs_domain;
 	domainset_copy(domain, &newset);
 	if (!domainset_equal(domain, orig)) {
-		if (!DOMAINSET_OVERLAP(&domain->ds_mask, &dset->ds_mask))
+		if (!domainset_restrict(domain, dset))
 			return (EDEADLK);
 		DOMAINSET_AND(&newset.ds_mask, &dset->ds_mask);
 		/* Count the number of domains that are changing. */
@@ -1867,7 +1876,6 @@ kern_cpuset_getdomain(struct thread *td, cpulevel_t le
 	struct proc *p;
 	domainset_t *mask;
 	int error;
-	size_t size;
 
 	if (domainsetsize < sizeof(domainset_t) ||
 	    domainsetsize > DOMAINSET_MAXSIZE / NBBY)
@@ -1881,8 +1889,7 @@ kern_cpuset_getdomain(struct thread *td, cpulevel_t le
 	    if (id != -1)
 		return (ECAPMODE);
 	}
-	size = domainsetsize;
-	mask = malloc(size, M_TEMP, M_WAITOK | M_ZERO);
+	mask = malloc(domainsetsize, M_TEMP, M_WAITOK | M_ZERO);
 	bzero(&outset, sizeof(outset));
 	error = cpuset_which(which, id, &p, &ttd, &set);
 	if (error)
@@ -1911,7 +1918,6 @@ kern_cpuset_getdomain(struct thread *td, cpulevel_t le
 			nset = cpuset_refroot(set);
 		else
 			nset = cpuset_refbase(set);
-		/* Fetch once for a coherent result. */
 		domainset_copy(nset->cs_domain, &outset);
 		cpuset_rel(nset);
 		break;
@@ -1919,7 +1925,6 @@ kern_cpuset_getdomain(struct thread *td, cpulevel_t le
 		switch (which) {
 		case CPU_WHICH_TID:
 			thread_lock(ttd);
-			/* Fetch once for a coherent result. */
 			domainset_copy(ttd->td_cpuset->cs_domain, &outset);
 			thread_unlock(ttd);
 			break;
@@ -1965,13 +1970,13 @@ kern_cpuset_getdomain(struct thread *td, cpulevel_t le
 	}
 	DOMAINSET_COPY(&outset.ds_mask, mask);
 	if (error == 0)
-		error = copyout(mask, maskp, size);
+		error = copyout(mask, maskp, domainsetsize);
 	if (error == 0)
-		error = copyout(&outset.ds_policy, policyp, sizeof(*policyp));
+		error = copyout(&outset.ds_policy, policyp,
+		    sizeof(outset.ds_policy));
 out:
 	free(mask, M_TEMP);
 	return (error);
-	return 0;
 }
 
 #ifndef _SYS_SYSPROTO_H_


More information about the svn-src-user mailing list