User-space scheduling for system processes

This commit is contained in:
Erik van der Kouwe
2010-07-01 08:32:33 +00:00
parent b17e3adb60
commit 23284ee7bd
40 changed files with 490 additions and 1166 deletions

View File

@@ -137,7 +137,7 @@ PUBLIC void main(void)
}
else {
/* Don't let the process run for now. */
RTS_SET(rp, RTS_NO_PRIV);
RTS_SET(rp, RTS_NO_PRIV | RTS_NO_QUANTUM);
}
if (iskerneln(proc_nr)) { /* part of the kernel? */

View File

@@ -155,4 +155,8 @@ EXTERN struct priv *ppriv_addr[NR_SYS_PROCS]; /* direct slot pointers */
#define RSYS_SM ROOT_SYS_PROC_NR /* root system proc */
#define DEF_SYS_SM ROOT_SYS_PROC_NR /* default sys proc */
/* scheduler */
#define KERN_SCH KERNEL /* scheduled by kernel */
#define USER_SCH SCHED_PROC_NR /* scheduled in userland */
#endif /* PRIV_H */

View File

@@ -236,6 +236,10 @@ struct proc {
(should correspond to nice 0) */
#define MIN_USER_Q (NR_SCHED_QUEUES - 1) /* minimum priority for user
processes */
/* default scheduling quanta */
#define USER_QUANTUM 200
#define DRIV_QUANTUM 50
#define SERV_QUANTUM 500
/* Magic process table addresses. */
#define BEG_PROC_ADDR (&proc[0])

View File

@@ -86,14 +86,8 @@ PUBLIC int do_fork(struct proc * caller, message * m_ptr)
rpc->p_virt_left = 0; /* disable, clear the process-virtual timers */
rpc->p_prof_left = 0;
/*
* if the child process inherited a scheduler, the child process is not
* runnable until it's scheduled. Otherwise the default kernel policy applies.
* This is only the case of system servers, drivers and similar sensitive
* processes
*/
if (rpc->p_scheduler)
RTS_SET(rpc, RTS_NO_QUANTUM);
/* the child process is not runnable until it's scheduled. */
RTS_SET(rpc, RTS_NO_QUANTUM);
make_zero64(rpc->p_cpu_time_left);
make_zero64(rpc->p_cycles);

View File

@@ -7,17 +7,37 @@
PUBLIC int do_schedctl(struct proc * caller, message * m_ptr)
{
struct proc *p;
unsigned flags;
int proc_nr;
/* Only system processes can change process schedulers */
if (! (priv(caller)->s_flags & SYS_PROC))
return(EPERM);
if (!isokendpt(m_ptr->SCHEDULING_ENDPOINT, &proc_nr))
/* check parameter validity */
flags = (unsigned) m_ptr->SCHEDCTL_FLAGS;
if (flags & ~SCHEDCTL_FLAG_KERNEL) {
printf("do_schedctl: flags 0x%x invalid, caller=%d\n",
flags, caller - proc);
return EINVAL;
}
if (!isokendpt(m_ptr->SCHEDCTL_ENDPOINT, &proc_nr))
return EINVAL;
p = proc_addr(proc_nr);
p->p_scheduler = caller;
if ((flags & SCHEDCTL_FLAG_KERNEL) == SCHEDCTL_FLAG_KERNEL) {
/* the kernel becomes the scheduler and starts
* scheduling the process; RTS_NO_QUANTUM which was
* previously set by sys_fork is removed
*/
p->p_scheduler = NULL;
RTS_UNSET(p, RTS_NO_QUANTUM);
} else {
/* the caller becomes the scheduler */
p->p_scheduler = caller;
}
return(OK);
}

View File

@@ -69,25 +69,25 @@ PUBLIC char *t_stack[TOT_STACK_SPACE / sizeof(char *)];
*/
PUBLIC struct boot_image image[] = {
/* process nr, flags, ms, queue, stack, name */
{IDLE, 0, 0, 0, IDL_S, "idle" },
{CLOCK, 0, 0, 0, IDL_S, "clock" },
{SYSTEM, 0, 0, 0, IDL_S, "system"},
{HARDWARE, 0, 0, 0, HRD_S, "kernel"},
/* process nr, flags, ms, queue, stack, name */
{IDLE, 0, 0, 0, IDL_S, "idle" },
{CLOCK, 0, 0, 0, IDL_S, "clock" },
{SYSTEM, 0, 0, 0, IDL_S, "system"},
{HARDWARE, 0, 0, 0, HRD_S, "kernel"},
{DS_PROC_NR, BVM_F, 50, 4, 0, "ds" },
{RS_PROC_NR, 0, 50, 4, 0, "rs" },
{DS_PROC_NR, BVM_F, DRIV_QUANTUM, 4, 0, "ds" },
{RS_PROC_NR, 0, DRIV_QUANTUM, 4, 0, "rs" },
{PM_PROC_NR, OVM_F,500, 4, 0, "pm" },
{SCHED_PROC_NR,OVM_F,500, 4, 0, "sched" },
{VFS_PROC_NR, OVM_F,500, 5, 0, "vfs" },
{MEM_PROC_NR, BVM_F, 50, 3, 0, "memory"},
{LOG_PROC_NR, BVM_F, 50, 2, 0, "log" },
{TTY_PROC_NR, BVM_F, 50, 1, 0, "tty" },
{MFS_PROC_NR, BVM_F,500, 5, 0, "mfs" },
{VM_PROC_NR, 0,500, 2, 0, "vm" },
{PFS_PROC_NR, BVM_F,500, 5, 0, "pfs" },
{INIT_PROC_NR, BVM_F,200, USER_Q, 0, "init" },
{PM_PROC_NR, OVM_F, SERV_QUANTUM, 4, 0, "pm" },
{SCHED_PROC_NR,OVM_F, SERV_QUANTUM, 4, 0, "sched" },
{VFS_PROC_NR, OVM_F, SERV_QUANTUM, 5, 0, "vfs" },
{MEM_PROC_NR, BVM_F, DRIV_QUANTUM, 3, 0, "memory"},
{LOG_PROC_NR, BVM_F, DRIV_QUANTUM, 2, 0, "log" },
{TTY_PROC_NR, BVM_F, DRIV_QUANTUM, 1, 0, "tty" },
{MFS_PROC_NR, BVM_F, SERV_QUANTUM, 5, 0, "mfs" },
{VM_PROC_NR, 0, SERV_QUANTUM, 2, 0, "vm" },
{PFS_PROC_NR, BVM_F, SERV_QUANTUM, 5, 0, "pfs" },
{INIT_PROC_NR, BVM_F, USER_QUANTUM, USER_Q, 0, "init" },
};
/* Verify the size of the system image table at compile time. Also verify that