19 #ifndef _COBALT_KERNEL_SCHED_H 20 #define _COBALT_KERNEL_SCHED_H 22 #include <linux/percpu.h> 23 #include <cobalt/kernel/lock.h> 24 #include <cobalt/kernel/thread.h> 25 #include <cobalt/kernel/schedqueue.h> 26 #include <cobalt/kernel/sched-tp.h> 27 #include <cobalt/kernel/sched-weak.h> 28 #include <cobalt/kernel/sched-sporadic.h> 29 #include <cobalt/kernel/sched-quota.h> 30 #include <cobalt/kernel/vfile.h> 31 #include <cobalt/kernel/assert.h> 32 #include <asm/xenomai/machine.h> 40 #define XNRESCHED 0x10000000 41 #define XNINSW 0x20000000 42 #define XNINTCK 0x40000000 45 #define XNIDLE 0x00010000 46 #define XNHTICK 0x00008000 47 #define XNINIRQ 0x00004000 48 #define XNHDEFER 0x00002000 51 xnsched_queue_t runnable;
73 #ifdef CONFIG_XENO_OPT_SCHED_WEAK 75 struct xnsched_weak weak;
77 #ifdef CONFIG_XENO_OPT_SCHED_TP 81 #ifdef CONFIG_XENO_OPT_SCHED_SPORADIC 83 struct xnsched_sporadic pss;
85 #ifdef CONFIG_XENO_OPT_SCHED_QUOTA 87 struct xnsched_quota quota;
92 struct xntimer htimer;
94 struct xntimer rrbtimer;
96 struct xnthread rootcb;
97 #ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH 98 struct xnthread *last;
100 #ifdef CONFIG_XENO_ARCH_FPU 102 struct xnthread *fpuholder;
104 #ifdef CONFIG_XENO_OPT_WATCHDOG 106 struct xntimer wdtimer;
110 #ifdef CONFIG_XENO_OPT_STATS 112 xnticks_t last_account_switch;
114 xnstat_exectime_t *current_account;
118 DECLARE_PER_CPU(
struct xnsched, nksched);
120 extern cpumask_t cobalt_cpu_affinity;
122 extern struct list_head nkthreadq;
124 extern int cobalt_nrthreads;
126 #ifdef CONFIG_XENO_OPT_VFILE 130 union xnsched_policy_param;
132 struct xnsched_class {
133 void (*sched_init)(
struct xnsched *sched);
134 void (*sched_enqueue)(
struct xnthread *thread);
135 void (*sched_dequeue)(
struct xnthread *thread);
136 void (*sched_requeue)(
struct xnthread *thread);
137 struct xnthread *(*sched_pick)(
struct xnsched *sched);
138 void (*sched_tick)(
struct xnsched *sched);
139 void (*sched_rotate)(
struct xnsched *sched,
140 const union xnsched_policy_param *p);
141 void (*sched_migrate)(
struct xnthread *thread,
168 bool (*sched_setparam)(
struct xnthread *thread,
169 const union xnsched_policy_param *p);
170 void (*sched_getparam)(
struct xnthread *thread,
171 union xnsched_policy_param *p);
172 void (*sched_trackprio)(
struct xnthread *thread,
173 const union xnsched_policy_param *p);
174 void (*sched_protectprio)(
struct xnthread *thread,
int prio);
175 int (*sched_declare)(
struct xnthread *thread,
176 const union xnsched_policy_param *p);
177 void (*sched_forget)(
struct xnthread *thread);
178 void (*sched_kick)(
struct xnthread *thread);
179 #ifdef CONFIG_XENO_OPT_VFILE 180 int (*sched_init_vfile)(
struct xnsched_class *schedclass,
181 struct xnvfile_directory *vfroot);
182 void (*sched_cleanup_vfile)(
struct xnsched_class *schedclass);
185 struct xnsched_class *next;
191 #define XNSCHED_CLASS_WEIGHT(n) (n * XNSCHED_CLASS_WEIGHT_FACTOR) 194 #define XNSCHED_RUNPRIO 0x80000000 196 #define xnsched_for_each_thread(__thread) \ 197 list_for_each_entry(__thread, &nkthreadq, glink) 200 static inline int xnsched_cpu(
struct xnsched *sched)
205 static inline int xnsched_cpu(
struct xnsched *sched)
211 static inline struct xnsched *xnsched_struct(
int cpu)
213 return &per_cpu(nksched, cpu);
216 static inline struct xnsched *xnsched_current(
void)
219 return raw_cpu_ptr(&nksched);
222 static inline struct xnthread *xnsched_current_thread(
void)
224 return xnsched_current()->
curr;
228 static inline int xnsched_resched_p(
struct xnsched *sched)
230 return sched->
status & XNRESCHED;
234 static inline void xnsched_set_self_resched(
struct xnsched *sched)
236 sched->
status |= XNRESCHED;
239 #define xnsched_realtime_domain cobalt_pipeline.domain 244 static inline void xnsched_set_resched(
struct xnsched *sched)
246 struct xnsched *current_sched = xnsched_current();
248 if (current_sched == sched)
249 current_sched->
status |= XNRESCHED;
250 else if (!xnsched_resched_p(sched)) {
251 cpumask_set_cpu(xnsched_cpu(sched), ¤t_sched->
resched);
252 sched->
status |= XNRESCHED;
253 current_sched->
status |= XNRESCHED;
257 #define xnsched_realtime_cpus cobalt_pipeline.supported_cpus 259 static inline int xnsched_supported_cpu(
int cpu)
261 return cpumask_test_cpu(cpu, &xnsched_realtime_cpus);
266 static inline void xnsched_set_resched(
struct xnsched *sched)
268 xnsched_set_self_resched(sched);
271 #define xnsched_realtime_cpus CPU_MASK_ALL 273 static inline int xnsched_supported_cpu(
int cpu)
280 #define for_each_realtime_cpu(cpu) \ 281 for_each_online_cpu(cpu) \ 282 if (xnsched_supported_cpu(cpu)) \ 284 int ___xnsched_run(
struct xnsched *sched);
286 void __xnsched_run_handler(
void);
288 static inline int __xnsched_run(
struct xnsched *sched)
312 (XNINIRQ|XNINSW|XNRESCHED)) != XNRESCHED)
315 return ___xnsched_run(sched);
320 struct xnsched *sched = xnsched_current();
329 if (unlikely(sched->
curr->lock_count > 0))
332 return __xnsched_run(sched);
335 void xnsched_lock(
void);
337 void xnsched_unlock(
void);
339 static inline int xnsched_interrupt_p(
void)
341 return xnsched_current()->
lflags & XNINIRQ;
344 static inline int xnsched_root_p(
void)
346 return xnthread_test_state(xnsched_current_thread(),
XNROOT);
349 static inline int xnsched_unblockable_p(
void)
351 return xnsched_interrupt_p() || xnsched_root_p();
354 static inline int xnsched_primary_p(
void)
356 return !xnsched_unblockable_p();
359 #ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH 361 struct xnsched *xnsched_finish_unlocked_switch(
struct xnsched *sched);
363 #define xnsched_resched_after_unlocked_switch() xnsched_run() 366 int xnsched_maybe_resched_after_unlocked_switch(
struct xnsched *sched)
368 return sched->
status & XNRESCHED;
374 xnsched_finish_unlocked_switch(
struct xnsched *sched)
376 XENO_BUG_ON(COBALT, !hard_irqs_disabled());
377 return xnsched_current();
380 static inline void xnsched_resched_after_unlocked_switch(
void) { }
383 xnsched_maybe_resched_after_unlocked_switch(
struct xnsched *sched)
390 #ifdef CONFIG_XENO_OPT_WATCHDOG 391 static inline void xnsched_reset_watchdog(
struct xnsched *sched)
396 static inline void xnsched_reset_watchdog(
struct xnsched *sched)
401 bool xnsched_set_effective_priority(
struct xnthread *thread,
404 #include <cobalt/kernel/sched-idle.h> 405 #include <cobalt/kernel/sched-rt.h> 407 int xnsched_init_proc(
void);
409 void xnsched_cleanup_proc(
void);
411 void xnsched_register_classes(
void);
413 void xnsched_init(
struct xnsched *sched,
int cpu);
415 void xnsched_destroy(
struct xnsched *sched);
417 struct xnthread *xnsched_pick_next(
struct xnsched *sched);
419 void xnsched_putback(
struct xnthread *thread);
421 int xnsched_set_policy(
struct xnthread *thread,
422 struct xnsched_class *sched_class,
423 const union xnsched_policy_param *p);
425 void xnsched_track_policy(
struct xnthread *thread,
426 struct xnthread *target);
428 void xnsched_protect_priority(
struct xnthread *thread,
431 void xnsched_migrate(
struct xnthread *thread,
434 void xnsched_migrate_passive(
struct xnthread *thread,
460 struct xnsched_class *sched_class,
461 const union xnsched_policy_param *sched_param)
463 sched_class->sched_rotate(sched, sched_param);
466 static inline int xnsched_init_thread(
struct xnthread *thread)
470 xnsched_idle_init_thread(thread);
471 xnsched_rt_init_thread(thread);
473 #ifdef CONFIG_XENO_OPT_SCHED_TP 474 ret = xnsched_tp_init_thread(thread);
478 #ifdef CONFIG_XENO_OPT_SCHED_SPORADIC 479 ret = xnsched_sporadic_init_thread(thread);
483 #ifdef CONFIG_XENO_OPT_SCHED_QUOTA 484 ret = xnsched_quota_init_thread(thread);
492 static inline int xnsched_root_priority(
struct xnsched *sched)
494 return sched->rootcb.cprio;
497 static inline struct xnsched_class *xnsched_root_class(
struct xnsched *sched)
499 return sched->rootcb.sched_class;
502 static inline void xnsched_tick(
struct xnsched *sched)
504 struct xnthread *curr = sched->
curr;
505 struct xnsched_class *sched_class = curr->sched_class;
512 if (sched_class == curr->base_class &&
513 sched_class->sched_tick &&
514 xnthread_test_state(curr, XNTHREAD_BLOCK_BITS|
XNRRB) ==
XNRRB &&
515 curr->lock_count == 0)
516 sched_class->sched_tick(sched);
519 static inline int xnsched_declare(
struct xnsched_class *sched_class,
520 struct xnthread *thread,
521 const union xnsched_policy_param *p)
525 if (sched_class->sched_declare) {
526 ret = sched_class->sched_declare(thread, p);
530 if (sched_class != thread->base_class)
531 sched_class->nthreads++;
536 static inline int xnsched_calc_wprio(
struct xnsched_class *sched_class,
539 return prio + sched_class->weight;
542 #ifdef CONFIG_XENO_OPT_SCHED_CLASSES 544 static inline void xnsched_enqueue(
struct xnthread *thread)
546 struct xnsched_class *sched_class = thread->sched_class;
548 if (sched_class != &xnsched_class_idle)
549 sched_class->sched_enqueue(thread);
552 static inline void xnsched_dequeue(
struct xnthread *thread)
554 struct xnsched_class *sched_class = thread->sched_class;
556 if (sched_class != &xnsched_class_idle)
557 sched_class->sched_dequeue(thread);
560 static inline void xnsched_requeue(
struct xnthread *thread)
562 struct xnsched_class *sched_class = thread->sched_class;
564 if (sched_class != &xnsched_class_idle)
565 sched_class->sched_requeue(thread);
569 bool xnsched_setparam(
struct xnthread *thread,
570 const union xnsched_policy_param *p)
572 return thread->base_class->sched_setparam(thread, p);
575 static inline void xnsched_getparam(
struct xnthread *thread,
576 union xnsched_policy_param *p)
578 thread->sched_class->sched_getparam(thread, p);
581 static inline void xnsched_trackprio(
struct xnthread *thread,
582 const union xnsched_policy_param *p)
584 thread->sched_class->sched_trackprio(thread, p);
585 thread->wprio = xnsched_calc_wprio(thread->sched_class, thread->cprio);
588 static inline void xnsched_protectprio(
struct xnthread *thread,
int prio)
590 thread->sched_class->sched_protectprio(thread, prio);
591 thread->wprio = xnsched_calc_wprio(thread->sched_class, thread->cprio);
594 static inline void xnsched_forget(
struct xnthread *thread)
596 struct xnsched_class *sched_class = thread->base_class;
598 --sched_class->nthreads;
600 if (sched_class->sched_forget)
601 sched_class->sched_forget(thread);
604 static inline void xnsched_kick(
struct xnthread *thread)
606 struct xnsched_class *sched_class = thread->base_class;
608 xnthread_set_info(thread,
XNKICKED);
610 if (sched_class->sched_kick)
611 sched_class->sched_kick(thread);
613 xnsched_set_resched(thread->sched);
623 static inline void xnsched_enqueue(
struct xnthread *thread)
625 struct xnsched_class *sched_class = thread->sched_class;
627 if (sched_class != &xnsched_class_idle)
628 __xnsched_rt_enqueue(thread);
631 static inline void xnsched_dequeue(
struct xnthread *thread)
633 struct xnsched_class *sched_class = thread->sched_class;
635 if (sched_class != &xnsched_class_idle)
636 __xnsched_rt_dequeue(thread);
639 static inline void xnsched_requeue(
struct xnthread *thread)
641 struct xnsched_class *sched_class = thread->sched_class;
643 if (sched_class != &xnsched_class_idle)
644 __xnsched_rt_requeue(thread);
647 static inline bool xnsched_setparam(
struct xnthread *thread,
648 const union xnsched_policy_param *p)
650 struct xnsched_class *sched_class = thread->base_class;
652 if (sched_class == &xnsched_class_idle)
653 return __xnsched_idle_setparam(thread, p);
655 return __xnsched_rt_setparam(thread, p);
658 static inline void xnsched_getparam(
struct xnthread *thread,
659 union xnsched_policy_param *p)
661 struct xnsched_class *sched_class = thread->sched_class;
663 if (sched_class == &xnsched_class_idle)
664 __xnsched_idle_getparam(thread, p);
666 __xnsched_rt_getparam(thread, p);
669 static inline void xnsched_trackprio(
struct xnthread *thread,
670 const union xnsched_policy_param *p)
672 struct xnsched_class *sched_class = thread->sched_class;
674 if (sched_class == &xnsched_class_idle)
675 __xnsched_idle_trackprio(thread, p);
677 __xnsched_rt_trackprio(thread, p);
679 thread->wprio = xnsched_calc_wprio(sched_class, thread->cprio);
682 static inline void xnsched_protectprio(
struct xnthread *thread,
int prio)
684 struct xnsched_class *sched_class = thread->sched_class;
686 if (sched_class == &xnsched_class_idle)
687 __xnsched_idle_protectprio(thread, prio);
689 __xnsched_rt_protectprio(thread, prio);
691 thread->wprio = xnsched_calc_wprio(sched_class, thread->cprio);
694 static inline void xnsched_forget(
struct xnthread *thread)
696 --thread->base_class->nthreads;
697 __xnsched_rt_forget(thread);
700 static inline void xnsched_kick(
struct xnthread *thread)
702 xnthread_set_info(thread,
XNKICKED);
703 xnsched_set_resched(thread->sched);
struct xnthread * curr
Definition: sched.h:64
Snapshot revision tag.
Definition: vfile.h:482
#define XNKICKED
Forced out of primary mode.
Definition: thread.h:69
#define XNRRB
Undergoes a round-robin scheduling.
Definition: thread.h:45
int cpu
Definition: sched.h:67
#define XNROOT
Root thread (that is, Linux/IDLE)
Definition: thread.h:48
volatile unsigned inesting
Definition: sched.h:90
Scheduling information structure.
Definition: sched.h:58
unsigned long lflags
Definition: sched.h:62
unsigned long status
Definition: sched.h:60
static void xnsched_rotate(struct xnsched *sched, struct xnsched_class *sched_class, const union xnsched_policy_param *sched_param)
Rotate a scheduler runqueue.
Definition: sched.h:459
static int xnsched_run(void)
The rescheduling procedure.
Definition: sched.h:318
cpumask_t resched
Definition: sched.h:69