"idle priority" support. Based on code from Henrik Vestergaard Draboel,
but substantially rewritten by me.
This commit is contained in:
parent
723ff3e087
commit
7216391e49
|
@ -33,7 +33,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: swtch.s,v 1.13 1994/09/02 05:58:51 davidg Exp $
|
||||
* $Id: swtch.s,v 1.14 1994/10/01 02:56:03 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* for NNPX */
|
||||
|
@ -59,10 +59,11 @@
|
|||
* queues.
|
||||
*/
|
||||
.data
|
||||
.globl _curpcb, _whichqs, _whichrtqs
|
||||
.globl _curpcb, _whichqs, _whichrtqs, _whichidqs
|
||||
_curpcb: .long 0 /* pointer to curproc's PCB area */
|
||||
_whichqs: .long 0 /* which run queues have data */
|
||||
_whichrtqs: .long 0 /* which realtime run queues have data */
|
||||
_whichidqs: .long 0 /* which idletime run queues have data */
|
||||
|
||||
.globl _qs,_cnt,_panic
|
||||
.comm _noproc,4
|
||||
|
@ -84,10 +85,15 @@ ENTRY(setrunqueue)
|
|||
pushl $set2
|
||||
call _panic
|
||||
set1:
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je set1_nort
|
||||
cmpw $RTP_PRIO_NORMAL,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
je set_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
movzwl P_RTPRIO_PRIO(%eax),%edx
|
||||
|
||||
cmpw $RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* realtime priority? */
|
||||
jne set_id /* must be idle priority */
|
||||
|
||||
set_rt:
|
||||
btsl %edx,_whichrtqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_rtqs,%edx /* locate q hdr */
|
||||
|
@ -97,7 +103,19 @@ set1:
|
|||
movl %eax,P_BACK(%edx)
|
||||
movl %eax,P_FORW(%ecx)
|
||||
ret
|
||||
set1_nort:
|
||||
|
||||
set_id:
|
||||
btsl %edx,_whichidqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_idqs,%edx /* locate q hdr */
|
||||
movl %edx,P_FORW(%eax) /* link process on tail of q */
|
||||
movl P_BACK(%edx),%ecx
|
||||
movl %ecx,P_BACK(%eax)
|
||||
movl %eax,P_BACK(%edx)
|
||||
movl %eax,P_FORW(%ecx)
|
||||
ret
|
||||
|
||||
set_nort: /* Normal (RTOFF) code */
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btsl %edx,_whichqs /* set q full bit */
|
||||
|
@ -119,13 +137,17 @@ set2: .asciz "setrunqueue"
|
|||
*/
|
||||
ENTRY(remrq)
|
||||
movl 4(%esp),%eax
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
cmpw $RTP_PRIO_NORMAL,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
je rem_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
movzwl P_RTPRIO_PRIO(%eax),%edx
|
||||
|
||||
cmpw $RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
jne rem_id
|
||||
|
||||
btrl %edx,_whichrtqs /* clear full bit, panic if clear already */
|
||||
jb rem1rt
|
||||
pushl $rem3
|
||||
pushl $rem3rt
|
||||
call _panic
|
||||
rem1rt:
|
||||
pushl %edx
|
||||
|
@ -146,6 +168,31 @@ rem1rt:
|
|||
rem2rt:
|
||||
movl $0,P_BACK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
rem_id:
|
||||
btrl %edx,_whichidqs /* clear full bit, panic if clear already */
|
||||
jb rem1id
|
||||
pushl $rem3id
|
||||
call _panic
|
||||
rem1id:
|
||||
pushl %edx
|
||||
movl P_FORW(%eax),%ecx /* unlink process */
|
||||
movl P_BACK(%eax),%edx
|
||||
movl %edx,P_BACK(%ecx)
|
||||
movl P_BACK(%eax),%ecx
|
||||
movl P_FORW(%eax),%edx
|
||||
movl %edx,P_FORW(%ecx)
|
||||
popl %edx
|
||||
movl $_idqs,%ecx
|
||||
shll $3,%edx
|
||||
addl %edx,%ecx
|
||||
cmpl P_FORW(%ecx),%ecx /* q still has something? */
|
||||
je rem2id
|
||||
shrl $3,%edx /* yes, set bit as still full */
|
||||
btsl %edx,_whichidqs
|
||||
rem2id:
|
||||
movl $0,P_BACK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
|
||||
rem_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
|
@ -174,6 +221,8 @@ rem2:
|
|||
ret
|
||||
|
||||
rem3: .asciz "remrq"
|
||||
rem3rt: .asciz "remrq.rt"
|
||||
rem3id: .asciz "remrq.id"
|
||||
sw0: .asciz "cpu_switch"
|
||||
|
||||
/*
|
||||
|
@ -200,10 +249,12 @@ _idle:
|
|||
ALIGN_TEXT
|
||||
idle_loop:
|
||||
cli
|
||||
cmpl $0,_whichrtqs
|
||||
cmpl $0,_whichrtqs /* real-time queue */
|
||||
jne sw1a
|
||||
cmpl $0,_whichqs
|
||||
cmpl $0,_whichqs /* normal queue */
|
||||
jne nortqr
|
||||
cmpl $0,_whichidqs /* 'idle' queue */
|
||||
jne idqr
|
||||
#ifdef APM
|
||||
call _apm_cpu_idle
|
||||
call _apm_cpu_busy
|
||||
|
@ -269,7 +320,6 @@ sw1a:
|
|||
testl %edi,%edi
|
||||
jz nortqr /* no realtime procs */
|
||||
|
||||
rt2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz nortqr /* no proc on rt q - try normal ... */
|
||||
|
@ -298,12 +348,13 @@ rt3:
|
|||
jmp swtch_com
|
||||
|
||||
/* old sw1a */
|
||||
/* Normal process priority's */
|
||||
nortqr:
|
||||
movl _whichqs,%edi
|
||||
2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz _idle /* if none, idle */
|
||||
jz idqr /* if none, idle */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %ebx,%edi /* clear q full status */
|
||||
|
@ -326,6 +377,36 @@ nortqr:
|
|||
btsl %ebx,%edi /* nope, set to indicate not empty */
|
||||
3:
|
||||
movl %edi,_whichqs /* update q status */
|
||||
jmp swtch_com
|
||||
|
||||
idqr: /* was sw1a */
|
||||
movl _whichidqs,%edi /* pick next p. from idqs */
|
||||
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz _idle /* no proc, idle */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %ebx,%edi /* clear q full status */
|
||||
leal _idqs(,%ebx,8),%eax /* select q */
|
||||
movl %eax,%esi
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
cmpl P_FORW(%eax),%eax /* linked to self? (e.g. not on list) */
|
||||
je badsw /* not possible */
|
||||
#endif
|
||||
|
||||
movl P_FORW(%eax),%ecx /* unlink from front of process q */
|
||||
movl P_FORW(%ecx),%edx
|
||||
movl %edx,P_FORW(%eax)
|
||||
movl P_BACK(%ecx),%eax
|
||||
movl %eax,P_BACK(%edx)
|
||||
|
||||
cmpl P_FORW(%ecx),%esi /* q empty */
|
||||
je id3
|
||||
btsl %ebx,%edi /* nope, set to indicate not empty */
|
||||
id3:
|
||||
movl %edi,_whichidqs /* update q status */
|
||||
|
||||
swtch_com:
|
||||
movl $0,%eax
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
|
||||
* $Id: genassym.c,v 1.11 1994/09/12 11:38:03 davidg Exp $
|
||||
* $Id: genassym.c,v 1.12 1994/10/02 01:28:38 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -78,7 +78,8 @@ main()
|
|||
printf("#define\tVM_PMAP %d\n", &vms->vm_pmap);
|
||||
printf("#define\tP_ADDR %d\n", &p->p_addr);
|
||||
printf("#define\tP_PRI %d\n", &p->p_priority);
|
||||
printf("#define\tP_RTPRIO %d\n", &p->p_rtprio);
|
||||
printf("#define\tP_RTPRIO_TYPE %d\n", &p->p_rtprio.type);
|
||||
printf("#define\tP_RTPRIO_PRIO %d\n", &p->p_rtprio.prio);
|
||||
printf("#define\tP_STAT %d\n", &p->p_stat);
|
||||
printf("#define\tP_WCHAN %d\n", &p->p_wchan);
|
||||
printf("#define\tP_FLAG %d\n", &p->p_flag);
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: swtch.s,v 1.13 1994/09/02 05:58:51 davidg Exp $
|
||||
* $Id: swtch.s,v 1.14 1994/10/01 02:56:03 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* for NNPX */
|
||||
|
@ -59,10 +59,11 @@
|
|||
* queues.
|
||||
*/
|
||||
.data
|
||||
.globl _curpcb, _whichqs, _whichrtqs
|
||||
.globl _curpcb, _whichqs, _whichrtqs, _whichidqs
|
||||
_curpcb: .long 0 /* pointer to curproc's PCB area */
|
||||
_whichqs: .long 0 /* which run queues have data */
|
||||
_whichrtqs: .long 0 /* which realtime run queues have data */
|
||||
_whichidqs: .long 0 /* which idletime run queues have data */
|
||||
|
||||
.globl _qs,_cnt,_panic
|
||||
.comm _noproc,4
|
||||
|
@ -84,10 +85,15 @@ ENTRY(setrunqueue)
|
|||
pushl $set2
|
||||
call _panic
|
||||
set1:
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je set1_nort
|
||||
cmpw $RTP_PRIO_NORMAL,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
je set_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
movzwl P_RTPRIO_PRIO(%eax),%edx
|
||||
|
||||
cmpw $RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* realtime priority? */
|
||||
jne set_id /* must be idle priority */
|
||||
|
||||
set_rt:
|
||||
btsl %edx,_whichrtqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_rtqs,%edx /* locate q hdr */
|
||||
|
@ -97,7 +103,19 @@ set1:
|
|||
movl %eax,P_BACK(%edx)
|
||||
movl %eax,P_FORW(%ecx)
|
||||
ret
|
||||
set1_nort:
|
||||
|
||||
set_id:
|
||||
btsl %edx,_whichidqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_idqs,%edx /* locate q hdr */
|
||||
movl %edx,P_FORW(%eax) /* link process on tail of q */
|
||||
movl P_BACK(%edx),%ecx
|
||||
movl %ecx,P_BACK(%eax)
|
||||
movl %eax,P_BACK(%edx)
|
||||
movl %eax,P_FORW(%ecx)
|
||||
ret
|
||||
|
||||
set_nort: /* Normal (RTOFF) code */
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btsl %edx,_whichqs /* set q full bit */
|
||||
|
@ -119,13 +137,17 @@ set2: .asciz "setrunqueue"
|
|||
*/
|
||||
ENTRY(remrq)
|
||||
movl 4(%esp),%eax
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
cmpw $RTP_PRIO_NORMAL,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
je rem_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
movzwl P_RTPRIO_PRIO(%eax),%edx
|
||||
|
||||
cmpw $RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
jne rem_id
|
||||
|
||||
btrl %edx,_whichrtqs /* clear full bit, panic if clear already */
|
||||
jb rem1rt
|
||||
pushl $rem3
|
||||
pushl $rem3rt
|
||||
call _panic
|
||||
rem1rt:
|
||||
pushl %edx
|
||||
|
@ -146,6 +168,31 @@ rem1rt:
|
|||
rem2rt:
|
||||
movl $0,P_BACK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
rem_id:
|
||||
btrl %edx,_whichidqs /* clear full bit, panic if clear already */
|
||||
jb rem1id
|
||||
pushl $rem3id
|
||||
call _panic
|
||||
rem1id:
|
||||
pushl %edx
|
||||
movl P_FORW(%eax),%ecx /* unlink process */
|
||||
movl P_BACK(%eax),%edx
|
||||
movl %edx,P_BACK(%ecx)
|
||||
movl P_BACK(%eax),%ecx
|
||||
movl P_FORW(%eax),%edx
|
||||
movl %edx,P_FORW(%ecx)
|
||||
popl %edx
|
||||
movl $_idqs,%ecx
|
||||
shll $3,%edx
|
||||
addl %edx,%ecx
|
||||
cmpl P_FORW(%ecx),%ecx /* q still has something? */
|
||||
je rem2id
|
||||
shrl $3,%edx /* yes, set bit as still full */
|
||||
btsl %edx,_whichidqs
|
||||
rem2id:
|
||||
movl $0,P_BACK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
|
||||
rem_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
|
@ -174,6 +221,8 @@ rem2:
|
|||
ret
|
||||
|
||||
rem3: .asciz "remrq"
|
||||
rem3rt: .asciz "remrq.rt"
|
||||
rem3id: .asciz "remrq.id"
|
||||
sw0: .asciz "cpu_switch"
|
||||
|
||||
/*
|
||||
|
@ -200,10 +249,12 @@ _idle:
|
|||
ALIGN_TEXT
|
||||
idle_loop:
|
||||
cli
|
||||
cmpl $0,_whichrtqs
|
||||
cmpl $0,_whichrtqs /* real-time queue */
|
||||
jne sw1a
|
||||
cmpl $0,_whichqs
|
||||
cmpl $0,_whichqs /* normal queue */
|
||||
jne nortqr
|
||||
cmpl $0,_whichidqs /* 'idle' queue */
|
||||
jne idqr
|
||||
#ifdef APM
|
||||
call _apm_cpu_idle
|
||||
call _apm_cpu_busy
|
||||
|
@ -269,7 +320,6 @@ sw1a:
|
|||
testl %edi,%edi
|
||||
jz nortqr /* no realtime procs */
|
||||
|
||||
rt2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz nortqr /* no proc on rt q - try normal ... */
|
||||
|
@ -298,12 +348,13 @@ rt3:
|
|||
jmp swtch_com
|
||||
|
||||
/* old sw1a */
|
||||
/* Normal process priority's */
|
||||
nortqr:
|
||||
movl _whichqs,%edi
|
||||
2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz _idle /* if none, idle */
|
||||
jz idqr /* if none, idle */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %ebx,%edi /* clear q full status */
|
||||
|
@ -326,6 +377,36 @@ nortqr:
|
|||
btsl %ebx,%edi /* nope, set to indicate not empty */
|
||||
3:
|
||||
movl %edi,_whichqs /* update q status */
|
||||
jmp swtch_com
|
||||
|
||||
idqr: /* was sw1a */
|
||||
movl _whichidqs,%edi /* pick next p. from idqs */
|
||||
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz _idle /* no proc, idle */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %ebx,%edi /* clear q full status */
|
||||
leal _idqs(,%ebx,8),%eax /* select q */
|
||||
movl %eax,%esi
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
cmpl P_FORW(%eax),%eax /* linked to self? (e.g. not on list) */
|
||||
je badsw /* not possible */
|
||||
#endif
|
||||
|
||||
movl P_FORW(%eax),%ecx /* unlink from front of process q */
|
||||
movl P_FORW(%ecx),%edx
|
||||
movl %edx,P_FORW(%eax)
|
||||
movl P_BACK(%ecx),%eax
|
||||
movl %eax,P_BACK(%edx)
|
||||
|
||||
cmpl P_FORW(%ecx),%esi /* q empty */
|
||||
je id3
|
||||
btsl %ebx,%edi /* nope, set to indicate not empty */
|
||||
id3:
|
||||
movl %edi,_whichidqs /* update q status */
|
||||
|
||||
swtch_com:
|
||||
movl $0,%eax
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
|
||||
* $Id: genassym.c,v 1.11 1994/09/12 11:38:03 davidg Exp $
|
||||
* $Id: genassym.c,v 1.12 1994/10/02 01:28:38 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -78,7 +78,8 @@ main()
|
|||
printf("#define\tVM_PMAP %d\n", &vms->vm_pmap);
|
||||
printf("#define\tP_ADDR %d\n", &p->p_addr);
|
||||
printf("#define\tP_PRI %d\n", &p->p_priority);
|
||||
printf("#define\tP_RTPRIO %d\n", &p->p_rtprio);
|
||||
printf("#define\tP_RTPRIO_TYPE %d\n", &p->p_rtprio.type);
|
||||
printf("#define\tP_RTPRIO_PRIO %d\n", &p->p_rtprio.prio);
|
||||
printf("#define\tP_STAT %d\n", &p->p_stat);
|
||||
printf("#define\tP_WCHAN %d\n", &p->p_wchan);
|
||||
printf("#define\tP_FLAG %d\n", &p->p_flag);
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: swtch.s,v 1.13 1994/09/02 05:58:51 davidg Exp $
|
||||
* $Id: swtch.s,v 1.14 1994/10/01 02:56:03 davidg Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* for NNPX */
|
||||
|
@ -59,10 +59,11 @@
|
|||
* queues.
|
||||
*/
|
||||
.data
|
||||
.globl _curpcb, _whichqs, _whichrtqs
|
||||
.globl _curpcb, _whichqs, _whichrtqs, _whichidqs
|
||||
_curpcb: .long 0 /* pointer to curproc's PCB area */
|
||||
_whichqs: .long 0 /* which run queues have data */
|
||||
_whichrtqs: .long 0 /* which realtime run queues have data */
|
||||
_whichidqs: .long 0 /* which idletime run queues have data */
|
||||
|
||||
.globl _qs,_cnt,_panic
|
||||
.comm _noproc,4
|
||||
|
@ -84,10 +85,15 @@ ENTRY(setrunqueue)
|
|||
pushl $set2
|
||||
call _panic
|
||||
set1:
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je set1_nort
|
||||
cmpw $RTP_PRIO_NORMAL,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
je set_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
movzwl P_RTPRIO_PRIO(%eax),%edx
|
||||
|
||||
cmpw $RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* realtime priority? */
|
||||
jne set_id /* must be idle priority */
|
||||
|
||||
set_rt:
|
||||
btsl %edx,_whichrtqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_rtqs,%edx /* locate q hdr */
|
||||
|
@ -97,7 +103,19 @@ set1:
|
|||
movl %eax,P_BACK(%edx)
|
||||
movl %eax,P_FORW(%ecx)
|
||||
ret
|
||||
set1_nort:
|
||||
|
||||
set_id:
|
||||
btsl %edx,_whichidqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_idqs,%edx /* locate q hdr */
|
||||
movl %edx,P_FORW(%eax) /* link process on tail of q */
|
||||
movl P_BACK(%edx),%ecx
|
||||
movl %ecx,P_BACK(%eax)
|
||||
movl %eax,P_BACK(%edx)
|
||||
movl %eax,P_FORW(%ecx)
|
||||
ret
|
||||
|
||||
set_nort: /* Normal (RTOFF) code */
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btsl %edx,_whichqs /* set q full bit */
|
||||
|
@ -119,13 +137,17 @@ set2: .asciz "setrunqueue"
|
|||
*/
|
||||
ENTRY(remrq)
|
||||
movl 4(%esp),%eax
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
cmpw $RTP_PRIO_NORMAL,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
je rem_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
movzwl P_RTPRIO_PRIO(%eax),%edx
|
||||
|
||||
cmpw $RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* normal priority process? */
|
||||
jne rem_id
|
||||
|
||||
btrl %edx,_whichrtqs /* clear full bit, panic if clear already */
|
||||
jb rem1rt
|
||||
pushl $rem3
|
||||
pushl $rem3rt
|
||||
call _panic
|
||||
rem1rt:
|
||||
pushl %edx
|
||||
|
@ -146,6 +168,31 @@ rem1rt:
|
|||
rem2rt:
|
||||
movl $0,P_BACK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
rem_id:
|
||||
btrl %edx,_whichidqs /* clear full bit, panic if clear already */
|
||||
jb rem1id
|
||||
pushl $rem3id
|
||||
call _panic
|
||||
rem1id:
|
||||
pushl %edx
|
||||
movl P_FORW(%eax),%ecx /* unlink process */
|
||||
movl P_BACK(%eax),%edx
|
||||
movl %edx,P_BACK(%ecx)
|
||||
movl P_BACK(%eax),%ecx
|
||||
movl P_FORW(%eax),%edx
|
||||
movl %edx,P_FORW(%ecx)
|
||||
popl %edx
|
||||
movl $_idqs,%ecx
|
||||
shll $3,%edx
|
||||
addl %edx,%ecx
|
||||
cmpl P_FORW(%ecx),%ecx /* q still has something? */
|
||||
je rem2id
|
||||
shrl $3,%edx /* yes, set bit as still full */
|
||||
btsl %edx,_whichidqs
|
||||
rem2id:
|
||||
movl $0,P_BACK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
|
||||
rem_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
|
@ -174,6 +221,8 @@ rem2:
|
|||
ret
|
||||
|
||||
rem3: .asciz "remrq"
|
||||
rem3rt: .asciz "remrq.rt"
|
||||
rem3id: .asciz "remrq.id"
|
||||
sw0: .asciz "cpu_switch"
|
||||
|
||||
/*
|
||||
|
@ -200,10 +249,12 @@ _idle:
|
|||
ALIGN_TEXT
|
||||
idle_loop:
|
||||
cli
|
||||
cmpl $0,_whichrtqs
|
||||
cmpl $0,_whichrtqs /* real-time queue */
|
||||
jne sw1a
|
||||
cmpl $0,_whichqs
|
||||
cmpl $0,_whichqs /* normal queue */
|
||||
jne nortqr
|
||||
cmpl $0,_whichidqs /* 'idle' queue */
|
||||
jne idqr
|
||||
#ifdef APM
|
||||
call _apm_cpu_idle
|
||||
call _apm_cpu_busy
|
||||
|
@ -269,7 +320,6 @@ sw1a:
|
|||
testl %edi,%edi
|
||||
jz nortqr /* no realtime procs */
|
||||
|
||||
rt2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz nortqr /* no proc on rt q - try normal ... */
|
||||
|
@ -298,12 +348,13 @@ rt3:
|
|||
jmp swtch_com
|
||||
|
||||
/* old sw1a */
|
||||
/* Normal process priority's */
|
||||
nortqr:
|
||||
movl _whichqs,%edi
|
||||
2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz _idle /* if none, idle */
|
||||
jz idqr /* if none, idle */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %ebx,%edi /* clear q full status */
|
||||
|
@ -326,6 +377,36 @@ nortqr:
|
|||
btsl %ebx,%edi /* nope, set to indicate not empty */
|
||||
3:
|
||||
movl %edi,_whichqs /* update q status */
|
||||
jmp swtch_com
|
||||
|
||||
idqr: /* was sw1a */
|
||||
movl _whichidqs,%edi /* pick next p. from idqs */
|
||||
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%ebx /* find a full q */
|
||||
jz _idle /* no proc, idle */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %ebx,%edi /* clear q full status */
|
||||
leal _idqs(,%ebx,8),%eax /* select q */
|
||||
movl %eax,%esi
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
cmpl P_FORW(%eax),%eax /* linked to self? (e.g. not on list) */
|
||||
je badsw /* not possible */
|
||||
#endif
|
||||
|
||||
movl P_FORW(%eax),%ecx /* unlink from front of process q */
|
||||
movl P_FORW(%ecx),%edx
|
||||
movl %edx,P_FORW(%eax)
|
||||
movl P_BACK(%ecx),%eax
|
||||
movl %eax,P_BACK(%edx)
|
||||
|
||||
cmpl P_FORW(%ecx),%esi /* q empty */
|
||||
je id3
|
||||
btsl %ebx,%edi /* nope, set to indicate not empty */
|
||||
id3:
|
||||
movl %edi,_whichidqs /* update q status */
|
||||
|
||||
swtch_com:
|
||||
movl $0,%eax
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)init_main.c 8.9 (Berkeley) 1/21/94
|
||||
* $Id: init_main.c,v 1.10 1994/09/13 14:46:47 dfr Exp $
|
||||
* $Id: init_main.c,v 1.11 1994/09/25 19:33:33 phk Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -165,7 +165,8 @@ main(framep)
|
|||
p->p_flag = P_INMEM | P_SYSTEM;
|
||||
p->p_stat = SRUN;
|
||||
p->p_nice = NZERO;
|
||||
p->p_rtprio = RTPRIO_RTOFF;
|
||||
p->p_rtprio.type = RTP_PRIO_NORMAL;
|
||||
p->p_rtprio.prio = 0;
|
||||
|
||||
bcopy("swapper", p->p_comm, sizeof ("swapper"));
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* System call switch table.
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* created from $Id: syscalls.master,v 1.9 1994/09/18 20:39:50 wollman Exp $
|
||||
* created from $Id: syscalls.master,v 1.10 1994/09/28 22:44:47 wollman Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -446,7 +446,7 @@ struct sysent sysent[] = {
|
|||
{ 2, setdomainname }, /* 163 = setdomainname */
|
||||
{ 1, uname }, /* 164 = uname */
|
||||
{ 2, sysarch }, /* 165 = sysarch */
|
||||
{ 2, rtprio }, /* 166 = rtprio */
|
||||
{ 3, rtprio }, /* 166 = rtprio */
|
||||
{ 0, nosys }, /* 167 = nosys */
|
||||
{ 0, nosys }, /* 168 = nosys */
|
||||
#ifdef SYSVSEM
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_fork.c 8.6 (Berkeley) 4/8/94
|
||||
* $Id: kern_fork.c,v 1.5 1994/08/18 22:35:00 wollman Exp $
|
||||
* $Id: kern_fork.c,v 1.6 1994/09/01 05:12:38 davidg Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -268,11 +268,6 @@ again:
|
|||
*/
|
||||
p2->p_estcpu = p1->p_estcpu;
|
||||
|
||||
/*
|
||||
* copy the realtime attibute
|
||||
*/
|
||||
p2->p_rtprio = p1->p_rtprio;
|
||||
|
||||
/*
|
||||
* This begins the section where we must prevent the parent
|
||||
* from being swapped.
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_proc.c 8.4 (Berkeley) 1/4/94
|
||||
* $Id: kern_proc.c,v 1.5 1994/09/01 05:12:39 davidg Exp $
|
||||
* $Id: kern_proc.c,v 1.6 1994/09/25 19:33:41 phk Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -53,6 +53,7 @@
|
|||
|
||||
struct prochd qs[NQS]; /* as good a place as any... */
|
||||
struct prochd rtqs[NQS]; /* Space for REALTIME queues too */
|
||||
struct prochd idqs[NQS]; /* Space for IDLE queues too */
|
||||
|
||||
volatile struct proc *allproc; /* all processes */
|
||||
struct proc *zombproc; /* just zombies */
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_resource.c 8.5 (Berkeley) 1/21/94
|
||||
* $Id: kern_resource.c,v 1.4 1994/09/01 05:12:40 davidg Exp $
|
||||
* $Id: kern_resource.c,v 1.5 1994/09/25 19:33:42 phk Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -195,8 +195,9 @@ donice(curp, chgp, n)
|
|||
|
||||
/* rtprio system call */
|
||||
struct rtprio_args {
|
||||
int who;
|
||||
pid_t rtprio;
|
||||
int function;
|
||||
pid_t pid;
|
||||
struct rtprio *rtprio;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -211,45 +212,55 @@ rtprio(curp, uap, retval)
|
|||
int *retval;
|
||||
{
|
||||
register struct proc *p;
|
||||
register int n = uap->rtprio;
|
||||
register struct pcred *pcred = curp->p_cred;
|
||||
struct rtprio rtp;
|
||||
int error;
|
||||
|
||||
if (uap->who == 0)
|
||||
error = copyin(uap->rtprio, &rtp, sizeof(struct rtprio));
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
if (uap->pid == 0)
|
||||
p = curp;
|
||||
else
|
||||
p = pfind(uap->who);
|
||||
p = pfind(uap->pid);
|
||||
|
||||
if (p == 0)
|
||||
return (ESRCH);
|
||||
|
||||
if (n == RTPRIO_NOCHG) {
|
||||
*retval = (int)p->p_rtprio;
|
||||
return(0); }
|
||||
|
||||
if (pcred->pc_ucred->cr_uid && pcred->p_ruid &&
|
||||
pcred->pc_ucred->cr_uid != p->p_ucred->cr_uid &&
|
||||
pcred->p_ruid != p->p_ucred->cr_uid)
|
||||
return (EPERM);
|
||||
|
||||
if (n == RTPRIO_RTOFF) {
|
||||
if(suser(pcred->pc_ucred, &curp->p_acflag)&& !uap->who)
|
||||
return (EPERM);
|
||||
p->p_rtprio = RTPRIO_RTOFF;
|
||||
*retval = RTPRIO_RTOFF;
|
||||
return (0); }
|
||||
|
||||
if (n > RTPRIO_MAX)
|
||||
return (EINVAL);
|
||||
if (n < RTPRIO_MIN)
|
||||
return (EINVAL);
|
||||
if (suser(pcred->pc_ucred, &curp->p_acflag))
|
||||
return (EPERM);
|
||||
|
||||
p->p_rtprio = n;
|
||||
|
||||
*retval = (int)p->p_rtprio;
|
||||
return (0);
|
||||
};
|
||||
switch (uap->function) {
|
||||
case RTP_LOOKUP:
|
||||
return (copyout(&p->p_rtprio, uap->rtprio, sizeof(struct rtprio)));
|
||||
case RTP_SET:
|
||||
if (pcred->pc_ucred->cr_uid && pcred->p_ruid &&
|
||||
pcred->pc_ucred->cr_uid != p->p_ucred->cr_uid &&
|
||||
pcred->p_ruid != p->p_ucred->cr_uid)
|
||||
return (EPERM);
|
||||
/* disallow setting rtprio in most cases if not superuser */
|
||||
if (suser(pcred->pc_ucred, &curp->p_acflag)) {
|
||||
/* can't set someone else's */
|
||||
if (uap->pid)
|
||||
return (EPERM);
|
||||
/* can't set realtime priority */
|
||||
if (rtp.type == RTP_PRIO_REALTIME)
|
||||
return (EPERM);
|
||||
}
|
||||
switch (rtp.type) {
|
||||
case RTP_PRIO_REALTIME:
|
||||
case RTP_PRIO_NORMAL:
|
||||
case RTP_PRIO_IDLE:
|
||||
if (rtp.prio > RTP_PRIO_MAX)
|
||||
return (EINVAL);
|
||||
p->p_rtprio = rtp;
|
||||
return (0);
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
|
||||
struct setrlimit_args {
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_synch.c 8.6 (Berkeley) 1/21/94
|
||||
* $Id: kern_synch.c,v 1.4 1994/09/01 05:12:41 davidg Exp $
|
||||
* $Id: kern_synch.c,v 1.5 1994/09/25 19:33:44 phk Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -609,6 +609,7 @@ rqinit()
|
|||
for (i = 0; i < NQS; i++) {
|
||||
qs[i].ph_link = qs[i].ph_rlink = (struct proc *)&qs[i];
|
||||
rtqs[i].ph_link = rtqs[i].ph_rlink = (struct proc *)&rtqs[i];
|
||||
idqs[i].ph_link = idqs[i].ph_rlink = (struct proc *)&idqs[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -662,7 +663,7 @@ resetpriority(p)
|
|||
{
|
||||
register unsigned int newpriority;
|
||||
|
||||
if (p->p_rtprio == RTPRIO_RTOFF) {
|
||||
if (p->p_rtprio.type == RTP_PRIO_NORMAL) {
|
||||
newpriority = PUSER + p->p_estcpu / 4 + 2 * p->p_nice;
|
||||
newpriority = min(newpriority, MAXPRI);
|
||||
p->p_usrpri = newpriority;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* System call names.
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* created from $Id: syscalls.master,v 1.9 1994/09/18 20:39:50 wollman Exp $
|
||||
* created from $Id: syscalls.master,v 1.10 1994/09/28 22:44:47 wollman Exp $
|
||||
*/
|
||||
|
||||
char *syscallnames[] = {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
$Id: syscalls.master,v 1.9 1994/09/18 20:39:50 wollman Exp $
|
||||
$Id: syscalls.master,v 1.10 1994/09/28 22:44:47 wollman Exp $
|
||||
; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94
|
||||
;
|
||||
; System call name/number master file.
|
||||
|
@ -219,7 +219,7 @@
|
|||
163 STD 2 BSD setdomainname
|
||||
164 STD 1 BSD uname
|
||||
165 STD 2 BSD sysarch
|
||||
166 STD 2 BSD rtprio
|
||||
166 STD 3 BSD rtprio
|
||||
167 UNIMPL 0 NOHIDE nosys
|
||||
168 UNIMPL 0 NOHIDE nosys
|
||||
#ifdef SYSVSEM
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)proc.h 8.8 (Berkeley) 1/21/94
|
||||
* $Id: proc.h,v 1.7 1994/08/28 16:53:35 bde Exp $
|
||||
* $Id: proc.h,v 1.8 1994/09/01 05:12:52 davidg Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_PROC_H_
|
||||
|
@ -156,6 +156,7 @@ struct proc {
|
|||
|
||||
struct sysentvec *p_sysent; /* System call dispatch information. */
|
||||
|
||||
struct rtprio p_rtprio; /* realtime priority */
|
||||
/* End area that is copied on creation. */
|
||||
#define p_endcopy p_thread
|
||||
int p_thread; /* Id for this "thread"; Mach glue. XXX */
|
||||
|
@ -165,7 +166,6 @@ struct proc {
|
|||
u_short p_xstat; /* Exit status for wait; also stop signal. */
|
||||
u_short p_acflag; /* Accounting flags. */
|
||||
struct rusage *p_ru; /* Exit information. XXX */
|
||||
u_long p_rtprio; /* realtime priority */
|
||||
};
|
||||
|
||||
#define p_session p_pgrp->pg_session
|
||||
|
@ -248,6 +248,7 @@ extern struct proc *initproc, *pageproc; /* Process slots for init, pager. */
|
|||
#define NQS 32 /* 32 run queues. */
|
||||
extern struct prochd qs[];
|
||||
extern struct prochd rtqs[];
|
||||
extern struct prochd idqs[];
|
||||
extern int whichqs; /* Bit mask summary of non-empty Q's. */
|
||||
struct prochd {
|
||||
struct proc *ph_link; /* Linked list of running processes. */
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: rtprio.h,v 1.1 1994/09/01 05:12:53 davidg Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_RTPRIO_H_
|
||||
|
@ -37,16 +37,34 @@
|
|||
/*
|
||||
* Process realtime-priority specifications to rtprio.
|
||||
*/
|
||||
#define RTPRIO_MIN 0 /* relativ-FASTEST */
|
||||
#define RTPRIO_MAX 31 /* relativ-SLOWEST */
|
||||
#define RTPRIO_NOCHG 100 /* look only */
|
||||
#define RTPRIO_RTOFF 101 /* NON-realtime */
|
||||
|
||||
/* priority types */
|
||||
#define RTP_PRIO_REALTIME 0
|
||||
#define RTP_PRIO_NORMAL 1
|
||||
#define RTP_PRIO_IDLE 2
|
||||
|
||||
/* priority range */
|
||||
#define RTP_PRIO_MIN 0 /* Highest priority */
|
||||
#define RTP_PRIO_MAX 31 /* Lowest priority */
|
||||
|
||||
/*
|
||||
* rtprio() syscall functions
|
||||
*/
|
||||
#define RTP_LOOKUP 0
|
||||
#define RTP_SET 1
|
||||
|
||||
#ifndef LOCORE
|
||||
struct rtprio {
|
||||
u_short type;
|
||||
u_short prio;
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef KERNEL
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
int rtprio __P((int, int));
|
||||
int rtprio __P((int, pid_t, struct rtprio *));
|
||||
__END_DECLS
|
||||
#endif /* !KERNEL */
|
||||
#endif /* !_SYS_RTPRIO_H_ */
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* System call hiders.
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* created from $Id: syscalls.master,v 1.9 1994/09/18 20:39:50 wollman Exp $
|
||||
* created from $Id: syscalls.master,v 1.10 1994/09/28 22:44:47 wollman Exp $
|
||||
*/
|
||||
|
||||
HIDE_POSIX(fork)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* System call numbers.
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* created from $Id: syscalls.master,v 1.9 1994/09/18 20:39:50 wollman Exp $
|
||||
* created from $Id: syscalls.master,v 1.10 1994/09/28 22:44:47 wollman Exp $
|
||||
*/
|
||||
|
||||
#define SYS_syscall 0
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
# from: @(#)Makefile 5.5 (Berkeley) 5/11/90
|
||||
# $Id: Makefile,v 1.2 1993/11/23 00:02:21 jtc Exp $
|
||||
# $Id: Makefile,v 1.1 1994/09/01 12:05:12 davidg Exp $
|
||||
|
||||
BINDIR=/usr/sbin
|
||||
PROG= rtprio
|
||||
LINKS= ${BINDIR}/rtprio ${BINDIR}/idprio
|
||||
MLINKS= rtprio.1 idprio.1
|
||||
MAN1= rtprio.1
|
||||
MAN2= rtprio.2
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
|
|
@ -34,35 +34,50 @@
|
|||
.Dt RTPRIO 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm rtprio
|
||||
.Nd execute, examine or modify a process's realtime scheduling priority
|
||||
.Nm rtprio ,
|
||||
.Nm idprio
|
||||
.Nd execute, examine or modify a utilitys or process realtime
|
||||
or idletime scheduling priority
|
||||
.Sh SYNOPSIS
|
||||
|
||||
.Nm rtprio
|
||||
.Nm rtprio
|
||||
.Nm [id|rt]prio
|
||||
.Nm [id|rt]prio
|
||||
.Ar pid
|
||||
.Nm rtprio
|
||||
.Nm [id|rt]prio
|
||||
.Ar priority
|
||||
.Ar command
|
||||
.Op args
|
||||
.Nm rtprio
|
||||
.Nm [id|rt]prio
|
||||
.Ar priority
|
||||
.Ar -pid
|
||||
.Nm rtprio
|
||||
.Nm [id|rt]prio
|
||||
.Ar -t
|
||||
.Ar command
|
||||
.Op args
|
||||
.Nm rtprio
|
||||
.Nm [id|rt]prio
|
||||
.Ar -t
|
||||
.Ar -pid
|
||||
.Sh DESCRIPTION
|
||||
.Nm Rtprio
|
||||
is used for controlling realtime process scheduling. A process with a
|
||||
realtime priority is not subject to priority degradation, and will only
|
||||
be preempted by another process of equal or higher realtime priority.
|
||||
is used for controlling realtime process scheduling.
|
||||
|
||||
.Nm Rtprio
|
||||
called without arguments, will return the realtime priority
|
||||
.Nm Idprio
|
||||
is used for controlling idletime process scheduling, and can be called
|
||||
with the same options as
|
||||
.Nm Rtprio .
|
||||
|
||||
A process with a realtime priority is not subject to priority
|
||||
degradation, and will only be preempted by another process of equal or
|
||||
higher realtime priority.
|
||||
|
||||
A process with an idle priority will run only when no other
|
||||
process is runnable and then only if it's idle priority is equal or
|
||||
greater than all other runnable idle priority processes.
|
||||
|
||||
.Nm Rtprio
|
||||
or
|
||||
.Nm Idprio
|
||||
when called without arguments will return the realtime priority
|
||||
of the current process.
|
||||
|
||||
If
|
||||
|
@ -81,23 +96,27 @@ process.
|
|||
|
||||
If
|
||||
.Ar -pid
|
||||
is specified, the process with that pid will be modified, else
|
||||
if
|
||||
is specified, the process with the process identifier "pid" will be
|
||||
modified, else if
|
||||
.Ar command
|
||||
is specified, that program is run with its arguments.
|
||||
|
||||
.Ar Priority
|
||||
is an integer between 0 (RTPRIO_MIN) and 31 (RTPRIO_MAX). 0 is the
|
||||
is an integer between 0 and RTP_PRIO_MAX (usually 31). 0 is the
|
||||
highest priority
|
||||
|
||||
.Ar Pid
|
||||
of 0 means "the current process".
|
||||
|
||||
Only root is allowed to set realtime priorities.
|
||||
Only root is allowed to set realtime priorities. Non-root processes may
|
||||
set idle priority levels for the current process only.
|
||||
.Sh RETURN VALUE
|
||||
If
|
||||
.Nm rtprio
|
||||
returns the (new) realtime priority of the process (see rtprio(2)), or
|
||||
-1 for all usage errors.
|
||||
execute a command, the exit value is that of the command executed.
|
||||
In all other cases,
|
||||
.Nm
|
||||
exits with 0 for success and 1 for all other errors.
|
||||
.Sh EXAMPLES
|
||||
.\LP
|
||||
|
||||
|
@ -131,16 +150,17 @@ To run \fItcpdump\fP without realtime priority:
|
|||
.Ed
|
||||
|
||||
.\.LP
|
||||
To change the realtime priority of process \fI1423\fP to RTRIO_RTOFF
|
||||
(no realtime):
|
||||
To change the realtime priority of process \fI1423\fP to RTP_PRIO_NORMAL
|
||||
(non-realtime/"normal" priority):
|
||||
.Bd -literal -offset indent -compact
|
||||
\fBrtprio -t -1423\fP
|
||||
.Ed
|
||||
.Sh DIAGNOSTICS
|
||||
The
|
||||
.Nm rtprio
|
||||
utility shall exit with value of the (new) realtime priority of the
|
||||
program.
|
||||
|
||||
.\.LP
|
||||
To make depend while not disturbing other machine usage:
|
||||
.Bd -literal -offset indent -compact
|
||||
\fBidprio 31 make depend\fP
|
||||
.Ed
|
||||
.Sh SEE ALSO
|
||||
.Xr rtprio 2 ,
|
||||
.Xr nice 1 ,
|
||||
|
@ -153,13 +173,25 @@ The
|
|||
utility appeared in
|
||||
FreeBSD 2.0,
|
||||
but is similar to the HP-UX version.
|
||||
.Sh CAVEATS
|
||||
You can lock yourself out of the system by placing a cpu-heavy
|
||||
process in a realtime priority.
|
||||
.Sh BUGS
|
||||
You can lock yourself out of the system by placing a cpu-intensive
|
||||
process into realtime priority.
|
||||
|
||||
There is no way to set/view the realtime priority of process 0
|
||||
(swapper) (see ps(1)).
|
||||
|
||||
There is in
|
||||
FreeBSD
|
||||
no way to ensure that a process page is present in memory therefore
|
||||
the process may be stopped for pagein. (See mprotect(2), madvise(2)).
|
||||
|
||||
Under
|
||||
FreeBSD
|
||||
system calls are currently never preempted, therefore non-realtime
|
||||
processes can starve realtime procesess, or idletime processes can
|
||||
starve normal priority processes.
|
||||
|
||||
Others ...
|
||||
.Sh AUTHOR
|
||||
Henrik Vestergaard Draboel - hvd@terry.ping.dk
|
||||
Henrik Vestergaard Draboel - hvd@terry.ping.dk is the original author. This
|
||||
implementation in FreeBSD was substantially rewritten by David Greenman.
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
.\" Copyright (c) 1994, Henrik Vestergaard Draboel
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by Henrik Vestergaard Draboel.
|
||||
.\" 4. The name of the author may not be used to endorse or promote products
|
||||
.\" derived from this software without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Id: rtprio.2,v 1.2 1994/09/01 12:09:17 davidg Exp $
|
||||
.\"
|
||||
.Dd July 23, 1994
|
||||
.Dt RTPRIO 2
|
||||
.Sh NAME
|
||||
.Nm rtprio
|
||||
.Nd examine or modify a process realtime or idle priority
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <sys/resource.h>
|
||||
.Fd #include <sys/rtprio.h>
|
||||
.Ft int
|
||||
.Fn rtprio "function" "pid_t pid" "struct rtprio *rtp"
|
||||
.Sh DESCRIPTION
|
||||
.Fn rtprio
|
||||
is used to lookup or change the realtime or idle priority of a process.
|
||||
|
||||
.Fa function
|
||||
specifies the operation to be performed. RTP_LOOKUP to lookup the current priority,
|
||||
and RTP_SET to set the priority.
|
||||
.Fa pid
|
||||
specifies the process to be used, 0 for the current process.
|
||||
|
||||
.Fa *rtp
|
||||
is a pointer to a struct rtprio which is used to specify the priority and priority type.
|
||||
This structure has the following form:
|
||||
.Bd -literal
|
||||
struct rtprio {
|
||||
u_short type;
|
||||
u_short prio;
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
The value of the
|
||||
.Nm type
|
||||
field may be RTP_PRIO_REALTIME for realtime priorities,
|
||||
RTP_PRIO_NORMAL for normal priorities, and RTP_PRIO_IDLE for idle priorities.
|
||||
The priority specified by the
|
||||
.Nm prio
|
||||
field ranges between 0 and
|
||||
.Dv RTP_PRIO_MAX (usually 31) .
|
||||
0 is the highest possible priority.
|
||||
|
||||
Realtime and idle priority is inherited through fork() and exec().
|
||||
|
||||
A realtime process can only be preempted by a process of equal or
|
||||
higher priority, or by an interrupt; idle priority processes will run only
|
||||
when no other real/normal priority process is runnable. Higher real/idle priority processes
|
||||
preempt lower real/idle priority processes. Processes of equal real/idle priority are run round-robin.
|
||||
.Sh RETURN VALUES
|
||||
.Fn rtprio
|
||||
will return 0 for success and -1 for all errors. The global variable
|
||||
.Va errno
|
||||
will be set to indicate the error.
|
||||
.Sh ERRORS
|
||||
.Fn rtprio
|
||||
will fail if
|
||||
.Bl -tag -width Er
|
||||
.It Bq Er EINVAL
|
||||
The specified
|
||||
.Fa prio
|
||||
was out of range.
|
||||
.It Bq Er EPERM
|
||||
The calling process is not allowed to set the realtime priority. Only
|
||||
root is allowed to change the realtime priority of any process, and non-root
|
||||
may only change the idle priority of the current process.
|
||||
.It Bq Er ESRCH
|
||||
The specified process was not found.
|
||||
.Sh AUTHOR
|
||||
The original author was Henrik Vestergaard Draboel - hvd@terry.ping.dk. This
|
||||
implementation in FreeBSD was substantially rewritten by David Greenman.
|
||||
.Sh SEE ALSO
|
||||
.Xr rtprio 1 ,
|
||||
.Xr nice 1 ,
|
||||
.Xr ps 1 ,
|
||||
.Xr nice 2 ,
|
||||
.Xr renice 8
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 1994 The Regents of the University of California.
|
||||
* Copyright (c) 1994 David Greenman
|
||||
* Copyright (c) 1994 Henrik Vestergaard Draboel (hvd@terry.ping.dk)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -12,16 +13,16 @@
|
|||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* This product includes software developed by Henrik Vestergaard Draboel.
|
||||
* This product includes software developed by David Greenman.
|
||||
* 4. Neither the names of the authors nor the names of contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
|
@ -29,28 +30,15 @@
|
|||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/* Copyright (c) 1994 Henrik Vestergaard Drabøl (hvd@terry.pping.dk) */
|
||||
|
||||
#ifndef lint
|
||||
char copyright[] =
|
||||
"@(#) Copyright (c) 1989 The Regents of the University of California.\n\
|
||||
All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
/*static char sccsid[] = "from: @(#)rtprio.c 5.4 (Berkeley) 6/1/90";*/
|
||||
static char rcsid[] = "$Id: rtprio.c,v 1.2 1993/11/23 00:02:23 jtc Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/rtprio.h>
|
||||
#include <locale.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <sys/errno.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
@ -60,82 +48,95 @@ static void usage();
|
|||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int nrtprio = RTPRIO_RTOFF;
|
||||
int proc=0;
|
||||
char *p;
|
||||
int proc = 0;
|
||||
struct rtprio rtp;
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
errno = 0;
|
||||
/* find basename */
|
||||
if ((p = rindex(argv[0], '/')) == NULL)
|
||||
p = argv[0];
|
||||
else
|
||||
++p;
|
||||
|
||||
if (!strcmp(p, "rtprio"))
|
||||
rtp.type = RTP_PRIO_REALTIME;
|
||||
else if (!strcmp(p, "idprio"))
|
||||
rtp.type = RTP_PRIO_IDLE;
|
||||
|
||||
switch (argc) {
|
||||
case 2:
|
||||
proc = abs(atoi(argv[1]));
|
||||
case 2:
|
||||
proc = abs(atoi(argv[1])); /* Should check if numeric
|
||||
* arg! */
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 1:
|
||||
nrtprio = rtprio(proc,RTPRIO_NOCHG);
|
||||
fprintf(stderr,"rtprio: %d %s\n",
|
||||
nrtprio,
|
||||
nrtprio==RTPRIO_RTOFF?"(RTOFF)":"");
|
||||
exit(nrtprio);
|
||||
/* NOTREACHED */
|
||||
|
||||
default: {
|
||||
switch (argv[1][0]) {
|
||||
case '-':
|
||||
if (strcmp(argv[1],"-t")==0)
|
||||
nrtprio = RTPRIO_RTOFF;
|
||||
else
|
||||
usage();
|
||||
break;
|
||||
|
||||
case '0':case '1':case '2':case '3':case '4':
|
||||
case '5':case '6':case '7':case '8':case '9':
|
||||
nrtprio = atoi (argv[1]);
|
||||
|
||||
if (errno== ERANGE) usage();
|
||||
break;
|
||||
|
||||
if (rtprio(RTP_LOOKUP, proc, &rtp) != 0) {
|
||||
perror(argv[0]);
|
||||
exit (1);
|
||||
}
|
||||
printf("%s: ", p);
|
||||
switch (rtp.type) {
|
||||
case RTP_PRIO_REALTIME:
|
||||
printf("realtime priority %d\n", rtp.prio);
|
||||
break;
|
||||
case RTP_PRIO_NORMAL:
|
||||
printf("normal priority\n");
|
||||
break;
|
||||
case RTP_PRIO_IDLE:
|
||||
printf("idle priority %d\n", rtp.prio);
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
break;
|
||||
printf("invalid priority type %d\n", rtp.type);
|
||||
break;
|
||||
}
|
||||
switch (argv[2][0]) {
|
||||
case '-':
|
||||
proc = -atoi(argv[2]);
|
||||
|
||||
break;
|
||||
exit(0);
|
||||
default:
|
||||
if (argv[1][0] == '-' || isdigit(argv[1][0])) {
|
||||
if (argv[1][0] == '-') {
|
||||
if (strcmp(argv[1], "-t") == 0) {
|
||||
rtp.type = RTP_PRIO_NORMAL;
|
||||
rtp.prio = 0;
|
||||
} else {
|
||||
usage(p);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
rtp.prio = atoi(argv[1]);
|
||||
}
|
||||
} else {
|
||||
usage(p);
|
||||
break;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
|
||||
nrtprio = rtprio(proc, nrtprio);
|
||||
if (argv[2][0] == '-')
|
||||
proc = -atoi(argv[2]);
|
||||
|
||||
if (errno) {
|
||||
err (1, "rtprio");
|
||||
/* NOTREACHED */
|
||||
if (rtprio(RTP_SET, proc, &rtp) != 0) {
|
||||
perror(argv[0]);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (proc == 0) {
|
||||
execvp(argv[2], &argv[2]);
|
||||
perror(argv[0]);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
if (proc == 0) {
|
||||
execvp(argv[2], &argv[2]);
|
||||
err ((errno == ENOENT) ? 127 : 126, "%s", argv[2]);}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
}
|
||||
return(nrtprio);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
static void
|
||||
usage()
|
||||
usage(basename)
|
||||
char *basename;
|
||||
{
|
||||
(void)fprintf(stderr, "usage: rtprio\n");
|
||||
(void)fprintf(stderr, "usage: rtprio [-] pid\n");
|
||||
(void)fprintf(stderr, "usage: rtprio priority command [ args ] \n");
|
||||
(void)fprintf(stderr, "usage: rtprio priority -pid \n");
|
||||
(void)fprintf(stderr, "usage: rtprio -t command [ args ] \n");
|
||||
(void)fprintf(stderr, "usage: rtprio -t -pid \n");
|
||||
|
||||
(void) fprintf(stderr, "usage: %s\n", basename);
|
||||
(void) fprintf(stderr, "usage: %s [-]pid\n", basename);
|
||||
(void) fprintf(stderr, "usage: %s priority command [ args ] \n", basename);
|
||||
(void) fprintf(stderr, "usage: %s priority -pid \n", basename);
|
||||
(void) fprintf(stderr, "usage: %s -t command [ args ] \n", basename);
|
||||
(void) fprintf(stderr, "usage: %s -t -pid \n", basename);
|
||||
|
||||
exit(-1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue