mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 03:24:19 +02:00
arm64: entry: Use preempt_count() and need_resched() helper
The generic entry code uses preempt_count() and need_resched() helpers to check if it should do preempt_schedule_irq(). Currently, arm64 use its own check logic, that is "READ_ONCE(current_thread_info()->preempt_count == 0", which is equivalent to "preempt_count() == 0 && need_resched()". In preparation for moving arm64 over to the generic entry code, use these helpers to replace arm64's own code and move it ahead. No functional changes. Reviewed-by: Ada Couprie Diaz <ada.coupriediaz@arm.com> Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
77c1953946
commit
c74c44c6ae
|
|
@ -299,14 +299,6 @@ static inline bool arm64_preempt_schedule_irq(void)
|
|||
if (!need_irq_preemption())
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Note: thread_info::preempt_count includes both thread_info::count
|
||||
* and thread_info::need_resched, and is not equivalent to
|
||||
* preempt_count().
|
||||
*/
|
||||
if (READ_ONCE(current_thread_info()->preempt_count) != 0)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* DAIF.DA are cleared at the start of IRQ/FIQ handling, and when GIC
|
||||
* priority masking is used the GIC irqchip driver will clear DAIF.IF
|
||||
|
|
@ -701,8 +693,10 @@ static __always_inline void __el1_irq(struct pt_regs *regs,
|
|||
do_interrupt_handler(regs, handler);
|
||||
irq_exit_rcu();
|
||||
|
||||
if (arm64_preempt_schedule_irq())
|
||||
preempt_schedule_irq();
|
||||
if (!preempt_count() && need_resched()) {
|
||||
if (arm64_preempt_schedule_irq())
|
||||
preempt_schedule_irq();
|
||||
}
|
||||
|
||||
exit_to_kernel_mode(regs, state);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user