vkernel - Change how VPTE_M works to fix seg-faults during paging
* Properly set and clear PG_WRITEABLE
* TAILQ_FOREACH() iterations on m->md.pv_list must be restarted
if we ever drop the spin-lock.
* Change VPAGETABLE semantics and operation, cleaning up some things
and fixing others.
Have the real-kernel only conditionally downgrade the real pte to
read-only for a VPTE_RW vpte. It only downgrades it if VPTE_M is
not set, improving performance.
Fix the virtual kernel to properly invalidate the real-kernel pte's
when clearing VPTE_M. This improves issues that crop up when the
vkernel is paging heavily.
* Replace the linear pv_plist with a RB tree. Also have pmap_remove_pages()
simply call pmap_remove().
Note that pmap_remove_pages()'s old code was broken because it only
scanned the pv_entry list and missed unmanaged pages. Fixing this
also fixes a vmspace reuse issue where the real-host pmap still
contained stale PTEs from prior use.