Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 Dec 2017 23:17:02 -0800
From:      Mark Millard <markmi@dsl-only.net>
To:        Freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Manually switching booting a rpi2 via a kernel from a USB SSD (also a sometimes boot hang somewhat after the Release APs notice)
Message-ID:  <D290C44D-5E45-4F6E-A1D8-DE88E3092715@dsl-only.net>

next in thread | raw e-mail | index | archive | help
The mechanism for holding mmcssd0 in the slot failed
on the rpi2 V1.1 that I use --but the eject mechanism
still works.

I've found that the following odd sequence allows
me to only need the mmcsd0 temporarily during
booting.

*) mmcsd0 does need a rpi-firmware, u-boot.bin,
   for the rpi2, ubldr.bin, and a UFS with a
   kernel and loader that gets far enough to
   allow an unload, /boot/loader.conf (as
   necessary), and an /etc/fstab (more notes
   below).

A) I have /etc/fstab that is on that UFS file
   system specify the USB SSD root file system
   as / . (I use a ufs label and /dev/ufs/LABEL
   specification.)
   [Historically this is how I had / on the USB SSD
    so this is not new. I used to have the mmcsd0
    have a full root file system that I could boot
    as well, a form of disaster recovery.]

B) Hold the mmcsd0 in the slot during the following,
   starting from just before powering on.

C) During the 10 sec countdown, escape into the
   loader.

D) Let go of mmcsd0: it is not needed until the
next reboot.

E) unload
F) boot kernel

It turns out that (F) picks up the kernel and such
from the USB SSD instead of from mmcsd0.

This sequence should not require mmcsd0 to require
most kernel updates but still could someday
require some of the following to be updated on
mmcsd0: the rpi-firmware, u-boot, ubldr.bin,
the loader [file(s)?], /boot/loader.conf,
/etc/fstab .


Warning: Both before and after this issue I have
observed examples of boot hangups somewhat after
the Release APs notice. For example. . .

. . .
Release APs
Trying to mount root from ufs:/dev/ufs/RPI2rootfs [rw,noatime]...
random: unblocking device.
arc4random: no preloaded entropy cache
arc4random: no preloaded entropy cache
arc4random: no preloaded entropy cache

that never seems to time out but just sits there.
It allows the <CR>~^B sequence to get to the db>
prompt. I've looked around a little a couple of
times.

Context: head -r326726 based.

One common point is that show allchains has
everything listed as sleeping except:

chain 32:
 thread 100001 (pid 1, kernel) blocked on sx "umadrain" XLOCK
 thread 100077 (pid 23, uma) is on a run queue
chain 33:

(Note: uma's thread number has varied, as has the one
for [pagedaemon].)

bd> ps
  pid  ppid  pgrp   uid  state   wmesg   wchan       cmd
   28     0     0     0  DL      syncer  0xc095a31c  [syncer]
   27     0     0     0  DL      vlruwt  0xd7417730  [vnlru]
   26     0     0     0  DL      psleep  0xc0959c00  [bufdaemon]
   25     0     0     0  RL                          [bufspacedaemon]
   24     0     0     0  DL      psleep  0xc095e8f8  [vmdaemon]
   23     0     0     0  RL      (threaded)          [pagedaemon]
100065                   RunQ                        [pagedaemon]
100076                   D       launds  0xc095e804  [laundry: dom0]
100077                   RunQ                        [uma]
. . .
    1     0     0     0  DL      umadrai 0xc095e528  [kernel]
    0     0     0     0  RLs     (threaded)          [kernel]
100000                   D       swapin  0xc09673c8  [swapper]
. . .
100072                   D       -       0xd75b7e80  [if_io_tqg_1]
100073                   RunQ                        [if_io_tqg_2]
100074                   D       -       0xd75b7d80  [if_io_tqg_3]
100075                   D       -       0xd75b7d00  [if_config_tqg_0]
100078                   D       -       0xd83dc100  [softirq_0]
100079                   D       -       0xd75b7c00  [softirq_1]
100080                   RunQ                        [softirq_2]
100081                   D       -       0xd75b7b00  [softirq_3]

(Which if_io_tqg_<?> and softirq_<?> pair has RunQ varies.)

All RunQ's are shown above. One or two [idle: CPU<?>]'s have
state CanRun and the other [idle: CPU<?>]'s have state RUN.
They are the only items with those states. Example from the
same hangup:

   10     0     0     0  RL      (threaded)          [idle]
100002                   Run     CPU 0               [idle: cpu0]
100003                   Run     CPU 1               [idle: cpu1]
100004                   CanRun                      [idle: cpu2]
100005                   CanRun                      [idle: cpu3]
  =20

db> show lock 0xc095e528
 class: sx
 name: umadrain
 state: XLOCK: 0xd6cbe740 (tid 100077, pid 23, "uma")
 waiters: shared

db> show thread 100001
Thread 100001 at 0xd40a7000:
 proc (pid 1): 0xd40a3000
 name: kernel
 stack: 0xd40ac000-0xd40adfff
 flags: 0x4  pflags: 0x20000000
 state: INHIBITED: {SLEEPING}
 wmesg: umadrain  wchan: 0xc095e528 sleeptimo 0. 0 (curr 51d. =
5eac6a0400000000)
 priority: 84
 container lock: sleepq chain (0xc0957244)
 last voluntary switch: 1297717 ms ago
 last involuntary switch: 1297809 ms ago

db> show thread 100077
Thread 100077 at 0xd6cbe740:
 proc (pid 23): 0xd6cab000
 name: uma
 stack: 0xd83ca000-0xd83cbfff
 flags: 0x4  pflags: 0x200000
 state: RUNQ
 priority: 84
 container lock: sched lock 2 (0xc0952640)
 last voluntary switch: 1297815 ms ago
 last involuntary switch: 1297815 ms ago

db> show thread 100073
Thread 100073 at 0xd7406740:
 proc (pid 0): 0xc09673c8
 name: if_io_tqg_2
 stack: 0xd742a000-0xd742bfff
 flags: 0x4  pflags: 0x200000
 state: RUNQ
 priority: 24
 container lock: sched lock 2 (0xc0952640)
 last voluntary switch: 1297818 ms ago

db> show thread 100080
Thread 100080 at 0xd7431ae0:
 proc (pid 0): 0xc09673c8
 name: softirq_2
 stack: 0xd83f5000-0xd83f6fff
 flags: 0x4  pflags: 0x200000
 state: RUNQ
 priority: 24
 container lock: sched lock 2 (0xc0952640)
 last voluntary switch: 1297816 ms ago

db> show lock 0xc0952640
 class: spin mutex
 name: sched lock 2
 flags: {SPIN, RECURSE}
 state: {UNOWNED}

db> show lock 0xc0957244
 class: spin mutex
 name: sleepq chain
 flags: {SPIN, RECURSE}
 state: {UNOWNED}

db> show thread 100065
Thread 100065 at 0xd6cbb000:
 proc (pid 23): 0xd6cab000
 name: pagedaemon
 stack: 0xd7403000-0xd7404fff
 flags: 0x14  pflags: 0x20200000
 state: RUNQ
 priority: 84
 container lock: sched lock 1 (0xc0951f80)
 last voluntary switch: 1029 ms ago
 last involuntary switch: 28606 ms ago

db> show lock 0xc0951f80
 class: spin mutex
 name: sched lock 1
 flags: {SPIN, RECURSE}
 state: {UNOWNED}


=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?D290C44D-5E45-4F6E-A1D8-DE88E3092715>