Index: sys/kern/kern_cpuset.c =================================================================== --- sys/kern/kern_cpuset.c +++ sys/kern/kern_cpuset.c @@ -1885,27 +1885,21 @@ } int -kern_cpuset_getaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which, - id_t id, size_t cpusetsize, cpuset_t *maskp) +kern_cpuset_getaffinity_raw(struct thread *td, cpulevel_t level, cpuwhich_t which, + id_t id, cpuset_t *mask) { struct thread *ttd; struct cpuset *nset; struct cpuset *set; struct proc *p; - cpuset_t *mask; int error; - size_t size; - if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY) - return (ERANGE); error = cpuset_check_capabilities(td, level, which, id); if (error != 0) return (error); - size = cpusetsize; - mask = malloc(size, M_TEMP, M_WAITOK | M_ZERO); error = cpuset_which(which, id, &p, &ttd, &set); - if (error) - goto out; + if (error != 0) + return (error); switch (level) { case CPU_LEVEL_ROOT: case CPU_LEVEL_CPUSET: @@ -1923,8 +1917,7 @@ case CPU_WHICH_INTRHANDLER: case CPU_WHICH_ITHREAD: case CPU_WHICH_DOMAIN: - error = EINVAL; - goto out; + return (error); } if (level == CPU_LEVEL_ROOT) nset = cpuset_refroot(set); @@ -1972,9 +1965,24 @@ cpuset_rel(set); if (p) PROC_UNLOCK(p); + return (error); +} + +int +kern_cpuset_getaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which, + id_t id, size_t cpusetsize, cpuset_t *maskp) +{ + cpuset_t *mask; + size_t size; + int error; + + if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY) + return (ERANGE); + size = cpusetsize; + mask = malloc(size, M_TEMP, M_WAITOK | M_ZERO); + error = kern_cpuset_getaffinity_raw(td, level, which, id, mask); if (error == 0) error = copyout(mask, maskp, size); -out: free(mask, M_TEMP); return (error); } @@ -1997,25 +2005,19 @@ } int -kern_cpuset_setaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which, - id_t id, size_t cpusetsize, const cpuset_t *maskp) +kern_cpuset_setaffinity_raw(struct thread *td, cpulevel_t level, + cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask) { struct cpuset *nset; struct cpuset *set; struct thread *ttd; struct proc *p; - cpuset_t *mask; int error; - if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY) - return (ERANGE); error = cpuset_check_capabilities(td, level, which, id); if (error != 0) return (error); - mask = malloc(cpusetsize, M_TEMP, M_WAITOK | M_ZERO); - error = copyin(maskp, mask, cpusetsize); - if (error) - goto out; + /* * Verify that no high bits are set. */ @@ -2027,15 +2029,11 @@ end += cpusetsize; cp += sizeof(cpuset_t); while (cp != end) - if (*cp++ != 0) { - error = EINVAL; - goto out; - } - } - if (CPU_EMPTY(mask)) { - error = EDEADLK; - goto out; + if (*cp++ != 0) + return (EINVAL); } + if (CPU_EMPTY(mask)) + return (EDEADLK); switch (level) { case CPU_LEVEL_ROOT: case CPU_LEVEL_CPUSET: @@ -2057,8 +2055,7 @@ case CPU_WHICH_INTRHANDLER: case CPU_WHICH_ITHREAD: case CPU_WHICH_DOMAIN: - error = EINVAL; - goto out; + return (EINVAL); } if (level == CPU_LEVEL_ROOT) nset = cpuset_refroot(set); @@ -2098,7 +2095,23 @@ error = EINVAL; break; } -out: + return (error); +} + +int +kern_cpuset_setaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which, + id_t id, size_t cpusetsize, const cpuset_t *maskp) +{ + cpuset_t *mask; + int error; + + if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY) + return (ERANGE); + mask = malloc(cpusetsize, M_TEMP, M_WAITOK | M_ZERO); + error = copyin(maskp, mask, cpusetsize); + if (error == 0) + error = kern_cpuset_setaffinity_raw(td, level, which, + id, cpusetsize, mask); free(mask, M_TEMP); return (error); } Index: sys/sys/syscallsubr.h =================================================================== --- sys/sys/syscallsubr.h +++ sys/sys/syscallsubr.h @@ -119,9 +119,13 @@ int outfd, off_t *outoffp, size_t len, unsigned int flags); int kern_cpuset_getaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *maskp); +int kern_cpuset_getaffinity_raw(struct thread *td, cpulevel_t level, + cpuwhich_t which, id_t id, cpuset_t *mask); int kern_cpuset_setaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *maskp); +int kern_cpuset_setaffinity_raw(struct thread *td, cpulevel_t level, + cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); int kern_cpuset_getdomain(struct thread *td, cpulevel_t level, cpuwhich_t which, id_t id, size_t domainsetsize, domainset_t *maskp, int *policyp);