Add usched_mastermask - a master cpu mask specifying which cpus user
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 2 Jul 2007 17:06:56 +0000 (17:06 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 2 Jul 2007 17:06:56 +0000 (17:06 +0000)
processes can run on.  Default to all cpus.

sys/kern/kern_fork.c
sys/kern/kern_usched.c
sys/sys/usched.h

index e7be5e0..2fe8b8f 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_fork.c 8.6 (Berkeley) 4/8/94
  * $FreeBSD: src/sys/kern/kern_fork.c,v 1.72.2.14 2003/06/26 04:15:10 silby Exp $
- * $DragonFly: src/sys/kern/kern_fork.c,v 1.69 2007/06/29 21:54:08 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_fork.c,v 1.70 2007/07/02 17:06:54 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -589,6 +589,7 @@ restart:
                        mycpu->gd_schedclock.periodic;
        destproc->p_usched->heuristic_forking(origlp, lp);
        crit_exit();
+       lp->lwp_cpumask &= usched_mastermask;
 
        td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, -1, 0);
        lp->lwp_thread = td;
index 08000df..24bbb77 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/kern_usched.c,v 1.8 2007/02/03 17:05:58 corecode Exp $
+ * $DragonFly: src/sys/kern/kern_usched.c,v 1.9 2007/07/02 17:06:55 dillon Exp $
  */
 
 #include <sys/errno.h>
@@ -44,6 +44,8 @@
 
 static TAILQ_HEAD(, usched) usched_list = TAILQ_HEAD_INITIALIZER(usched_list);
 
+cpumask_t usched_mastermask = -1;
+
 /*
  * Called from very low level boot code, i386/i386/machdep.c/init386().
  * We cannot do anything fancy.  no malloc's, no nothing other then 
@@ -202,6 +204,10 @@ sys_usched_set(struct usched_set_args *uap)
                error = copyin(uap->data, &cpuid, sizeof(int));
                if (error)
                        break;
+               if (cpuid < 0 || cpuid >= ncpus) {
+                       error = EFBIG;
+                       break;
+               }
                if ((smp_active_mask & (1 << cpuid)) == 0) {
                        error = EINVAL;
                        break;
@@ -216,6 +222,10 @@ sys_usched_set(struct usched_set_args *uap)
                error = copyin(uap->data, &cpuid, sizeof(int));
                if (error)
                        break;
+               if (cpuid < 0 || cpuid >= ncpus) {
+                       error = EFBIG;
+                       break;
+               }
                if (!(smp_active_mask & (1 << cpuid))) {
                        error = EINVAL;
                        break;
@@ -228,6 +238,10 @@ sys_usched_set(struct usched_set_args *uap)
                error = copyin(uap->data, &cpuid, sizeof(int));
                if (error)
                        break;
+               if (cpuid < 0 || cpuid >= ncpus) {
+                       error = EFBIG;
+                       break;
+               }
                lp = curthread->td_lwp;
                mask = lp->lwp_cpumask & smp_active_mask & ~(1 << cpuid);
                if (mask == 0)
index d61c648..c46060a 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     Userland scheduler API
  * 
- * $DragonFly: src/sys/sys/usched.h,v 1.12 2006/06/10 20:19:39 dillon Exp $
+ * $DragonFly: src/sys/sys/usched.h,v 1.13 2007/07/02 17:06:56 dillon Exp $
  */
 
 #ifndef _SYS_USCHED_H_
@@ -81,6 +81,7 @@ union usched_data {
 
 extern struct usched   usched_bsd4;
 extern struct usched   usched_dummy;
+extern cpumask_t usched_mastermask;
 
 int usched_ctl(struct usched *, int);
 struct usched *usched_init(void);