xref: /dragonfly/sys/sys/usched.h (revision 0de090e1)
1 /*
2  * SYS/USCHED.H
3  *
4  *	Userland scheduler API
5  *
6  * $DragonFly: src/sys/sys/usched.h,v 1.15 2008/04/21 15:24:47 dillon Exp $
7  */
8 
9 #ifndef _SYS_USCHED_H_
10 #define _SYS_USCHED_H_
11 
12 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
13 
14 #ifndef _SYS_TYPES_H_
15 #include <sys/types.h>
16 #endif
17 #ifndef _SYS_QUEUE_H_
18 #include <sys/queue.h>
19 #endif
20 #ifndef _SYS_SYSTIMER_H_
21 #include <sys/systimer.h>
22 #endif
23 
24 #define NAME_LENGTH 32
25 
26 struct lwp;
27 struct proc;
28 struct globaldata;
29 
30 struct usched {
31     TAILQ_ENTRY(usched) entry;
32     const char *name;
33     const char *desc;
34     void (*usched_register)(void);
35     void (*usched_unregister)(void);
36     void (*acquire_curproc)(struct lwp *);
37     void (*release_curproc)(struct lwp *);
38     void (*setrunqueue)(struct lwp *);
39     void (*schedulerclock)(struct lwp *, sysclock_t, sysclock_t);
40     void (*recalculate)(struct lwp *);
41     void (*resetpriority)(struct lwp *);
42     void (*heuristic_forking)(struct lwp *, struct lwp *);
43     void (*heuristic_exiting)(struct lwp *, struct proc *);
44     void (*uload_update)(struct lwp *);
45     void (*setcpumask)(struct usched *, cpumask_t);
46     void (*yield)(struct lwp *);
47     void (*changedcpu)(struct lwp *);
48 };
49 
50 union usched_data {
51     /*
52      * BSD4 scheduler.
53      */
54     struct {
55 	short	priority;	/* lower is better */
56 	char	unused01;	/* (currently not used) */
57 	char	rqindex;
58 	int	batch;		/* batch mode heuristic */
59 	int	estcpu;		/* dynamic priority modification */
60 	u_short rqtype;		/* protected copy of rtprio type */
61 	u_short	unused02;
62     } bsd4;
63     struct {
64 	short	priority;	/* lower is better */
65 	char	forked;		/* lock cpu during fork */
66 	char	rqindex;
67 	short	estfast;	/* fast estcpu collapse mode */
68 	short	uload;		/* for delta uload adjustments */
69 	int	estcpu;		/* dynamic priority modification */
70 	u_short rqtype;		/* protected copy of rtprio type */
71 	u_short	qcpu;		/* which cpu are we enqueued on? */
72 	u_short rrcount;	/* reset when moved to runq tail */
73 	u_short unused01;
74 	u_short unused02;
75 	u_short unused03;
76     } dfly;
77 
78     int		pad[6];		/* PAD for future expansion */
79 };
80 
81 /*
82  * Flags for usched_ctl()
83  */
84 #define        USCH_ADD        0x00000001
85 #define        USCH_REM        0x00000010
86 
87 #endif	/* _KERNEL || _KERNEL_STRUCTURES */
88 
89 #define USCHED_SET_SCHEDULER	0
90 #define USCHED_SET_CPU		1
91 #define USCHED_ADD_CPU		2
92 #define USCHED_DEL_CPU		3
93 #define USCHED_GET_CPU		4
94 #define USCHED_GET_CPUMASK	5  /* appeared in DragonFly 4.5 */
95 
96 /*
97  * Kernel variables and procedures, or user system calls.
98  */
99 #ifdef _KERNEL
100 
101 extern struct usched	usched_bsd4;
102 extern struct usched	usched_dfly;
103 extern struct usched	usched_dummy;
104 extern cpumask_t usched_mastermask;
105 extern int sched_ticks; /* From sys/kern/kern_clock.c */
106 
107 int usched_ctl(struct usched *, int);
108 struct usched *usched_init(void);
109 void usched_schedulerclock(struct lwp *, sysclock_t, sysclock_t);
110 
111 #endif
112 
113 #if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL)
114 
115 int usched_set(pid_t, int, void *, int);
116 
117 #endif
118 
119 #endif
120 
121