Port-sparc64 archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

re: netbsd-8 panic



> Any ideas about what happened here?
> 
> 
> mpt0: mpt_done: IOC task terminated!
> mpt0: mpt_done: IOC has error - logging...
> 
> mpt0: unknown ctlop: 0x0
> mpt0: mpt_done: IOC fatal error: restarting...
> panic: iommu_dvmamap_unload: error dvmastart is zero!

looks like a mpt(4) bug to me.  it calls bus_dmamap_unload() when
the _load() call didn't actually succeed.

> cpu0: Begin traceback...
> cpu0: End traceback...
> Frame pointer is at 0xe0046fd1
> Call traceback:
>   netbsd:cpu_reboot+0x1b4(193de20, 0, ffff, 2, 1c96000, 1c9e2d0) fp = e0047091
>   netbsd:vpanic+0x174(104, 0, 18d5f38, 1cdd000, 7, 113496140) fp = e0047141
>   netbsd:panic+0x24(18d5f38, e0047b38, 1ce5000, 1ce6400, 104, 1ce62c0) fp = e00471f1
>   netbsd:iommu_dvmamap_unload+0x98(18d5f38, 16e5d90, ff070000000001, 1960000, 0, c134bfff) fp = e00472b1
>   netbsd:mpt_restart+0x12c(10ec93198, 111fe3018, 0, 195a000, 1121df5d8, 10ec6aa70) fp = e0047361

in mpt_restart:

        for (i = 0; i < MPT_MAX_REQUESTS(mpt); i++) {
                req = &mpt->request_pool[i];
                xs = req->xfer;
                if (xs != NULL) {
                        if (xs->datalen != 0)
                                bus_dmamap_unload(mpt->sc_dmat, req->dmap);

note how xs->datalen is used to determine whether or not to
unload, but this value isn't zeroed ift he load fails.  i am
going to guess that perhaps mpt_run_xfer() has failed the
load (perhaps low on free ram?), and then when mpd_done() is
next called and it decides to restart the adapter it then
calls mpt_restart() as above.

not sure exactly what the fix should look like if i'm right.
something that keeps track of whether an xfer (xs) is loaded
or not, and needs to be unloaded.


.mrg.


Home | Main Index | Thread Index | Old Index