Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144324704
D34849.id104786.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D34849.id104786.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D34849: Use Linux semantics for the thread affinity syscalls.
Attached
Detach File
Event Timeline
Log In to Comment