Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Mar 2014 14:31:10 +0100
From:      Wojciech Macek <wma@semihalf.com>
To:        Ian Lepore <ian@freebsd.org>
Cc:        freebsd-arm@freebsd.org
Subject:   Re: arm SMP on Cortex-A15
Message-ID:  <CANsEV8eB1SQHjKrBbG=HCZyb6wuwZmmpq6BKfVatOHm8UtZ9ig@mail.gmail.com>
In-Reply-To: <1395494401.81853.34.camel@revolution.hippie.lan>
References:  <CANsEV8euHTsfviiCMP_aet3qYiK2T-oK%2B-37eay7zAPH2S2vaA@mail.gmail.com> <20131220125638.GA5132@mail.bsdpad.com> <20131222092913.GA89153@mail.bsdpad.com> <CANsEV8fSoygoSUyQqKoEQ7tRxjqDOwrPD8dU7O2V2PXRj35j4A@mail.gmail.com> <20131222123636.GA61193@ci0.org> <CANsEV8fWvUkFHi8DP6Nr807RwPDB1iZrO39fpfa44qOkJPidZA@mail.gmail.com> <1395149146.1149.586.camel@revolution.hippie.lan> <1395254911.80941.9.camel@revolution.hippie.lan> <CANsEV8c047SNF61EgP6AiMR2oY=ofcMuTWYZnd60bRmp2Sk9HA@mail.gmail.com> <1395320561.80941.13.camel@revolution.hippie.lan> <CANsEV8f-Cyte-TO%2BCfWVcC_zw5dkYJT8Qfi92eH7yrfhqBvgjg@mail.gmail.com> <1395494401.81853.34.camel@revolution.hippie.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
Without the unconditional invalidation, the panic shows up just at the
beginning, after rootfs is mounted and init scripts are running. When a
userspace process is exitting, its memory resources are freed - this is the
moment pmap_remove_pages fails due to tharanslation fault. It is the
"typical" crash I observed when TLB-cache holds an old entry. Below there
is a backtrace, but I doubt if it can be helpful.

Regarding old pte/tlb, the TLB cache contains entry from old process
context, when in-memory-PTE value is already correct - at least this was
the scenario when I debugged it last year. So, invalidating after *pte=0 is
definitely not our case. The issue shows up only on a15, where the
tlb-prefetcher can cache pte entries anytime.

I believe I don't have r263251 integrated. I'll give it a try - typically,
the tlb-caused crash appears only on pages containing shared libraries code
(with executable attr), so there is a chance Olivier's fix help.


The fault:

vm_fault(0xc5b894f0, 0, 2, 0) -> 1
Fatal kernel mode data abort: 'Translation Fault (P)'
trapframe: 0xef2cca40
FSR=00000817, FAR=00000030, spsr=60000013
r0 =00000000, r1 =c320a048, r2 =00000000, r3 =c3208074
r4 =c5b7cd08, r5 =c5b7cd04, r6 =c5b05800, r7 =c5b895ac
r8 =c320a044, r9 =fffffffe, r10=c5b895ac, r11=ef2ccae0
r12=00000000, ssp=ef2cca90, slr=c0604148, pc =c0628a60

[ thread pid 83 tid 100050 ]
Stopped at      pmap_remove_pages+0x270:        streq   r3, [r0, #0x030]
db> bt
Tracing pid 83 tid 100050 td 0xc5bc4320
db_trace_self() at db_trace_self
         pc = 0xc061f62c  lr = 0xc024ddbc (db_hex2dec+0x498)
         sp = 0xef2cc738  fp = 0xef2cc750
        r10 = 0xc0708270
db_hex2dec() at db_hex2dec+0x498
         pc = 0xc024ddbc  lr = 0xc024d76c (db_command_loop+0x2f0)
         sp = 0xef2cc758  fp = 0xef2cc7f8
         r4 = 0x00000000  r5 = 0x00000000
         r6 = 0xc0695cf1
db_command_loop() at db_command_loop+0x2f0
         pc = 0xc024d76c  lr = 0xc024d4dc (db_command_loop+0x60)
         sp = 0xef2cc800  fp = 0xef2cc810
         r4 = 0xc0666f88  r5 = 0xc067b997
         r6 = 0xc0752954  r7 = 0xc0748f80
         r8 = 0xef2cca40  r9 = 0xc07084e0
        r10 = 0xc0748f84
db_command_loop() at db_command_loop+0x60
         pc = 0xc024d4dc  lr = 0xc024ffb8 (X_db_symbol_values+0x254)
         sp = 0xef2cc818  fp = 0xef2cc938
         r4 = 0x00000000  r5 = 0xef2cc820
         r6 = 0xc0748fb0
X_db_symbol_values() at X_db_symbol_values+0x254
         pc = 0xc024ffb8  lr = 0xc0430554 (kdb_trap+0x164)
         sp = 0xef2cc940  fp = 0xef2cc968
         r4 = 0x00000000  r5 = 0x00000817
         r6 = 0xc0748fb0  r7 = 0xc0748f80
kdb_trap() at kdb_trap+0x164
         pc = 0xc0430554  lr = 0xc0632ef0 (data_abort_handler+0x7dc)
         sp = 0xef2cc970  fp = 0xef2cc988
         r4 = 0xef2cca40  r5 = 0x600000d3
         r6 = 0x00000030  r7 = 0x00000817
         r8 = 0xc5b894f0  r9 = 0x00000001
        r10 = 0xef2cca40
data_abort_handler() at data_abort_handler+0x7dc
         pc = 0xc0632ef0  lr = 0xc0632cc0 (data_abort_handler+0x5ac)
         sp = 0xef2cc990  fp = 0xef2cca38
         r4 = 0x00000817  r5 = 0xc5bc4320
         r6 = 0xc5a47a0c  r7 = 0x00000004
data_abort_handler() at data_abort_handler+0x5ac
         pc = 0xc0632cc0  lr = 0xc0621214 (exception_exit)
         sp = 0xef2cca40  fp = 0xef2ccae0
         r4 = 0xc5b7cd08  r5 = 0xc5b7cd04
         r6 = 0xc5b05800  r7 = 0xc5b895ac
         r8 = 0xc320a044  r9 = 0xfffffffe
        r10 = 0xc5b895ac
exception_exit() at exception_exit
         pc = 0xc0621214  lr = 0xc0604148 (PHYS_TO_VM_PAGE+0x48)
         sp = 0xef2cca94  fp = 0xef2ccae0
         r0 = 0x00000000  r1 = 0xc320a048
         r2 = 0x00000000  r3 = 0xc3208074
         r4 = 0xc5b7cd08  r5 = 0xc5b7cd04
         r6 = 0xc5b05800  r7 = 0xc5b895ac
         r8 = 0xc320a044  r9 = 0xfffffffe
        r10 = 0xc5b895ac r12 = 0x00000000
pmap_remove_pages() at pmap_remove_pages+0x270
         pc = 0xc0628a60  lr = 0xc05f2d08 (vmspace_exit+0xd8)
         sp = 0xef2ccae8  fp = 0xef2ccb10
         r4 = 0xc5b895a8  r5 = 0xc5bc4320
         r6 = 0x00000001  r7 = 0xc5a47960
         r8 = 0xc5b895ac  r9 = 0xc5b894f0
        r10 = 0xc0753be0
vmspace_exit() at vmspace_exit+0xd8
         pc = 0xc05f2d08  lr = 0xc03a7348 (exit1+0x930)
         sp = 0xef2ccb18  fp = 0xef2ccb70
         r4 = 0xc5a479fc  r5 = 0x00000004
         r6 = 0xc583861c  r7 = 0x00000001
         r8 = 0xc5a47960  r9 = 0xc5bc4320
        r10 = 0xc5a47a0c
exit1() at exit1+0x930
         pc = 0xc03a7348  lr = 0xc03f1604 (sigexit+0x8c4)
         sp = 0xef2ccb78  fp = 0xef2ccd68
         r4 = 0x00000002  r5 = 0xc5bc4320
         r6 = 0xc5a47960  r7 = 0xc5a47a0c
         r8 = 0xc5bc4320  r9 = 0xc5b7a000
        r10 = 0x00000002
sigexit() at sigexit+0x8c4
         pc = 0xc03f1604  lr = 0xc03f23a0 (postsig+0x39c)
         sp = 0xef2ccd70  fp = 0xef2cce18
         r4 = 0x00000001  r5 = 0xc5bc4320
         r6 = 0xc5a47960  r7 = 0xc5b7aab8
         r8 = 0xc5a47a0c  r9 = 0xc5b7a000
        r10 = 0x00000002
postsig() at postsig+0x39c
         pc = 0xc03f23a0  lr = 0xc044388c (ast+0x4f4)
         sp = 0xef2cce20  fp = 0xef2cce58
         r4 = 0x00000001  r5 = 0xc5bc4320
         r6 = 0xc5a47960  r7 = 0xc5a47a0c
         r8 = 0xc5a47a0c  r9 = 0x01020804
        r10 = 0x00000ab8
ast() at ast+0x4f4
         pc = 0xc044388c  lr = 0xc0621080 (swi_entry+0x6c)
         sp = 0xef2cce60  fp = 0xbfffe438
         r4 = 0x40000013  r5 = 0xc5bc4320
         r6 = 0x00000001  r7 = 0x00000154
         r8 = 0x20037008  r9 = 0xbfffee5c
        r10 = 0xbfffea10
swi_entry() at swi_entry+0x6c
         pc = 0xc0621080  lr = 0xc0621080 (swi_entry+0x6c)
         sp = 0xef2cce60  fp = 0xbfffe438
Unable to unwind further
db>



2014-03-22 14:20 GMT+01:00 Ian Lepore <ian@freebsd.org>:

> On Fri, 2014-03-21 at 07:20 +0100, Wojciech Macek wrote:
> > No, changing flushD to flushID did not make any difference, but I think
> it
> > should be there - D-only flushing might not be sufficient.
> >
>
> Olivier reminded me right after I posted that: last week I made a change
> to cpufunc.c that makes flushD and flushID the same.  So of course it
> made no difference.  :)  It really should be flushID though, in case
> that ever changes.
>
> You didn't say whether you have that change, which was r263251.
>
> > Currently, I'm running pmap_kernel_internal attached below. It is doing
> > unconditional flushID at the end, just like the old comment was saying :)
> > SMP seems to be stable.
> >
>
> That seems to say that somehow there is a valid TLB entry even though
> the old pte for that entry is zero.  That means there's a problem
> somewhere else in the code, but I don't see it.  It looks to me like we
> do a TLB flush everywhere that we zero out a pte.
>
> You said without the unconditional flush it panics at startup.  Where in
> startup?  Early, or after init is launched or what?  Where does the
> panic backtrace to?
>
> If we've got some other pte/tlb maintenance problem, I'd hate to hide it
> with this unconditional flush and have it appear as some other problem
> later that will be even harder to track down.
>
> -- Ian
>
>
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANsEV8eB1SQHjKrBbG=HCZyb6wuwZmmpq6BKfVatOHm8UtZ9ig>