sched: track CPU clock cycles used by threads
This commit is contained in:
44
sched/core.c
44
sched/core.c
@@ -7,6 +7,8 @@ extern kern_status_t setup_kernel_task(void);
|
||||
extern kern_status_t task_object_type_init(void);
|
||||
extern kern_status_t thread_object_type_init(void);
|
||||
|
||||
static cycles_t __default_quantum = 0;
|
||||
|
||||
kern_status_t sched_init(void)
|
||||
{
|
||||
kern_status_t status = KERN_OK;
|
||||
@@ -33,5 +35,47 @@ kern_status_t sched_init(void)
|
||||
this_cpu->c_current_thread = this_thread;
|
||||
put_cpu(this_cpu);
|
||||
|
||||
start_charge_period();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void start_charge_period(void)
|
||||
{
|
||||
struct thread *self = current_thread();
|
||||
if (!self) {
|
||||
return;
|
||||
}
|
||||
|
||||
self->tr_charge_period_start = get_cycles();
|
||||
}
|
||||
|
||||
void end_charge_period(void)
|
||||
{
|
||||
preempt_disable();
|
||||
struct thread *self = current_thread();
|
||||
if (!self) {
|
||||
return;
|
||||
}
|
||||
|
||||
cycles_t end = get_cycles();
|
||||
preempt_enable();
|
||||
|
||||
cycles_t charge = cycles_diff(self->tr_charge_period_start, end);
|
||||
|
||||
self->tr_quantum_cycles += charge;
|
||||
self->tr_total_cycles += charge;
|
||||
|
||||
if (self->tr_quantum_cycles >= self->tr_quantum_target) {
|
||||
self->tr_flags |= THREAD_F_NEED_RESCHED;
|
||||
}
|
||||
|
||||
self->tr_charge_period_start = 0;
|
||||
|
||||
//printk("%llu cycles charged to %s/%u", charge, self->tr_parent->t_name, self->tr_parent->t_id);
|
||||
}
|
||||
|
||||
cycles_t default_quantum(void)
|
||||
{
|
||||
return __default_quantum;
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ kern_status_t setup_kernel_task(void)
|
||||
kernel_thread->tr_prio = PRIO_NORMAL;
|
||||
kernel_thread->tr_state = THREAD_READY;
|
||||
kernel_thread->tr_parent = __kernel_task;
|
||||
kernel_thread->tr_quantum_target = default_quantum();
|
||||
|
||||
unsigned long flags;
|
||||
task_lock_irqsave(__kernel_task, &flags);
|
||||
|
||||
Reference in New Issue
Block a user