Page MenuHomeFreeBSD

D34849.id104786.diff
No OneTemporary

D34849.id104786.diff

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);

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 8, 8:42 PM (7 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28496193
Default Alt Text
D34849.id104786.diff (4 KB)

Event Timeline