mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-04 21:09:28 +00:00
Realtime priority scheduling support.
Submitted by: Henrik Vestergaard Draboel
This commit is contained in:
parent
431be400a7
commit
e8fb0b2c17
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=2441
@ -33,15 +33,16 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: swtch.s,v 1.10 1994/08/19 22:49:42 davidg Exp $
|
||||
* $Id: swtch.s,v 1.11 1994/08/30 17:19:10 bde Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* for NNPX */
|
||||
#include "assym.s" /* for preprocessor defines */
|
||||
#include "errno.h" /* for error codes */
|
||||
#include <sys/errno.h> /* for error codes */
|
||||
|
||||
#include "machine/asmacros.h" /* for miscellaneous assembly macros */
|
||||
#include "machine/spl.h" /* for SWI_AST_MASK ... */
|
||||
#include <machine/asmacros.h> /* for miscellaneous assembly macros */
|
||||
#include <machine/spl.h> /* for SWI_AST_MASK ... */
|
||||
#include <sys/rtprio.h>
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
@ -58,9 +59,10 @@
|
||||
* queues.
|
||||
*/
|
||||
.data
|
||||
.globl _curpcb, _whichqs
|
||||
.globl _curpcb, _whichqs, _whichrtqs
|
||||
_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 */
|
||||
|
||||
.globl _qs,_cnt,_panic
|
||||
.comm _noproc,4
|
||||
@ -82,6 +84,20 @@ ENTRY(setrunqueue)
|
||||
pushl $set2
|
||||
call _panic
|
||||
set1:
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je set1_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
btsl %edx,_whichrtqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_rtqs,%edx /* locate q hdr */
|
||||
movl %edx,P_LINK(%eax) /* link process on tail of q */
|
||||
movl P_RLINK(%edx),%ecx
|
||||
movl %ecx,P_RLINK(%eax)
|
||||
movl %eax,P_RLINK(%edx)
|
||||
movl %eax,P_LINK(%ecx)
|
||||
ret
|
||||
set1_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btsl %edx,_whichqs /* set q full bit */
|
||||
@ -103,6 +119,34 @@ set2: .asciz "setrunqueue"
|
||||
*/
|
||||
ENTRY(remrq)
|
||||
movl 4(%esp),%eax
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je rem_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
btrl %edx,_whichrtqs /* clear full bit, panic if clear already */
|
||||
jb rem1rt
|
||||
pushl $rem3
|
||||
call _panic
|
||||
rem1rt:
|
||||
pushl %edx
|
||||
movl P_LINK(%eax),%ecx /* unlink process */
|
||||
movl P_RLINK(%eax),%edx
|
||||
movl %edx,P_RLINK(%ecx)
|
||||
movl P_RLINK(%eax),%ecx
|
||||
movl P_LINK(%eax),%edx
|
||||
movl %edx,P_LINK(%ecx)
|
||||
popl %edx
|
||||
movl $_rtqs,%ecx
|
||||
shll $3,%edx
|
||||
addl %edx,%ecx
|
||||
cmpl P_LINK(%ecx),%ecx /* q still has something? */
|
||||
je rem2rt
|
||||
shrl $3,%edx /* yes, set bit as still full */
|
||||
btsl %edx,_whichrtqs
|
||||
rem2rt:
|
||||
movl $0,P_RLINK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
rem_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btrl %edx,_whichqs /* clear full bit, panic if clear already */
|
||||
@ -156,8 +200,10 @@ _idle:
|
||||
ALIGN_TEXT
|
||||
idle_loop:
|
||||
cli
|
||||
cmpl $0,_whichqs
|
||||
cmpl $0,_whichrtqs
|
||||
jne sw1a
|
||||
cmpl $0,_whichqs
|
||||
jne nortqr
|
||||
sti
|
||||
hlt /* wait for interrupt */
|
||||
jmp idle_loop
|
||||
@ -214,6 +260,41 @@ ENTRY(cpu_switch)
|
||||
sw1:
|
||||
cli
|
||||
sw1a:
|
||||
movl _whichrtqs,%edi /* pick next p. from rtqs */
|
||||
|
||||
rt2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%eax /* find a full q */
|
||||
je nortqr /* no proc on rt q - try normal ... */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %eax,%edi /* clear q full status */
|
||||
jnb rt2 /* if it was clear, look for another */
|
||||
movl %eax,%ebx /* save which one we are using */
|
||||
shll $3,%eax
|
||||
addl $_rtqs,%eax /* select q */
|
||||
movl %eax,%esi
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
cmpl P_LINK(%eax),%eax /* linked to self? (e.g. not on list) */
|
||||
je badsw /* not possible */
|
||||
#endif
|
||||
|
||||
movl P_LINK(%eax),%ecx /* unlink from front of process q */
|
||||
movl P_LINK(%ecx),%edx
|
||||
movl %edx,P_LINK(%eax)
|
||||
movl P_RLINK(%ecx),%eax
|
||||
movl %eax,P_RLINK(%edx)
|
||||
|
||||
cmpl P_LINK(%ecx),%esi /* q empty */
|
||||
je rt3
|
||||
btsl %ebx,%edi /* nope, set to indicate full */
|
||||
rt3:
|
||||
movl %edi,_whichrtqs /* update q status */
|
||||
jmp swtch_com
|
||||
|
||||
/* old sw1a */
|
||||
nortqr:
|
||||
movl _whichqs,%edi
|
||||
2:
|
||||
/* XXX - bsf is sloow */
|
||||
@ -246,6 +327,7 @@ sw1a:
|
||||
3:
|
||||
movl %edi,_whichqs /* update q status */
|
||||
|
||||
swtch_com:
|
||||
movl $0,%eax
|
||||
movl %eax,_want_resched
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
|
||||
* $Id: genassym.c,v 1.6 1993/11/13 02:24:59 davidg Exp $
|
||||
* $Id: genassym.c,v 1.8 1994/05/25 08:53:32 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -74,6 +74,7 @@ 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_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,15 +33,16 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: swtch.s,v 1.10 1994/08/19 22:49:42 davidg Exp $
|
||||
* $Id: swtch.s,v 1.11 1994/08/30 17:19:10 bde Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* for NNPX */
|
||||
#include "assym.s" /* for preprocessor defines */
|
||||
#include "errno.h" /* for error codes */
|
||||
#include <sys/errno.h> /* for error codes */
|
||||
|
||||
#include "machine/asmacros.h" /* for miscellaneous assembly macros */
|
||||
#include "machine/spl.h" /* for SWI_AST_MASK ... */
|
||||
#include <machine/asmacros.h> /* for miscellaneous assembly macros */
|
||||
#include <machine/spl.h> /* for SWI_AST_MASK ... */
|
||||
#include <sys/rtprio.h>
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
@ -58,9 +59,10 @@
|
||||
* queues.
|
||||
*/
|
||||
.data
|
||||
.globl _curpcb, _whichqs
|
||||
.globl _curpcb, _whichqs, _whichrtqs
|
||||
_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 */
|
||||
|
||||
.globl _qs,_cnt,_panic
|
||||
.comm _noproc,4
|
||||
@ -82,6 +84,20 @@ ENTRY(setrunqueue)
|
||||
pushl $set2
|
||||
call _panic
|
||||
set1:
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je set1_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
btsl %edx,_whichrtqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_rtqs,%edx /* locate q hdr */
|
||||
movl %edx,P_LINK(%eax) /* link process on tail of q */
|
||||
movl P_RLINK(%edx),%ecx
|
||||
movl %ecx,P_RLINK(%eax)
|
||||
movl %eax,P_RLINK(%edx)
|
||||
movl %eax,P_LINK(%ecx)
|
||||
ret
|
||||
set1_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btsl %edx,_whichqs /* set q full bit */
|
||||
@ -103,6 +119,34 @@ set2: .asciz "setrunqueue"
|
||||
*/
|
||||
ENTRY(remrq)
|
||||
movl 4(%esp),%eax
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je rem_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
btrl %edx,_whichrtqs /* clear full bit, panic if clear already */
|
||||
jb rem1rt
|
||||
pushl $rem3
|
||||
call _panic
|
||||
rem1rt:
|
||||
pushl %edx
|
||||
movl P_LINK(%eax),%ecx /* unlink process */
|
||||
movl P_RLINK(%eax),%edx
|
||||
movl %edx,P_RLINK(%ecx)
|
||||
movl P_RLINK(%eax),%ecx
|
||||
movl P_LINK(%eax),%edx
|
||||
movl %edx,P_LINK(%ecx)
|
||||
popl %edx
|
||||
movl $_rtqs,%ecx
|
||||
shll $3,%edx
|
||||
addl %edx,%ecx
|
||||
cmpl P_LINK(%ecx),%ecx /* q still has something? */
|
||||
je rem2rt
|
||||
shrl $3,%edx /* yes, set bit as still full */
|
||||
btsl %edx,_whichrtqs
|
||||
rem2rt:
|
||||
movl $0,P_RLINK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
rem_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btrl %edx,_whichqs /* clear full bit, panic if clear already */
|
||||
@ -156,8 +200,10 @@ _idle:
|
||||
ALIGN_TEXT
|
||||
idle_loop:
|
||||
cli
|
||||
cmpl $0,_whichqs
|
||||
cmpl $0,_whichrtqs
|
||||
jne sw1a
|
||||
cmpl $0,_whichqs
|
||||
jne nortqr
|
||||
sti
|
||||
hlt /* wait for interrupt */
|
||||
jmp idle_loop
|
||||
@ -214,6 +260,41 @@ ENTRY(cpu_switch)
|
||||
sw1:
|
||||
cli
|
||||
sw1a:
|
||||
movl _whichrtqs,%edi /* pick next p. from rtqs */
|
||||
|
||||
rt2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%eax /* find a full q */
|
||||
je nortqr /* no proc on rt q - try normal ... */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %eax,%edi /* clear q full status */
|
||||
jnb rt2 /* if it was clear, look for another */
|
||||
movl %eax,%ebx /* save which one we are using */
|
||||
shll $3,%eax
|
||||
addl $_rtqs,%eax /* select q */
|
||||
movl %eax,%esi
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
cmpl P_LINK(%eax),%eax /* linked to self? (e.g. not on list) */
|
||||
je badsw /* not possible */
|
||||
#endif
|
||||
|
||||
movl P_LINK(%eax),%ecx /* unlink from front of process q */
|
||||
movl P_LINK(%ecx),%edx
|
||||
movl %edx,P_LINK(%eax)
|
||||
movl P_RLINK(%ecx),%eax
|
||||
movl %eax,P_RLINK(%edx)
|
||||
|
||||
cmpl P_LINK(%ecx),%esi /* q empty */
|
||||
je rt3
|
||||
btsl %ebx,%edi /* nope, set to indicate full */
|
||||
rt3:
|
||||
movl %edi,_whichrtqs /* update q status */
|
||||
jmp swtch_com
|
||||
|
||||
/* old sw1a */
|
||||
nortqr:
|
||||
movl _whichqs,%edi
|
||||
2:
|
||||
/* XXX - bsf is sloow */
|
||||
@ -246,6 +327,7 @@ sw1a:
|
||||
3:
|
||||
movl %edi,_whichqs /* update q status */
|
||||
|
||||
swtch_com:
|
||||
movl $0,%eax
|
||||
movl %eax,_want_resched
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)genassym.c 5.11 (Berkeley) 5/10/91
|
||||
* $Id: genassym.c,v 1.6 1993/11/13 02:24:59 davidg Exp $
|
||||
* $Id: genassym.c,v 1.8 1994/05/25 08:53:32 rgrimes Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -74,6 +74,7 @@ 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_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,15 +33,16 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: swtch.s,v 1.10 1994/08/19 22:49:42 davidg Exp $
|
||||
* $Id: swtch.s,v 1.11 1994/08/30 17:19:10 bde Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h" /* for NNPX */
|
||||
#include "assym.s" /* for preprocessor defines */
|
||||
#include "errno.h" /* for error codes */
|
||||
#include <sys/errno.h> /* for error codes */
|
||||
|
||||
#include "machine/asmacros.h" /* for miscellaneous assembly macros */
|
||||
#include "machine/spl.h" /* for SWI_AST_MASK ... */
|
||||
#include <machine/asmacros.h> /* for miscellaneous assembly macros */
|
||||
#include <machine/spl.h> /* for SWI_AST_MASK ... */
|
||||
#include <sys/rtprio.h>
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
@ -58,9 +59,10 @@
|
||||
* queues.
|
||||
*/
|
||||
.data
|
||||
.globl _curpcb, _whichqs
|
||||
.globl _curpcb, _whichqs, _whichrtqs
|
||||
_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 */
|
||||
|
||||
.globl _qs,_cnt,_panic
|
||||
.comm _noproc,4
|
||||
@ -82,6 +84,20 @@ ENTRY(setrunqueue)
|
||||
pushl $set2
|
||||
call _panic
|
||||
set1:
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je set1_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
btsl %edx,_whichrtqs /* set q full bit */
|
||||
shll $3,%edx
|
||||
addl $_rtqs,%edx /* locate q hdr */
|
||||
movl %edx,P_LINK(%eax) /* link process on tail of q */
|
||||
movl P_RLINK(%edx),%ecx
|
||||
movl %ecx,P_RLINK(%eax)
|
||||
movl %eax,P_RLINK(%edx)
|
||||
movl %eax,P_LINK(%ecx)
|
||||
ret
|
||||
set1_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btsl %edx,_whichqs /* set q full bit */
|
||||
@ -103,6 +119,34 @@ set2: .asciz "setrunqueue"
|
||||
*/
|
||||
ENTRY(remrq)
|
||||
movl 4(%esp),%eax
|
||||
cmpl $RTPRIO_RTOFF,P_RTPRIO(%eax) /* Realtime process ? */
|
||||
je rem_nort
|
||||
|
||||
movl P_RTPRIO(%eax),%edx
|
||||
btrl %edx,_whichrtqs /* clear full bit, panic if clear already */
|
||||
jb rem1rt
|
||||
pushl $rem3
|
||||
call _panic
|
||||
rem1rt:
|
||||
pushl %edx
|
||||
movl P_LINK(%eax),%ecx /* unlink process */
|
||||
movl P_RLINK(%eax),%edx
|
||||
movl %edx,P_RLINK(%ecx)
|
||||
movl P_RLINK(%eax),%ecx
|
||||
movl P_LINK(%eax),%edx
|
||||
movl %edx,P_LINK(%ecx)
|
||||
popl %edx
|
||||
movl $_rtqs,%ecx
|
||||
shll $3,%edx
|
||||
addl %edx,%ecx
|
||||
cmpl P_LINK(%ecx),%ecx /* q still has something? */
|
||||
je rem2rt
|
||||
shrl $3,%edx /* yes, set bit as still full */
|
||||
btsl %edx,_whichrtqs
|
||||
rem2rt:
|
||||
movl $0,P_RLINK(%eax) /* zap reverse link to indicate off list */
|
||||
ret
|
||||
rem_nort:
|
||||
movzbl P_PRI(%eax),%edx
|
||||
shrl $2,%edx
|
||||
btrl %edx,_whichqs /* clear full bit, panic if clear already */
|
||||
@ -156,8 +200,10 @@ _idle:
|
||||
ALIGN_TEXT
|
||||
idle_loop:
|
||||
cli
|
||||
cmpl $0,_whichqs
|
||||
cmpl $0,_whichrtqs
|
||||
jne sw1a
|
||||
cmpl $0,_whichqs
|
||||
jne nortqr
|
||||
sti
|
||||
hlt /* wait for interrupt */
|
||||
jmp idle_loop
|
||||
@ -214,6 +260,41 @@ ENTRY(cpu_switch)
|
||||
sw1:
|
||||
cli
|
||||
sw1a:
|
||||
movl _whichrtqs,%edi /* pick next p. from rtqs */
|
||||
|
||||
rt2:
|
||||
/* XXX - bsf is sloow */
|
||||
bsfl %edi,%eax /* find a full q */
|
||||
je nortqr /* no proc on rt q - try normal ... */
|
||||
|
||||
/* XX update whichqs? */
|
||||
btrl %eax,%edi /* clear q full status */
|
||||
jnb rt2 /* if it was clear, look for another */
|
||||
movl %eax,%ebx /* save which one we are using */
|
||||
shll $3,%eax
|
||||
addl $_rtqs,%eax /* select q */
|
||||
movl %eax,%esi
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
cmpl P_LINK(%eax),%eax /* linked to self? (e.g. not on list) */
|
||||
je badsw /* not possible */
|
||||
#endif
|
||||
|
||||
movl P_LINK(%eax),%ecx /* unlink from front of process q */
|
||||
movl P_LINK(%ecx),%edx
|
||||
movl %edx,P_LINK(%eax)
|
||||
movl P_RLINK(%ecx),%eax
|
||||
movl %eax,P_RLINK(%edx)
|
||||
|
||||
cmpl P_LINK(%ecx),%esi /* q empty */
|
||||
je rt3
|
||||
btsl %ebx,%edi /* nope, set to indicate full */
|
||||
rt3:
|
||||
movl %edi,_whichrtqs /* update q status */
|
||||
jmp swtch_com
|
||||
|
||||
/* old sw1a */
|
||||
nortqr:
|
||||
movl _whichqs,%edi
|
||||
2:
|
||||
/* XXX - bsf is sloow */
|
||||
@ -246,6 +327,7 @@ sw1a:
|
||||
3:
|
||||
movl %edi,_whichqs /* update q status */
|
||||
|
||||
swtch_com:
|
||||
movl $0,%eax
|
||||
movl %eax,_want_resched
|
||||
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)init_main.c 8.9 (Berkeley) 1/21/94
|
||||
* $Id: init_main.c,v 1.6 1994/08/24 11:50:37 sos Exp $
|
||||
* $Id: init_main.c,v 1.7 1994/08/27 16:14:25 davidg Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -363,6 +363,9 @@ start_init(p, framep)
|
||||
*/
|
||||
cpu_set_init_frame(p, framep);
|
||||
|
||||
/* XXX */
|
||||
p->p_rtprio = RTPRIO_RTOFF;
|
||||
|
||||
/*
|
||||
* Need just enough stack to hold the faked-up "execve()" arguments.
|
||||
*/
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_fork.c 8.6 (Berkeley) 4/8/94
|
||||
* $Id: kern_fork.c,v 1.4 1994/08/06 07:15:04 davidg Exp $
|
||||
* $Id: kern_fork.c,v 1.5 1994/08/18 22:35:00 wollman Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -268,6 +268,11 @@ 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.3 1994/08/02 07:42:07 davidg Exp $
|
||||
* $Id: kern_proc.c,v 1.4 1994/08/18 22:35:03 wollman Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -50,6 +50,9 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/tty.h>
|
||||
|
||||
struct prochd qs[NQS]; /* as good a place as any... */
|
||||
struct prochd rtqs[NQS]; /* Space for REALTIME 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$
|
||||
* $Id: kern_resource.c,v 1.3 1994/08/02 07:42:10 davidg Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -193,6 +193,64 @@ donice(curp, chgp, n)
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* rtprio system call */
|
||||
struct rtprio_args {
|
||||
int who;
|
||||
pid_t rtprio;
|
||||
};
|
||||
|
||||
/*
|
||||
* Set realtime priority
|
||||
*/
|
||||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
rtprio(curp, uap, retval)
|
||||
struct proc *curp;
|
||||
register struct rtprio_args *uap;
|
||||
int *retval;
|
||||
{
|
||||
register struct proc *p;
|
||||
register int n = uap->rtprio;
|
||||
register struct pcred *pcred = curp->p_cred;
|
||||
|
||||
if (uap->who == 0)
|
||||
p = curp;
|
||||
else
|
||||
p = pfind(uap->who);
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
|
||||
struct setrlimit_args {
|
||||
u_int which;
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_synch.c 8.6 (Berkeley) 1/21/94
|
||||
* $Id$
|
||||
* $Id: kern_synch.c,v 1.3 1994/08/02 07:42:17 davidg Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -606,8 +606,10 @@ rqinit()
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < NQS; i++)
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -660,9 +662,13 @@ resetpriority(p)
|
||||
{
|
||||
register unsigned int newpriority;
|
||||
|
||||
newpriority = PUSER + p->p_estcpu / 4 + 2 * p->p_nice;
|
||||
newpriority = min(newpriority, MAXPRI);
|
||||
p->p_usrpri = newpriority;
|
||||
if (newpriority < curpriority)
|
||||
if (p->p_rtprio == RTPRIO_RTOFF) {
|
||||
newpriority = PUSER + p->p_estcpu / 4 + 2 * p->p_nice;
|
||||
newpriority = min(newpriority, MAXPRI);
|
||||
p->p_usrpri = newpriority;
|
||||
if (newpriority < curpriority)
|
||||
need_resched();
|
||||
} else {
|
||||
need_resched();
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
$Id: syscalls.master,v 1.4 1994/08/19 11:45:23 davidg Exp $
|
||||
$Id: syscalls.master,v 1.5 1994/08/26 18:15:15 wollman Exp $
|
||||
; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94
|
||||
;
|
||||
; System call name/number master file.
|
||||
@ -218,7 +218,7 @@
|
||||
163 STD 2 setdomainname
|
||||
164 STD 1 uname
|
||||
165 STD 2 sysarch
|
||||
166 UNIMPL 0 nosys
|
||||
166 STD 2 rtprio
|
||||
167 UNIMPL 0 nosys
|
||||
168 UNIMPL 0 nosys
|
||||
169 UNIMPL 0 nosys
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)param.h 8.2 (Berkeley) 1/21/94
|
||||
* $Id: param.h,v 1.3 1994/08/02 07:53:19 davidg Exp $
|
||||
* $Id: param.h,v 1.4 1994/08/21 04:41:55 paul Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_PARAM_H_
|
||||
@ -81,6 +81,7 @@
|
||||
#include <sys/resource.h>
|
||||
#include <sys/ucred.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/rtprio.h>
|
||||
#endif
|
||||
|
||||
/* Signals. */
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)proc.h 8.8 (Berkeley) 1/21/94
|
||||
* $Id: proc.h,v 1.6 1994/08/25 22:59:35 wollman Exp $
|
||||
* $Id: proc.h,v 1.7 1994/08/28 16:53:35 bde Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_PROC_H_
|
||||
@ -135,7 +135,7 @@ struct proc {
|
||||
|
||||
struct vnode *p_textvp; /* Vnode of executable. */
|
||||
|
||||
long p_spare[4]; /* Pad to 256, avoid shifting eproc. */
|
||||
long p_spare[3]; /* Pad to 256, avoid shifting eproc. */
|
||||
|
||||
/* End area that is zeroed on creation. */
|
||||
#define p_endzero p_startcopy
|
||||
@ -165,7 +165,7 @@ 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
|
||||
@ -246,11 +246,13 @@ extern struct proc *zombproc; /* List of zombie procs. */
|
||||
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 int whichqs; /* Bit mask summary of non-empty Q's. */
|
||||
struct prochd {
|
||||
struct proc *ph_link; /* Linked list of running processes. */
|
||||
struct proc *ph_rlink;
|
||||
} qs[NQS];
|
||||
};
|
||||
|
||||
int chgproccnt __P((uid_t, int));
|
||||
struct proc *pfind __P((pid_t)); /* Find process by id. */
|
||||
|
52
sys/sys/rtprio.h
Normal file
52
sys/sys/rtprio.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* 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 (name).
|
||||
* 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$
|
||||
*/
|
||||
|
||||
#ifndef _SYS_RTPRIO_H_
|
||||
#define _SYS_RTPRIO_H_
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
|
||||
#ifndef KERNEL
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
int rtprio __P((int, int));
|
||||
__END_DECLS
|
||||
#endif /* !KERNEL */
|
||||
#endif /* !_SYS_RTPRIO_H_ */
|
Loading…
Reference in New Issue
Block a user