svn commit: r184075 - in stable/7/sys: . amd64/linux32 compat/linux
i386/linux
Konstantin Belousov
kib at FreeBSD.org
Mon Oct 20 11:15:58 UTC 2008
Author: kib
Date: Mon Oct 20 11:15:57 2008
New Revision: 184075
URL: http://svn.freebsd.org/changeset/base/184075
Log:
MFC r177257 (by rdivacky):
Implement sched_setaffinity and get_setaffinity using real cpu affinity
setting primitives.
MFC r177604 (by ru):
Fix build.
MFC r183612:
Use FreeBSD size of cpuset_t for bitmap size parameter and return EINVAL
if length of user space bitmap less than our size of cpuset_t.
Approved by: re (kensmith)
Modified:
stable/7/sys/ (props changed)
stable/7/sys/amd64/linux32/syscalls.master
stable/7/sys/compat/linux/linux_misc.c
stable/7/sys/i386/linux/syscalls.master
Modified: stable/7/sys/amd64/linux32/syscalls.master
==============================================================================
--- stable/7/sys/amd64/linux32/syscalls.master Mon Oct 20 10:11:33 2008 (r184074)
+++ stable/7/sys/amd64/linux32/syscalls.master Mon Oct 20 11:15:57 2008 (r184075)
@@ -407,7 +407,8 @@
239 AUE_SENDFILE UNIMPL linux_sendfile64
240 AUE_NULL STD { int linux_sys_futex(void *uaddr, int op, int val, \
struct l_timespec *timeout, void *uaddr2, int val3); }
-241 AUE_NULL UNIMPL linux_sched_setaffinity
+241 AUE_NULL STD { int linux_sched_setaffinity(l_pid_t pid, l_uint len, \
+ l_ulong *user_mask_ptr); }
242 AUE_NULL STD { int linux_sched_getaffinity(l_pid_t pid, l_uint len, \
l_ulong *user_mask_ptr); }
243 AUE_NULL STD { int linux_set_thread_area(struct l_user_desc *desc); }
Modified: stable/7/sys/compat/linux/linux_misc.c
==============================================================================
--- stable/7/sys/compat/linux/linux_misc.c Mon Oct 20 10:11:33 2008 (r184074)
+++ stable/7/sys/compat/linux/linux_misc.c Mon Oct 20 11:15:57 2008 (r184075)
@@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$");
#include <sys/vmmeter.h>
#include <sys/vnode.h>
#include <sys/wait.h>
+#include <sys/cpuset.h>
#include <security/mac/mac_framework.h>
@@ -1730,22 +1731,57 @@ linux_prctl(struct thread *td, struct li
}
/*
- * XXX: fake one.. waiting for real implementation of affinity mask.
+ * Get affinity of a process.
*/
int
linux_sched_getaffinity(struct thread *td,
struct linux_sched_getaffinity_args *args)
{
int error;
- cpumask_t i = ~0;
+ struct cpuset_getaffinity_args cga;
- if (args->len < sizeof(cpumask_t))
+#ifdef DEBUG
+ if (ldebug(sched_getaffinity))
+ printf(ARGS(sched_getaffinity, "%d, %d, *"), args->pid,
+ args->len);
+#endif
+ if (args->len < sizeof(cpuset_t))
return (EINVAL);
- error = copyout(&i, args->user_mask_ptr, sizeof(cpumask_t));
- if (error)
- return (EFAULT);
+ cga.level = CPU_LEVEL_WHICH;
+ cga.which = CPU_WHICH_PID;
+ cga.id = args->pid;
+ cga.cpusetsize = sizeof(cpuset_t);
+ cga.mask = (cpuset_t *) args->user_mask_ptr;
- td->td_retval[0] = sizeof(cpumask_t);
- return (0);
+ if ((error = cpuset_getaffinity(td, &cga)) == 0)
+ td->td_retval[0] = sizeof(cpuset_t);
+
+ return (error);
+}
+
+/*
+ * Set affinity of a process.
+ */
+int
+linux_sched_setaffinity(struct thread *td,
+ struct linux_sched_setaffinity_args *args)
+{
+ struct cpuset_setaffinity_args csa;
+
+#ifdef DEBUG
+ if (ldebug(sched_setaffinity))
+ printf(ARGS(sched_setaffinity, "%d, %d, *"), args->pid,
+ args->len);
+#endif
+ if (args->len < sizeof(cpuset_t))
+ return (EINVAL);
+
+ csa.level = CPU_LEVEL_WHICH;
+ csa.which = CPU_WHICH_PID;
+ csa.id = args->pid;
+ csa.cpusetsize = sizeof(cpuset_t);
+ csa.mask = (cpuset_t *) args->user_mask_ptr;
+
+ return (cpuset_setaffinity(td, &csa));
}
Modified: stable/7/sys/i386/linux/syscalls.master
==============================================================================
--- stable/7/sys/i386/linux/syscalls.master Mon Oct 20 10:11:33 2008 (r184074)
+++ stable/7/sys/i386/linux/syscalls.master Mon Oct 20 11:15:57 2008 (r184075)
@@ -409,7 +409,8 @@
239 AUE_SENDFILE UNIMPL linux_sendfile64
240 AUE_NULL STD { int linux_sys_futex(void *uaddr, int op, int val, \
struct l_timespec *timeout, void *uaddr2, int val3); }
-241 AUE_NULL UNIMPL linux_sched_setaffinity
+241 AUE_NULL STD { int linux_sched_setaffinity(l_pid_t pid, l_uint len, \
+ l_ulong *user_mask_ptr); }
242 AUE_NULL STD { int linux_sched_getaffinity(l_pid_t pid, l_uint len, \
l_ulong *user_mask_ptr); }
243 AUE_NULL STD { int linux_set_thread_area(struct l_user_desc *desc); }
More information about the svn-src-all
mailing list