[RFC/PATCH v4 7/7] ARM: ARM11 MPCore: cpu_v6_set_pte_ext is not preempt safe
George G. Davis
gdavis at mvista.com
Tue Oct 18 19:29:37 EDT 2011
On Tue, Oct 18, 2011 at 05:52:37PM -0400, Nicolas Pitre wrote:
> On Tue, 18 Oct 2011, gdavis at mvista.com wrote:
>
> > @@ -122,7 +122,22 @@ ENTRY(cpu_v6_switch_mm)
> >
> > ENTRY(cpu_v6_set_pte_ext)
> > #ifdef CONFIG_MMU
> > +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT)
> > + stmdb sp!, {r4, r5}
> > + get_thread_info r5
> > + ldr r4, [r5, #TI_PREEMPT] @ get preempt count
> > + add r3, r4, #1 @ increment it
> > + str r3, [r5, #TI_PREEMPT] @ disable preempt
> > +#endif
> > armv6_set_pte_ext cpu_v6
> > +#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT)
> > + str r4, [r5, #TI_PREEMPT] @ restore preempt count
> > + teq r4, #0 @ preempt count == 0?
> > + ldreq r4, [r5, #TI_FLAGS] @ load flags if yes
> > + tst r4, #_TIF_NEED_RESCHED @ need resched?
> > + ldmia sp!, {r4, r5}
> > + bne preempt_schedule @ ret via preempt_schedule
> > +#endif
>
> Same issue as previous patch.
Same mistake, I second guessed myself and removed the movne r4, #0
before submitting. : /
> Wouldn't it be better if you disabled interrupts around the small
> critical region within armv6_set_pte_ext instead? That would certainly
> be a lighter solution. Something like:
>
> diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S
> index 307a4def8d..9bc2dbfe4e 100644
> --- a/arch/arm/mm/proc-macros.S
> +++ b/arch/arm/mm/proc-macros.S
> @@ -167,8 +167,11 @@
> tstne r1, #L_PTE_PRESENT
> moveq r3, #0
>
> + mrs r2, cpsr
> + cpsid i
> str r3, [r0]
> mcr p15, 0, r0, c7, c10, 1 @ flush_pte
> + msr cpsr_c, r2
> .endm
I do like this better, less overhead than the preempt_{disable,enable}
case.
Thanks!
--
Regards,
George
>
>
> Nicolas
More information about the linux-arm-kernel
mailing list