.. | .. |
---|
209 | 209 | |
---|
210 | 210 | #ifdef CONFIG_PREEMPT |
---|
211 | 211 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count |
---|
212 | | - ldr r0, [tsk, #TI_FLAGS] @ get flags |
---|
213 | 212 | 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 |
---|
214 | 220 | movne r0, #0 @ force flags to 0 |
---|
215 | | - tst r0, #_TIF_NEED_RESCHED |
---|
| 221 | + tst r0, #_TIF_NEED_RESCHED_LAZY |
---|
216 | 222 | blne svc_preempt |
---|
| 223 | +1: |
---|
217 | 224 | #endif |
---|
218 | 225 | |
---|
219 | 226 | svc_exit r5, irq = 1 @ return from exception |
---|
.. | .. |
---|
228 | 235 | 1: bl preempt_schedule_irq @ irq en/disable is done inside |
---|
229 | 236 | ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS |
---|
230 | 237 | tst r0, #_TIF_NEED_RESCHED |
---|
| 238 | + bne 1b |
---|
| 239 | + tst r0, #_TIF_NEED_RESCHED_LAZY |
---|
231 | 240 | 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 | + |
---|
233 | 246 | #endif |
---|
234 | 247 | |
---|
235 | 248 | __und_fault: |
---|