Lines Matching refs:rescue
242 s64 served = rq->scx.rescue.curr->se.sum_exec_runtime - rq->scx.rescue.exec_snap; in scx_rescue_slice_remaining()
244 return max(rq->scx.rescue.slice - served, 0); in scx_rescue_slice_remaining()
285 rq->scx.rescue.budget -= delta_exec; in scx_rescue_charge()
292 scx_task_slice_ended(rq, rq->scx.rescue.curr); in scx_rescue_charge()
308 rq->scx.rescue.curr = NULL; in scx_rescue_end()
309 if (list_empty(&rq->scx.rescue.dsq.list)) in scx_rescue_end()
310 rq->scx.rescue.budget = min(rq->scx.rescue.budget, scx_rescue_quantum_ns); in scx_rescue_end()
354 bool in_session = rq->scx.rescue.curr || !list_empty(&rq->scx.rescue.dsq.list); in scx_rescue_accrue()
363 delta = now - rq->scx.rescue.clock; in scx_rescue_accrue()
364 rq->scx.rescue.clock = now; in scx_rescue_accrue()
371 rq->scx.rescue.budget = cap; in scx_rescue_accrue()
373 rq->scx.rescue.budget = in scx_rescue_accrue()
374 min(cap, rq->scx.rescue.budget + in scx_rescue_accrue()
385 u32 depth = rq->scx.rescue.dsq.nr ?: 1; in scx_rescue_next_slice()
392 struct timer_list *timer = &rq->scx.rescue.timer; in scx_rescue_timer_arm()
402 if (!rq->scx.rescue.curr && rq->scx.rescue.budget < scx_rescue_quantum_ns) { in scx_rescue_timer_arm()
403 s64 deficit = scx_rescue_quantum_ns - rq->scx.rescue.budget; in scx_rescue_timer_arm()
429 WARN_ON_ONCE(rq->scx.rescue.curr); in scx_rescue_admit()
431 rq->scx.rescue.curr = p; in scx_rescue_admit()
432 rq->scx.rescue.slice = slice; in scx_rescue_admit()
433 rq->scx.rescue.exec_snap = p->se.sum_exec_runtime; in scx_rescue_admit()
452 if (!rq->scx.rescue.curr && list_empty(&rq->scx.rescue.dsq.list) && in scx_rescue_try_admit()
453 rq->scx.rescue.budget >= scx_rescue_quantum_ns) { in scx_rescue_try_admit()
481 p = list_first_entry_or_null(&rq->scx.rescue.dsq.list, struct task_struct, in scx_rescue_check_overload()
495 if (time_before64(get_jiffies_64(), rq->scx.rescue.kill_at + in scx_rescue_check_overload()
512 rq->scx.rescue.kill_at = get_jiffies_64(); in scx_rescue_check_overload()
534 struct rq *rq = timer_container_of(rq, timer, scx.rescue.timer); in scx_rescue_timerfn()
539 p = rq->scx.rescue.curr; in scx_rescue_timerfn()
540 if (!p && list_empty(&rq->scx.rescue.dsq.list)) in scx_rescue_timerfn()
550 if (rq->scx.rescue.budget < scx_rescue_quantum_ns) in scx_rescue_timerfn()
554 p = list_first_entry(&rq->scx.rescue.dsq.list, struct task_struct, in scx_rescue_timerfn()
556 scx_task_unlink_from_dsq(p, &rq->scx.rescue.dsq); in scx_rescue_timerfn()
559 &rq->scx.rescue.dsq, rq); in scx_rescue_timerfn()
562 } else if (p->scx.dsq && rq->scx.rescue.budget > 2 * scx_rescue_quantum_ns) { in scx_rescue_timerfn()
593 if (rq->scx.rescue.curr) in scx_rescue_flush()
594 scx_task_slice_ended(rq, rq->scx.rescue.curr); in scx_rescue_flush()
597 list_for_each_entry_safe(p, n, &rq->scx.rescue.dsq.list, scx.dsq_list.node) { in scx_rescue_flush()
598 scx_task_unlink_from_dsq(p, &rq->scx.rescue.dsq); in scx_rescue_flush()
600 &rq->scx.rescue.dsq, rq); in scx_rescue_flush()
603 timer_delete(&rq->scx.rescue.timer); in scx_rescue_flush()
608 struct task_struct *p = rq->scx.rescue.curr; in scx_rescue_dump()
611 rq->scx.rescue.dsq.nr, in scx_rescue_dump()
612 div_s64(rq->scx.rescue.budget, NSEC_PER_USEC), in scx_rescue_dump()
672 BUG_ON(scx_init_dsq(&rq->scx.rescue.dsq, SCX_DSQ_RESCUE, NULL)); in scx_rescue_init()
673 timer_setup(&rq->scx.rescue.timer, scx_rescue_timerfn, TIMER_PINNED); in scx_rescue_init()
674 rq->scx.rescue.kill_at = get_jiffies_64(); in scx_rescue_init()
750 return &rq->scx.rescue.dsq; in scx_resolve_local_dsq()