Module Name: src Committed By: njoly Date: Tue Jun 23 13:18:59 UTC 2009
Modified Files: src/sys/compat/linux/common: linux_sched.c Log Message: sched_getaffinity(2) update: - dynamically calculate the cpu mask size, - return it upon success, - fix generated cpu mask. To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/sys/compat/linux/common/linux_sched.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/common/linux_sched.c diff -u src/sys/compat/linux/common/linux_sched.c:1.59 src/sys/compat/linux/common/linux_sched.c:1.60 --- src/sys/compat/linux/common/linux_sched.c:1.59 Thu Jun 18 20:36:28 2009 +++ src/sys/compat/linux/common/linux_sched.c Tue Jun 23 13:18:59 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_sched.c,v 1.59 2009/06/18 20:36:28 njoly Exp $ */ +/* $NetBSD: linux_sched.c,v 1.60 2009/06/23 13:18:59 njoly Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_sched.c,v 1.59 2009/06/18 20:36:28 njoly Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_sched.c,v 1.60 2009/06/23 13:18:59 njoly Exp $"); #include <sys/param.h> #include <sys/mount.h> @@ -622,15 +622,12 @@ syscallarg(unsigned int) len; syscallarg(unsigned long *) mask; } */ - int error; - int ret; - char *data; - int *retp; - - if (SCARG(uap, mask) == NULL) - return EINVAL; + int error, size, nb = ncpu; + unsigned long *p, *data; - if (SCARG(uap, len) < sizeof(int)) + /* Unlike Linux, dynamically calculate cpu mask size */ + size = sizeof(long) * ((ncpu + LONG_BIT - 1) / LONG_BIT); + if (SCARG(uap, len) < size) return EINVAL; if (pfind(SCARG(uap, pid)) == NULL) @@ -641,14 +638,18 @@ * The result is a mask, the first CPU being in the least significant * bit. */ - ret = (1 << ncpu) - 1; - data = malloc(SCARG(uap, len), M_TEMP, M_WAITOK|M_ZERO); - retp = (int *)&data[SCARG(uap, len) - sizeof(ret)]; - *retp = ret; - - error = copyout(data, SCARG(uap, mask), SCARG(uap, len)); + data = malloc(size, M_TEMP, M_WAITOK|M_ZERO); + p = data; + while (nb > LONG_BIT) { + *p++ = ~0UL; + nb -= LONG_BIT; + } + if (nb) + *p = (1 << ncpu) - 1; + error = copyout(data, SCARG(uap, mask), size); free(data, M_TEMP); + *retval = size; return error;