Re: git: b19740f4ce7a - main - swap_pager: lock vnode in swapdev_strategy()

From: Peter Jeremy <peterj_at_freebsd.org>
Date: Fri, 26 Nov 2021 10:53:03 UTC
On 2021-Nov-25 19:35:10 +0000, Konstantin Belousov <kib@FreeBSD.org> wrote:
>    swap_pager: lock vnode in swapdev_strategy()
>    
>    VOP_STRATEGY() requires locked vnode.  Note that we lock the swap vnode
>    while pages are busy, but this would only cause real LoR if pages belong
>    to the swap vnode, which must not be the case for correct use.
>    
>    Reported and tested by: peterj

Thanks for those fixes.  Unfortunately, I've bumped into another edge
case:  The system can panic during shutdown because it tries to swap
in data after the network is shutdown.  For reasons I haven't tracked
down, a "swapoff" can fail even though there should be more than
enough RAM.  As an example:

Stopping cron.
Waiting for PIDS: 1024.
swapoff: /usr/obj/swapfile: Cannot allocate memory
Stopping ntpd.
Waiting for PIDS: 1012.
Stopping tincd for: vpn
Waiting for PIDS: 758.
Stopping rtsold.
Waiting for PIDS: 351.
Stopping devd.
Waiting for PIDS: 754.
Writing entropy file: .
Writing early boot entropy file: .
.
Terminated
Nov 26 03:18:44 rock64 syslogd: exiting on signal 15
Waiting (max 60 seconds) for system process `vnlru' to stop... done
Waiting (max 60 seconds) for system process `syncer' to stop... 
Syncing disks, vnodes remaining... 0 0 0 done
Waiting (max 60 seconds) for system thread `bufdaemon' to stop... done
Waiting (max 60 seconds) for system thread `bufspacedaemon-0' to stop... done
All buffers synced.
No strategy for buffer at 0xffff0000c0cd3000
vnode 0xffffa00006475e00: type VBAD
    usecount 3, writecount 0, refcount 974016 seqc users 1
    hold count flags ()
    flags (VIRF_DOOMED|VV_VMSIZEVNLOCK)
    lock type nfs: SHARED (count 1)
swap_pager: I/O error - pagein failed; blkno 184,size 4096, error 45
panic: VOP_STRATEGY failed bp=0xffff0000c0cd3000 vp=0
cpuid = 0
time = 1637857131
KDB: stack backtrace:
db_trace_self() at db_trace_self
db_trace_self_wrapper() at db_trace_self_wrapper+0x30
vpanic() at vpanic+0x178
panic() at panic+0x44
bufstrategy() at bufstrategy+0x80
swapdev_strategy() at swapdev_strategy+0xcc
swap_pager_getpages_locked() at swap_pager_getpages_locked+0x460
swapoff_one() at swapoff_one+0x3dc
swapoff_all() at swapoff_all+0x98
bufshutdown() at bufshutdown+0x2ac
kern_reboot() at kern_reboot+0x240
sys_reboot() at sys_reboot+0x358
do_el0_sync() at do_el0_sync+0x4a4
handle_el0_sync() at handle_el0_sync+0x90
--- exception, esr 0x56000000
KDB: enter: panic
[ thread pid 1 tid 100002 ]
Stopped at      kdb_enter+0x48: undefined       f900c11f
db>

-- 
Peter Jeremy