sched: track CPU clock cycles used by threads

This commit is contained in:
2023-04-28 21:05:48 +01:00
parent 6b1b4a2416
commit e2131b08ac
3 changed files with 53 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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);