summaryrefslogtreecommitdiff
path: root/sys/kern/kern_cpuset.c
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-02-05 20:03:05 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-02-05 20:03:05 +0000
commitf9edb08480901b8c7d85837d72f8702008b0a773 (patch)
treec04feb833accf3797a2818bf289559ef157195a4 /sys/kern/kern_cpuset.c
parent899ca3d65f2b5e1cdf4d563783c61ebcff0862cf (diff)
parent9ad221a558f813645e352036ee2445903d9a9b6f (diff)
Notes
Diffstat (limited to 'sys/kern/kern_cpuset.c')
-rw-r--r--sys/kern/kern_cpuset.c71
1 files changed, 43 insertions, 28 deletions
diff --git a/sys/kern/kern_cpuset.c b/sys/kern/kern_cpuset.c
index a78b6840abaf..409aeed7e693 100644
--- a/sys/kern/kern_cpuset.c
+++ b/sys/kern/kern_cpuset.c
@@ -1078,6 +1078,15 @@ struct cpuset_getaffinity_args {
int
sys_cpuset_getaffinity(struct thread *td, struct cpuset_getaffinity_args *uap)
{
+
+ return (kern_cpuset_getaffinity(td, uap->level, uap->which,
+ uap->id, uap->cpusetsize, uap->mask));
+}
+
+int
+kern_cpuset_getaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which,
+ id_t id, size_t cpusetsize, cpuset_t *maskp)
+{
struct thread *ttd;
struct cpuset *nset;
struct cpuset *set;
@@ -1086,18 +1095,17 @@ sys_cpuset_getaffinity(struct thread *td, struct cpuset_getaffinity_args *uap)
int error;
size_t size;
- if (uap->cpusetsize < sizeof(cpuset_t) ||
- uap->cpusetsize > CPU_MAXSIZE / NBBY)
+ if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY)
return (ERANGE);
- size = uap->cpusetsize;
+ size = cpusetsize;
mask = malloc(size, M_TEMP, M_WAITOK | M_ZERO);
- error = cpuset_which(uap->which, uap->id, &p, &ttd, &set);
+ error = cpuset_which(which, id, &p, &ttd, &set);
if (error)
goto out;
- switch (uap->level) {
+ switch (level) {
case CPU_LEVEL_ROOT:
case CPU_LEVEL_CPUSET:
- switch (uap->which) {
+ switch (which) {
case CPU_WHICH_TID:
case CPU_WHICH_PID:
thread_lock(ttd);
@@ -1112,7 +1120,7 @@ sys_cpuset_getaffinity(struct thread *td, struct cpuset_getaffinity_args *uap)
error = EINVAL;
goto out;
}
- if (uap->level == CPU_LEVEL_ROOT)
+ if (level == CPU_LEVEL_ROOT)
nset = cpuset_refroot(set);
else
nset = cpuset_refbase(set);
@@ -1120,7 +1128,7 @@ sys_cpuset_getaffinity(struct thread *td, struct cpuset_getaffinity_args *uap)
cpuset_rel(nset);
break;
case CPU_LEVEL_WHICH:
- switch (uap->which) {
+ switch (which) {
case CPU_WHICH_TID:
thread_lock(ttd);
CPU_COPY(&ttd->td_cpuset->cs_mask, mask);
@@ -1138,13 +1146,13 @@ sys_cpuset_getaffinity(struct thread *td, struct cpuset_getaffinity_args *uap)
CPU_COPY(&set->cs_mask, mask);
break;
case CPU_WHICH_IRQ:
- error = intr_getaffinity(uap->id, mask);
+ error = intr_getaffinity(id, mask);
break;
case CPU_WHICH_DOMAIN:
- if (uap->id < 0 || uap->id >= MAXMEMDOM)
+ if (id < 0 || id >= MAXMEMDOM)
error = ESRCH;
else
- CPU_COPY(&cpuset_domain[uap->id], mask);
+ CPU_COPY(&cpuset_domain[id], mask);
break;
}
break;
@@ -1157,7 +1165,7 @@ sys_cpuset_getaffinity(struct thread *td, struct cpuset_getaffinity_args *uap)
if (p)
PROC_UNLOCK(p);
if (error == 0)
- error = copyout(mask, uap->mask, size);
+ error = copyout(mask, maskp, size);
out:
free(mask, M_TEMP);
return (error);
@@ -1175,6 +1183,15 @@ struct cpuset_setaffinity_args {
int
sys_cpuset_setaffinity(struct thread *td, struct cpuset_setaffinity_args *uap)
{
+
+ return (kern_cpuset_setaffinity(td, uap->level, uap->which,
+ uap->id, uap->cpusetsize, uap->mask));
+}
+
+int
+kern_cpuset_setaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which,
+ id_t id, size_t cpusetsize, const cpuset_t *maskp)
+{
struct cpuset *nset;
struct cpuset *set;
struct thread *ttd;
@@ -1182,22 +1199,21 @@ sys_cpuset_setaffinity(struct thread *td, struct cpuset_setaffinity_args *uap)
cpuset_t *mask;
int error;
- if (uap->cpusetsize < sizeof(cpuset_t) ||
- uap->cpusetsize > CPU_MAXSIZE / NBBY)
+ if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY)
return (ERANGE);
- mask = malloc(uap->cpusetsize, M_TEMP, M_WAITOK | M_ZERO);
- error = copyin(uap->mask, mask, uap->cpusetsize);
+ 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.
*/
- if (uap->cpusetsize > sizeof(cpuset_t)) {
+ if (cpusetsize > sizeof(cpuset_t)) {
char *end;
char *cp;
end = cp = (char *)&mask->__bits;
- end += uap->cpusetsize;
+ end += cpusetsize;
cp += sizeof(cpuset_t);
while (cp != end)
if (*cp++ != 0) {
@@ -1206,13 +1222,13 @@ sys_cpuset_setaffinity(struct thread *td, struct cpuset_setaffinity_args *uap)
}
}
- switch (uap->level) {
+ switch (level) {
case CPU_LEVEL_ROOT:
case CPU_LEVEL_CPUSET:
- error = cpuset_which(uap->which, uap->id, &p, &ttd, &set);
+ error = cpuset_which(which, id, &p, &ttd, &set);
if (error)
break;
- switch (uap->which) {
+ switch (which) {
case CPU_WHICH_TID:
case CPU_WHICH_PID:
thread_lock(ttd);
@@ -1228,7 +1244,7 @@ sys_cpuset_setaffinity(struct thread *td, struct cpuset_setaffinity_args *uap)
error = EINVAL;
goto out;
}
- if (uap->level == CPU_LEVEL_ROOT)
+ if (level == CPU_LEVEL_ROOT)
nset = cpuset_refroot(set);
else
nset = cpuset_refbase(set);
@@ -1237,24 +1253,23 @@ sys_cpuset_setaffinity(struct thread *td, struct cpuset_setaffinity_args *uap)
cpuset_rel(set);
break;
case CPU_LEVEL_WHICH:
- switch (uap->which) {
+ switch (which) {
case CPU_WHICH_TID:
- error = cpuset_setthread(uap->id, mask);
+ error = cpuset_setthread(id, mask);
break;
case CPU_WHICH_PID:
- error = cpuset_setproc(uap->id, NULL, mask);
+ error = cpuset_setproc(id, NULL, mask);
break;
case CPU_WHICH_CPUSET:
case CPU_WHICH_JAIL:
- error = cpuset_which(uap->which, uap->id, &p,
- &ttd, &set);
+ error = cpuset_which(which, id, &p, &ttd, &set);
if (error == 0) {
error = cpuset_modify(set, mask);
cpuset_rel(set);
}
break;
case CPU_WHICH_IRQ:
- error = intr_setaffinity(uap->id, mask);
+ error = intr_setaffinity(id, mask);
break;
default:
error = EINVAL;