Commit 0fdcccfa authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

tick/nohz: Call tick_nohz_task_switch() with interrupts disabled



Call tick_nohz_task_switch() slightly earlier after the context switch
to benefit from disabled IRQs. This way the function doesn't need to
disable them once more.

Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20210512232924.150322-10-frederic@kernel.org
parent a1dfb631
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -4212,6 +4212,7 @@ static struct rq *finish_task_switch(struct task_struct *prev)
	vtime_task_switch(prev);
	vtime_task_switch(prev);
	perf_event_task_sched_in(prev, current);
	perf_event_task_sched_in(prev, current);
	finish_task(prev);
	finish_task(prev);
	tick_nohz_task_switch();
	finish_lock_switch(rq);
	finish_lock_switch(rq);
	finish_arch_post_lock_switch();
	finish_arch_post_lock_switch();
	kcov_finish_switch(current);
	kcov_finish_switch(current);
@@ -4257,7 +4258,6 @@ static struct rq *finish_task_switch(struct task_struct *prev)
		put_task_struct_rcu_user(prev);
		put_task_struct_rcu_user(prev);
	}
	}


	tick_nohz_task_switch();
	return rq;
	return rq;
}
}


+1 −6
Original line number Original line Diff line number Diff line
@@ -487,13 +487,10 @@ void tick_nohz_dep_clear_signal(struct signal_struct *sig, enum tick_dep_bits bi
 */
 */
void __tick_nohz_task_switch(void)
void __tick_nohz_task_switch(void)
{
{
	unsigned long flags;
	struct tick_sched *ts;
	struct tick_sched *ts;


	local_irq_save(flags);

	if (!tick_nohz_full_cpu(smp_processor_id()))
	if (!tick_nohz_full_cpu(smp_processor_id()))
		goto out;
		return;


	ts = this_cpu_ptr(&tick_cpu_sched);
	ts = this_cpu_ptr(&tick_cpu_sched);


@@ -502,8 +499,6 @@ void __tick_nohz_task_switch(void)
		    atomic_read(&current->signal->tick_dep_mask))
		    atomic_read(&current->signal->tick_dep_mask))
			tick_nohz_full_kick();
			tick_nohz_full_kick();
	}
	}
out:
	local_irq_restore(flags);
}
}


/* Get the boot-time nohz CPU list from the kernel parameters. */
/* Get the boot-time nohz CPU list from the kernel parameters. */