lkml.org 
[lkml]   [2023]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 7/9] sched: Simplify sched_tick_remote()
    Use guards to reduce gotos and simplify control flow.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    kernel/sched/core.c | 43 ++++++++++++++++++-------------------------
    1 file changed, 18 insertions(+), 25 deletions(-)

    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -5651,9 +5651,6 @@ static void sched_tick_remote(struct wor
    struct tick_work *twork = container_of(dwork, struct tick_work, work);
    int cpu = twork->cpu;
    struct rq *rq = cpu_rq(cpu);
    - struct task_struct *curr;
    - struct rq_flags rf;
    - u64 delta;
    int os;

    /*
    @@ -5663,30 +5660,26 @@ static void sched_tick_remote(struct wor
    * statistics and checks timeslices in a time-independent way, regardless
    * of when exactly it is running.
    */
    - if (!tick_nohz_tick_stopped_cpu(cpu))
    - goto out_requeue;
    + if (tick_nohz_tick_stopped_cpu(cpu)) {
    + guard(rq_lock_irq)(rq);
    + struct task_struct *curr = rq->curr;
    +
    + if (cpu_online(cpu)) {
    + update_rq_clock(rq);
    +
    + if (!is_idle_task(curr)) {
    + /*
    + * Make sure the next tick runs within a
    + * reasonable amount of time.
    + */
    + u64 delta = rq_clock_task(rq) - curr->se.exec_start;
    + WARN_ON_ONCE(delta > (u64)NSEC_PER_SEC * 3);
    + }
    + curr->sched_class->task_tick(rq, curr, 0);

    - rq_lock_irq(rq, &rf);
    - curr = rq->curr;
    - if (cpu_is_offline(cpu))
    - goto out_unlock;
    -
    - update_rq_clock(rq);
    -
    - if (!is_idle_task(curr)) {
    - /*
    - * Make sure the next tick runs within a reasonable
    - * amount of time.
    - */
    - delta = rq_clock_task(rq) - curr->se.exec_start;
    - WARN_ON_ONCE(delta > (u64)NSEC_PER_SEC * 3);
    + calc_load_nohz_remote(rq);
    + }
    }
    - curr->sched_class->task_tick(rq, curr, 0);
    -
    - calc_load_nohz_remote(rq);
    -out_unlock:
    - rq_unlock_irq(rq, &rf);
    -out_requeue:

    /*
    * Run the remote tick once per second (1Hz). This arbitrary

    \
     
     \ /
      Last update: 2023-08-01 23:26    [W:5.798 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site