diff options
author | akolb <none@none> | 2007-03-09 15:55:28 -0800 |
---|---|---|
committer | akolb <none@none> | 2007-03-09 15:55:28 -0800 |
commit | c97ad5cdc75eb73e3cc38542ca3ba783574b0a7a (patch) | |
tree | 5ba1653d892978d87d6061c8c7f3821f4b3e354c /usr/src/uts/common/disp/thread.c | |
parent | 68d3ac02fc9db49ae9dccaecff999963114930a7 (diff) | |
download | illumos-joyent-c97ad5cdc75eb73e3cc38542ca3ba783574b0a7a.tar.gz |
PSARC/2004/402 CPU Caps
6327235 PSARC/2004/402 CPU caps
6464161 Dead KSLICE code should be removed
6514387 FX class contains dead code to keep list of member threads
6518395 kstat_zone_add performs KM_SLEEP allocation when it should not
Diffstat (limited to 'usr/src/uts/common/disp/thread.c')
-rw-r--r-- | usr/src/uts/common/disp/thread.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/usr/src/uts/common/disp/thread.c b/usr/src/uts/common/disp/thread.c index 5f352b2203..77f0663f12 100644 --- a/usr/src/uts/common/disp/thread.c +++ b/usr/src/uts/common/disp/thread.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -73,6 +73,8 @@ #include <sys/sdt.h> #include <sys/reboot.h> #include <sys/kdi.h> +#include <sys/waitq.h> +#include <sys/cpucaps.h> struct kmem_cache *thread_cache; /* cache of free threads */ struct kmem_cache *lwp_cache; /* cache of free lwps */ @@ -185,10 +187,18 @@ thread_init(void) label_init(); cred_init(); + /* + * Initialize various resource management facilities. + */ rctl_init(); + cpucaps_init(); + /* + * Zone_init() should be called before project_init() so that project ID + * for the first project is initialized correctly. + */ + zone_init(); project_init(); brand_init(); - zone_init(); task_init(); tcache_init(); pool_init(); @@ -1070,6 +1080,8 @@ setrun_locked(kthread_t *t) * Already on dispatcher queue. */ return; + } else if (t->t_state == TS_WAIT) { + waitq_setrun(t); } else if (t->t_state == TS_STOPPED) { /* * All of the sending of SIGCONT (TC_XSTART) and /proc @@ -1111,8 +1123,6 @@ setrun_locked(kthread_t *t) */ CL_SETRUN(t); } - - } void @@ -1623,7 +1633,7 @@ thread_change_epri(kthread_t *t, pri_t disp_pri) * If it's not on a queue, change the priority with * impunity. */ - if ((state & (TS_SLEEP | TS_RUN)) == 0) { + if ((state & (TS_SLEEP | TS_RUN | TS_WAIT)) == 0) { t->t_epri = disp_pri; if (state == TS_ONPROC) { @@ -1639,7 +1649,6 @@ thread_change_epri(kthread_t *t, pri_t disp_pri) * It's either on a sleep queue or a run queue. */ if (state == TS_SLEEP) { - /* * Take the thread out of its sleep queue. * Change the inherited priority. @@ -1648,6 +1657,13 @@ thread_change_epri(kthread_t *t, pri_t disp_pri) * to do this in an appropriate manner. */ SOBJ_CHANGE_EPRI(t->t_sobj_ops, t, disp_pri); + } else if (state == TS_WAIT) { + /* + * Re-enqueue a thread on the wait queue if its + * effective priority needs to change. + */ + if (disp_pri != t->t_epri) + waitq_change_pri(t, disp_pri); } else { /* * The thread is on a run queue. @@ -1682,7 +1698,7 @@ thread_change_pri(kthread_t *t, pri_t disp_pri, int front) * If it's not on a queue, change the priority with * impunity. */ - if ((state & (TS_SLEEP | TS_RUN)) == 0) { + if ((state & (TS_SLEEP | TS_RUN | TS_WAIT)) == 0) { t->t_pri = disp_pri; if (state == TS_ONPROC) { @@ -1707,6 +1723,13 @@ thread_change_pri(kthread_t *t, pri_t disp_pri, int front) */ if (disp_pri != t->t_pri) SOBJ_CHANGE_PRI(t->t_sobj_ops, t, disp_pri); + } else if (state == TS_WAIT) { + /* + * Re-enqueue a thread on the wait queue if its + * priority needs to change. + */ + if (disp_pri != t->t_pri) + waitq_change_pri(t, disp_pri); } else { /* * The thread is on a run queue. |