Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Jun 2019 19:40:36 -0700
From:      Mark Millard <marklmi@yahoo.com>
To:        FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Subject:   Re: crash of 32-bit powerpc -r347549 kernel built via system-clang-8 (crash is while trying to mount the root file system)
Message-ID:  <4354EA25-69C2-4CAB-8273-62457333BD30@yahoo.com>
In-Reply-To: <45D010BF-7654-43A6-8FF4-CCDEEF4004F6@yahoo.com>
References:  <45D010BF-7654-43A6-8FF4-CCDEEF4004F6@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help


On 2019-Jun-3, at 17:24, Mark Millard <marklmi at yahoo.com> wrote:

> I tried (cross) building a 32-bit powerpc kernel and world (non-debug) 
> with system-clang (on amd64) and use of devel/powerpc64-binutils . The
> installed kernel panics trying to mount the root file system.
> 
> FYI: Typed from picture of screen . . .
> 
> Trying to mount root from ufs:/dev/ufs/FBSDG4Srootfs [rw,noatime]...
> panic: getnewbuf_empty: Locked buf 0xd2800000 on free queue.
> . . .
> 0xd6919080: at kdb_backtrace+0x64
> 0xd69190e0: at vpanic+0x200
> 0xd6919150: at panic+0x50
> 0xd6919190: at getnewbuf+0x594
> 0xd69191f0: at getblkx+0x540
> 0xd69192a0: at breadn_flags+0x90
> 0xd69192f0: at ffs_use_bread+0x9c
> 0xd6919330: at readsuper+0x68
> 0xd6919370: at ffs_sbget+0xcc
> 0xd69193c0: at ffs_mount+0x18b8
> 0xd69194f0: at vfs_domount+0xa74
> 0xd69196a0: at vfs_donmount+0x944
> 0xd6919700: at kernel_mount+0x64
> 0xd6919740: at parse_mount+0x52c
> 0xd6919840: at vfs_mountroot+0x71c
> 0xd69199b0: at start_init+0x44
> 0xd6919a10: at fork_exit_0xcc
> 0xd6919a40: at fork_trampoline+0xc
> KDB: enter panic
> [ thread pid 1 tid 100002 ]
> Stopped at kdb_enter+0x74: addi r3,r0,0x0
> 
> This reproduces with each boot attempt.
> 
> Replacing the kernel with one built via gcc 4.2.1 and booting
> the result does not panic.
> 
> 
> FYI for the context of the panic call:
> 
> /usr/src/sys/kern/vfs_bio.c :
> 
> static struct buf *
> buf_alloc(struct bufdomain *bd)
> {
>        struct buf *bp;
>        int freebufs;
> 
>        /*
>         * We can only run out of bufs in the buf zone if the average buf
>         * is less than BKVASIZE.  In this case the actual wait/block will
>         * come from buf_reycle() failing to flush one of these small bufs.
>         */
>        bp = NULL;
>        freebufs = atomic_fetchadd_int(&bd->bd_freebuffers, -1);
>        if (freebufs > 0)
>                bp = uma_zalloc(buf_zone, M_NOWAIT);
>        if (bp == NULL) {
>                atomic_add_int(&bd->bd_freebuffers, 1);
>                bufspace_daemon_wakeup(bd);
>                counter_u64_add(numbufallocfails, 1);
>                return (NULL);
>        }
>        /*
>         * Wake-up the bufspace daemon on transition below threshold.
>         */
>        if (freebufs == bd->bd_lofreebuffers)
>                bufspace_daemon_wakeup(bd);
> 
>        if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL) != 0)
>                panic("getnewbuf_empty: Locked buf %p on free queue.", bp);


I tried making a debug kernel build via system-clang-8. It
reports differently but still during getnewbuf being active
on the stack (again typed from a picture):

Trying to mount root from ufs:/dev/ufs/FBSDG4Srootfs [rw,noatime]...
. . . (ignore witness/diagnostic warnings) . . .
panic: bq_remove: Locked buf 0xd2a00000 not on a queue.
. . .
0xd6b7bfd0: at kdb_backtrace+0x64
0xd6b7c030: at vpanic+0x200
0xd6b7c0a0: at panic+0x50
0xd6b7c0e0: at bq_remove+01e0
0xd6b7c100: at buf_import+0x8c
0xd6b7c130: at uma_zalloc_arg+0x544
0xd6b7c190: at getnewbuf+0x380
0xd6b7c1f0: at getblkx+0x620
0xd6b7c290: at breadn_flags+0x90
0xd6b7c2e0: at ffs_use_bread+0xa8
0xd6b7c320: at readsuper+0x68
0xd6b7c360: at ffs_sbget+0xcc
0xd6b7c3b0: at ffs_mount+0xefc
0xd6b7c4e0: at vfs_domount+0xa754
0xd6b7c690: at vfs_donmount+0x78c
0xd6b7c6f0: at kernel_mount+0x7c
0xd6b7c730: at parse_mount+0x52c
0xd6b7c830: at vfs_mountroot+0x660
0xd6b7c9a0: at start_init+0x4c
0xd6b7ca10: at fork_exit_0xb0
0xd6b7ca40: at fork_trampoline+0xc

/usr/src/sys/kern/vfs_bio.c :

static void
bq_remove(struct bufqueue *bq, struct buf *bp)
{

        CTR3(KTR_BUF, "bq_remove(%p) vp %p flags %X",
            bp, bp->b_vp, bp->b_flags);
        KASSERT(bp->b_qindex != QUEUE_NONE,
            ("bq_remove: buffer %p not on a queue.", bp));
. . .

For reference:

static int
buf_import(void *arg, void **store, int cnt, int domain, int flags)
{
        struct buf *bp;
        int i;
                
        BQ_LOCK(&bqempty);
        for (i = 0; i < cnt; i++) {
                bp = TAILQ_FIRST(&bqempty.bq_queue);
                if (bp == NULL)
                        break;
                bq_remove(&bqempty, bp);
                store[i] = bp;
        }
        BQ_UNLOCK(&bqempty);
                
        return (i);
}



===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4354EA25-69C2-4CAB-8273-62457333BD30>