On 11/20/15 06:53, David Gwynne wrote:

On 20 Nov 2015, at 09:48, Steven Chamberlain <[email protected]> wrote:

Hi,

Fred wrote:
I've just updated to:
OpenBSD 5.8-current (GENERIC) #801: Wed Nov 18 16:37:51 MST 2015

I'd used:
OpenBSD 5.8-current (GENERIC) #799: Wed Nov 18 01:34:20 MST 2015

but I still had the following panic:

panic: psycho0: uncorrectable DMA error AFAR 663f8450 (pa=0 tte=0/6218a012)
AFSR 410000ff40800000

Damn!  although this was stable for a couple of hours yesterday
(and that's quite an improvement to how it was) - today I booted
it up and it crashed on my very first SSH login attempt.

Thank you for re-testing anyway.  I notice your machine crashed in
process sshd also.  My backtrace looks slightly different to yours so I
share it here:

my guess this is something to do with handling of long mbuf chains for 
transmit. i say that because ssh is very good at generating these long chains, 
and it has caused problems on various other chips. either that or the chip has 
alignment or minimum transfer requirements that such packets dont respect.

if you're inclined to play with the code, try making the code coalesce 
(dc_coal) every packet and see if the problem still occurs.

dlg

Thanks, I'll have a play with this and see what happens.

I am currently running a kernel with the following patch, as suggested by tedu@, below [1] and currently it has been stable.

Cheers

Fred
--

[1]
Index: subr_pool.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_pool.c,v
retrieving revision 1.193
diff -u -p -u -p -r1.193 subr_pool.c
--- subr_pool.c 11 Sep 2015 09:26:13 -0000      1.193
+++ subr_pool.c 20 Nov 2015 10:38:12 -0000
@@ -256,7 +256,7 @@ pool_init(struct pool *pp, size_t size,
         * go into an RB tree, so we can match a returned item with
         * its header based on the page address.
         */
-       if (pgsize - (size * items) > sizeof(struct pool_item_header)) {
+       if (pgsize > size * items + sizeof(struct pool_item_header)) {
                off = pgsize - sizeof(struct pool_item_header);
        } else if (sizeof(struct pool_item_header) * 2 >= size) {
                off = pgsize - sizeof(struct pool_item_header);



Reply via email to