I suspect an error in the computation of *moved in swp_pager_meta_transfer that would produce incorrect output from swap_pager_freespace.
In the main loop of swp_pager_meta_transfer (after the first iteration) pindex is the value that was passed to LOOKUP_GE to produce a new swblk sb. This code seems to assume that pindex == sb->p, but if there's a gap between the end of one swblk and the beginning of another, then they differ according to the size of that gap.
Concretely, if on iteration 2, pindex is 32 and sb->p is 48, then the vm_page_lookup calls will be for values in the range [32,48), while the sb block represents values in [48, 64). So the wrong pages will be looked up.
If I'm right, then this patch should fix it. If I'm wrong because there can be no gaps, then we should be using LOOKUP instead of LOOKUP_GE. If I'm wrong for some other reason, because my understanding is too limited, I apologize bothering you with this.