Re: git: b19740f4ce7a - main - swap_pager: lock vnode in swapdev_strategy()
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