sys_poke_ksched() on behalf of other processes
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 6 May 2013 01:42:47 +0000 (18:42 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 6 May 2013 01:48:41 +0000 (18:48 -0700)
So something like 'prov' can kick the ksched to make it notice the
changes faster.  It's not a huge deal, since provisions are a
fine-grained choice, but it also doesn't hurt.  And it helps with some
testing code.

No need to rebuild the cross compiler, but you do need to rebuild any
MCP app and all of parlib.

kern/include/schedule.h
kern/src/schedule.c
kern/src/syscall.c
user/parlib/include/parlib.h
user/parlib/syscall.c
user/parlib/vcore.c

index 2aee5e5..232b1bb 100644 (file)
@@ -65,7 +65,7 @@ void schedule(void);
 /* Proc p's resource desires changed, or something in general that would lead to
  * a new decision.  The process can directly poke the ksched via a syscall, so
  * be careful of abuse. */
-void poke_ksched(struct proc *p, int res_type);
+void poke_ksched(struct proc *p, unsigned int res_type);
 
 /* The calling cpu/core has nothing to do and plans to idle/halt.  This is an
  * opportunity to pick the nature of that halting (low power state, etc), or
index d76815c..a229b5d 100644 (file)
@@ -526,7 +526,7 @@ void schedule(void)
 /* A process is asking the ksched to look at its resource desires.  The
  * scheduler is free to ignore this, for its own reasons, so long as it
  * eventually gets around to looking at resource desires. */
-void poke_ksched(struct proc *p, int res_type)
+void poke_ksched(struct proc *p, unsigned int res_type)
 {
        /* ignoring res_type for now.  could post that if we wanted (would need some
         * other structs/flags) */
index 6a8b075..dd38582 100644 (file)
@@ -905,13 +905,36 @@ static int sys_change_to_m(struct proc *p)
        return retval;
 }
 
-/* Not sure what people will need.  For now, they can send in the resource they
- * want.  Up to the ksched to support this, and other things (like -1 for all
- * resources).  Might have this info go in via procdata instead. */
-static int sys_poke_ksched(struct proc *p, int res_type)
+/* Pokes the ksched for the given resource for target_pid.  If the target pid
+ * == 0, we just poke for the calling process.  The common case is poking for
+ * self, so we avoid the lookup. 
+ *
+ * Not sure if you could harm someone via asking the kernel to look at them, so
+ * we'll do a 'controls' check for now.  In the future, we might have something
+ * in the ksched that limits or penalizes excessive pokes. */
+static int sys_poke_ksched(struct proc *p, int target_pid,
+                           unsigned int res_type)
 {
-       poke_ksched(p, res_type);
-       return 0;
+       struct proc *target;
+       int retval = 0;
+       if (!target_pid) {
+               poke_ksched(p, res_type);
+               return 0;
+       }
+       target = pid2proc(target_pid);
+       if (!target) {
+               set_errno(ESRCH);
+               return -1;
+       }
+       if (!proc_controls(p, target)) {
+               set_errno(EPERM);
+               retval = -1;
+               goto out;
+       }
+       poke_ksched(target, res_type);
+out:
+       proc_decref(target);
+       return retval;
 }
 
 /************** Platform Specific Syscalls **************/
index 3e075a7..c906b99 100644 (file)
@@ -56,7 +56,7 @@ void*         sys_init_arsc();
 int         sys_block(unsigned int usec);
 int         sys_change_vcore(uint32_t vcoreid, bool enable_my_notif);
 int         sys_change_to_m(void);
-int         sys_poke_ksched(int res_type);
+int         sys_poke_ksched(int pid, unsigned int res_type);
 
 void           init_posix_signals(void);       /* in signal.c */
 #ifdef __cplusplus
index 0672623..f13f872 100644 (file)
@@ -187,7 +187,7 @@ int sys_change_to_m(void)
        return ros_syscall(SYS_change_to_m, 0, 0, 0, 0, 0, 0);
 }
 
-int sys_poke_ksched(int res_type)
+int sys_poke_ksched(int pid, unsigned int res_type)
 {
-       return ros_syscall(SYS_poke_ksched, res_type, 0, 0, 0, 0, 0);
+       return ros_syscall(SYS_poke_ksched, pid, res_type, 0, 0, 0, 0);
 }
index 3e53ea8..f2ae5cb 100644 (file)
@@ -266,7 +266,7 @@ try_handle_it:
         * races with yield, our desires may be old.  Not a big deal; any vcores
         * that pop up will just end up yielding (or get preempt messages.)  */
        if (nr_vcores_wanted > num_vcores())
-               sys_poke_ksched(RES_CORES);
+               sys_poke_ksched(0, RES_CORES);  /* 0 -> poke for ourselves */
        /* Unlock, (which lets someone else work), and check to see if more work
         * needs to be done.  If so, we'll make sure it gets handled. */
        atomic_set(&vc_req_being_handled, 0);   /* unlock, to allow others to try */