Skip to content

Commit 06b1e01

Browse files
committed
修复 EEVDF 调度器的 yield 处理问题, 修复 uacpi 编译问题.
1 parent 761cb0d commit 06b1e01

File tree

4 files changed

+31
-15
lines changed

4 files changed

+31
-15
lines changed

src/include/driver/uacpi/internal/context.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ struct uacpi_runtime_context {
2626
/*
2727
* pm1{a,b}_evt_blk split into two registers for convenience
2828
*/
29-
struct acpi_fadt fadt;
30-
struct acpi_gas pm1a_status_blk;
31-
struct acpi_gas pm1b_status_blk;
32-
struct acpi_gas pm1a_enable_blk;
33-
struct acpi_gas pm1b_enable_blk;
29+
struct acpi_gas pm1a_status_blk;
30+
struct acpi_gas pm1b_status_blk;
31+
struct acpi_gas pm1a_enable_blk;
32+
struct acpi_gas pm1b_enable_blk;
3433

3534
# define UACPI_SLEEP_TYP_INVALID 0xFF
3635
uacpi_u8 last_sleep_typ_a;

src/include/metadata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101

102102
// 内核编译配置选项
103103
#ifndef EEVDF_SCHEDULER
104-
# define EEVDF_SCHEDULER 0 // 是否启用EEVDF调度器
104+
# define EEVDF_SCHEDULER 1 // 是否启用EEVDF调度器
105105
#endif
106106

107107
#ifndef HEAP_CHECK

src/lib/neoacpi/neoacpi.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ neo_acpi_handle_t *neo_acpi_initialize(neo_acpi_phys_addr rsdt_base_addr) {
4141
return neo_acpi_rsdt_init(handle, roor_table_phy, table_entries);
4242
}
4343

44+
neo_acpi_handle_t *neo_acpi_namespace_initialize(neo_acpi_handle_t *handle) {}
45+
4446
bool table_find_by_signature(const neo_acpi_handle_t *handle, const char signature[4],
4547
acpi_table *table) {
4648
if (!handle || !table) return false;

src/task/eevdf.c

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ static int vruntime_eligible(uint64_t vruntime, cpu_local_t *cpu) {
5656
struct sched_entity *curr = eevdf_sched(cpu)->current;
5757
int64_t avg = eevdf_sched(cpu)->avg_vruntime;
5858
long load = eevdf_sched(cpu)->avg_load;
59+
if (unlikely(load == 0)) return 1;
5960
if (curr && curr->on_rq) {
6061
unsigned long weight = scale_load_down(curr->load.weight);
6162
avg += entity_key(curr, cpu) * weight;
@@ -300,7 +301,11 @@ static void wrap_vruntime(cpu_local_t *cpu) {
300301
if (se->vruntime > offset) se->vruntime -= offset;
301302
if (se->deadline > offset) se->deadline -= offset;
302303
}
303-
eevdf->avg_vruntime -= offset;
304+
if (eevdf->avg_load) {
305+
eevdf->avg_vruntime -= (uint64_t)eevdf->avg_load * offset;
306+
} else {
307+
eevdf->avg_vruntime = 0;
308+
}
304309
}
305310

306311
static int64_t update_curr_se(struct sched_entity *curr) {
@@ -329,24 +334,32 @@ void update_current_task(cpu_local_t *cpu) {
329334
bool resche;
330335
int64_t delta_exec;
331336
delta_exec = update_curr_se(curr);
332-
if (unlikely(delta_exec <= 0)) return;
337+
if (unlikely(delta_exec <= 0)) {
338+
if (curr->is_yield) {
339+
curr->deadline = curr->vruntime + calc_delta_fair(curr->slice, curr);
340+
curr->is_yield = false;
341+
min_vruntime_update(curr,false);
342+
rb_erase(&curr->run_node, eevdf_sched(cpu)->root);
343+
insert_sched_entity(eevdf_sched(cpu)->root, curr);
344+
}
345+
return;
346+
}
333347
curr->vruntime += calc_delta_fair(delta_exec, curr);
334348
update_vlag(curr, cpu);
335349
resche = update_deadline(curr);
336350
update_min_vruntime(cpu);
337351
curr->min_vruntime = eevdf_sched(cpu)->min_vruntime;
352+
if (curr->is_yield) {
353+
curr->deadline = curr->vruntime + calc_delta_fair(curr->slice, curr);
354+
curr->is_yield = false;
355+
resche = true;
356+
}
338357
if (resche || curr->is_idle) {
339358
min_vruntime_update(curr,false);
340359
rb_erase(&curr->run_node, eevdf_sched(cpu)->root);
341360
insert_sched_entity(eevdf_sched(cpu)->root, curr);
342361
}
343-
344-
if (curr->is_yield) {
345-
struct sched_entity *last =
346-
container_of(rb_last(eevdf_sched(cpu)->root), struct sched_entity, run_node);
347-
curr->deadline += calc_delta_fair(curr->slice, curr);
348-
curr->is_yield = false;
349-
}
362+
wrap_vruntime(cpu);
350363
}
351364

352365
void set_entity_yield(tcb_t thread) {
@@ -356,6 +369,7 @@ void set_entity_yield(tcb_t thread) {
356369

357370
void remove_sched_entity(struct rb_root *root, struct sched_entity *se, cpu_local_t *cpu) {
358371
rb_erase(&se->run_node, root);
372+
se->on_rq = false;
359373
struct sched_entity *current = eevdf_sched(cpu)->current;
360374
if (current == se) eevdf_sched(cpu)->current = NULL;
361375
eevdf_sched(cpu)->current = pick_eevdf(cpu);
@@ -413,6 +427,7 @@ void futex_eevdf_entity(tcb_t thread, cpu_local_t *cpu) {
413427
struct sched_entity *entity = (struct sched_entity *)thread->sched_handle;
414428
cow_list_remove(((struct eevdf_t *)cpu->sched_handle)->wait_queue, entity->wait_index);
415429
entity->handle = cpu->sched_handle;
430+
entity->on_rq = true;
416431
insert_sched_entity(((struct eevdf_t *)cpu->sched_handle)->root, entity);
417432
eevdf_sched(cpu)->task_count++;
418433
}

0 commit comments

Comments
 (0)