@@ -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
306311static 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
352365void set_entity_yield (tcb_t thread ) {
@@ -356,6 +369,7 @@ void set_entity_yield(tcb_t thread) {
356369
357370void 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