Messages in this thread | | | Date | Wed, 22 May 2013 09:32:05 +0200 | From | Stanislav Meduna <> | Subject | Re: [PATCH - sort of] x86: Livelock in handle_pte_fault |
| |
On 22.05.2013 02:39, Steven Rostedt wrote:
> The threads do a mlockall too right? I'm not sure mlock will lock memory > for a new thread's stack.
They don't. However, https://rt.wiki.kernel.org/index.php/Threaded_RT-application_with_memory_locking_and_stack_handling_example claims
"Threads started after a call to mlockall(MCL_CURRENT | MCL_FUTURE) will generate page faults immediately since the new stack is immediately forced to RAM (due to the MCL_FUTURE flag)."
and as the ps -o min_flt reports zero page faults for the threads so I think it is also the case.
Anyway, both particular addresses were surely mapped long before the fault.
>> - the application runs with mlockall() > > With both MCL_FUTURE and MCL_CURRENT set, right?
Yes.
>> - there is no swap > > Hmm, doesn't mean that code can't be swapped out, as it is just mapped > from the file it came from. But you'd think mlockall would prevent that.
mlockall also forces the stack to be mapped immediately and not generating pagefaults when incrementally expanding.
> Seems a bit extreme. Looks to me there's a missing flush TLB somewhere.
Probably.
One interesting thing: the test for "need to reload something" looks a bit differently for the ARM architecture in arch/arm/include/asm/mmu_context.h:
if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next)) || prev != next) {
and they do something also for the !CONFIG_SMP && !cpumask_test_and_set_cpu(cpu, mm_cpumask(next) case. I don't know what exactly is semantics of mm_cpumask, but the difference is suspicious.
> Do you have a reproducer you can share. That way, maybe we can all share > the joy.
Unfortunately not and I have really tried :( If I get new ideas, I will try again.
Thanks -- Stano
| |