hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/arch/arm/kernel/entry-armv.S
....@@ -209,11 +209,18 @@
209209
210210 #ifdef CONFIG_PREEMPT
211211 ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
212
- ldr r0, [tsk, #TI_FLAGS] @ get flags
213212 teq r8, #0 @ if preempt count != 0
213
+ bne 1f @ return from exeption
214
+ ldr r0, [tsk, #TI_FLAGS] @ get flags
215
+ tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set
216
+ blne svc_preempt @ preempt!
217
+
218
+ ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count
219
+ teq r8, #0 @ if preempt lazy count != 0
214220 movne r0, #0 @ force flags to 0
215
- tst r0, #_TIF_NEED_RESCHED
221
+ tst r0, #_TIF_NEED_RESCHED_LAZY
216222 blne svc_preempt
223
+1:
217224 #endif
218225
219226 svc_exit r5, irq = 1 @ return from exception
....@@ -228,8 +235,14 @@
228235 1: bl preempt_schedule_irq @ irq en/disable is done inside
229236 ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS
230237 tst r0, #_TIF_NEED_RESCHED
238
+ bne 1b
239
+ tst r0, #_TIF_NEED_RESCHED_LAZY
231240 reteq r8 @ go again
232
- b 1b
241
+ ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count
242
+ teq r0, #0 @ if preempt lazy count != 0
243
+ beq 1b
244
+ ret r8 @ go again
245
+
233246 #endif
234247
235248 __und_fault: