When a FreeBSD partition is passed, like /dev/ada0s1b, we are okay.
According to the comment, it looks like the code was to skip BSD label to prevent damages when a FreBSD slice, like dev/ada0s1, is passed. If that' done, swapping out will destroy FreeBSD partitions sooner or later anyway, skipping 8-k doesn't help much.
It looks this 2-page offset is passed incorrectly to some of blist() and/or page-in actions and results in system hung.
One can reproduce with with more than 2 swap devices easily. Fill out one swap device and "swapoff" filled one hangs forever. This can happen with a single swap device; however, if a single swap device is fully used,
the system is under slashing condition and it is very difficult to distinguish
between slashing and hanging/not-responding.
I replaced to use sw_nblks in some places to be explicit although nblks and sw_nblks are the same in most places.