arm64: fpsimd: Bring cond_yield asm macro in line with new rules
PATCH 1/1 arm64: fpsimd: Bring cond_yield asm macro in line with new rules
From: Ard Biesheuvel <[email protected]>
We no longer disable softirqs or preemption when doing kernel mode SIMD, and so for fully preemptible kernels, there is no longer a need to do any explicit yielding (and for non-preemptible kernels, yielding is not needed either).
That leaves voluntary preemption, where only explicit yield calls may result in a reschedule. To retain the existing behavior for such a configuration, we should take the new situation into account, where the preempt count will be zero rather than one, and yielding to pending softirqs is unnecessary.
--- arch/arm64/include/asm/assembler.h | 25 +++++++++---------------- arch/arm64/kernel/asm-offsets.c | 2 -- 2 files changed, 9 insertions(+), 18 deletions(-)
arch/arm64/include/asm/assembler.h +9 -16
@@ -760,32 +760,25 @@ alternative_endif .endm/* -* Check whether preempt/bh-disabled asm code should yield as soon as -* it is able. This is the case if we are currently running in task -* context, and either a softirq is pending, or the TIF_NEED_RESCHED -* flag is set and re-enabling preemption a single time would result in -* a preempt count of zero. (Note that the TIF_NEED_RESCHED flag is -* stored negated in the top word of the thread_info::preempt_count +* Check whether asm code should yield as soon as it is able. This is +* the case if we are currently running in task context, and the +* TIF_NEED_RESCHED flag is set. (Note that the TIF_NEED_RESCHED flag +* is stored negated in the top word of the thread_info::preempt_count * field) */ - .macro cond_yield, lbl:req, tmp:req, tmp2:req + .macro cond_yield, lbl:req, tmp:req, tmp2 +#ifdef CONFIG_PREEMPT_VOLUNTARY get_current_task \tmp ldr \tmp, [\tmp, #TSK_TI_PREEMPT]/* * If we are serving a softirq, there is no point in yielding: the * softirq will not be preempted no matter what we do, so we should -* run to completion as quickly as we can. +* run to completion as quickly as we can. The preempt_count field will +* have BIT(SOFTIRQ_SHIFT) set in this case, so the zero check will +* catch this case too. */ - tbnz \tmp, #SOFTIRQ_SHIFT, .Lnoyield_\@ -#ifdef CONFIG_PREEMPTION - sub \tmp, \tmp, #PREEMPT_DISABLE_OFFSET cbz \tmp, \lbl #endif - adr_l \tmp, irq_stat + IRQ_CPUSTAT_SOFTIRQ_PENDING - get_this_cpu_offset \tmp2 - ldr w\tmp, [\tmp, \tmp2] - cbnz w\tmp, \lbl // yield on pending softirq in task context -.Lnoyield_\@: .endm/*
arch/arm64/kernel/asm-offsets.c +0 -2
@@ -117,8 +117,6 @@ int main(void)DEFINE (DMA_FROM_DEVICE ,DMA_FROM_DEVICE );BLANK ();DEFINE (PREEMPT_DISABLE_OFFSET ,PREEMPT_DISABLE_OFFSET ); -DEFINE (SOFTIRQ_SHIFT ,SOFTIRQ_SHIFT ); -DEFINE (IRQ_CPUSTAT_SOFTIRQ_PENDING , offsetof(irq_cpustat_t , __softirq_pending));BLANK ();DEFINE (CPU_BOOT_TASK , offsetof(struct secondary_data , task));BLANK ();
Signature · 7 lines
2.43.0.275.g3460e3d667-goog _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Quoted 6 lines · Ard Biesheuvel
From: Ard Biesheuvel <[email protected]>
We no longer disable softirqs or preemption when doing kernel mode SIMD, and so for fully preemptible kernels, there is no longer a need to do any explicit yielding (and for non-preemptible kernels, yielding is not needed either).
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Quoted 8 lines · Ard Biesheuvel
From: Ard Biesheuvel <[email protected]>
We no longer disable softirqs or preemption when doing kernel mode SIMD, and so for fully preemptible kernels, there is no longer a need to do any explicit yielding (and for non-preemptible kernels, yielding is not needed either).
[...]
Applied to arm64 (for-next/core), thanks!
[1/1] arm64: fpsimd: Bring cond_yield asm macro in line with new rules
https://git.kernel.org/arm64/c/3931261ecf46
Cheers,
Signature · 10 lines
Will https://fixes.arm64.dev https://next.arm64.dev https://will.arm64.dev _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel