It does not work reliably for a couple of reasons:
(1) page_lock() fails if a page is !PGT_validated, and a page can
remain in that state for unbounded time.
(2) in the kernel-side race that motivated this patch, pgd_pin() can
lose to vmalloc_sync_all() -- pgd_pin() can try to chaneg a pmd page's
type to l2_pagetable while
vmalloc_sync_all()->set_pmd()->do_mmu_update() has it temporarily
pinned as writable. This is hard to fix on the Xen side.
Hence I give up on this approach, revert the patch, and settle for
kernel-side patching only.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
case MMU_NORMAL_PT_UPDATE:
case MMU_PT_UPDATE_PRESERVE_AD:
{
- unsigned int retries = 0;
p2m_type_t p2mt;
rc = xsm_mmu_normal_update(d, pg_owner, req.val);
(unsigned long)(req.ptr & ~PAGE_MASK));
page = mfn_to_page(mfn);
- retry:
if ( page_lock(page) )
{
switch ( page->u.inuse.type_info & PGT_type_mask )
v, va, req.val, _mfn(mfn));
put_page_type(page);
}
- else if ( retries++ < 5 )
- {
- /* Page type can be in flux, so we retry a few times. */
- goto retry;
- }
unmap_domain_page_with_cache(va, &mapcache);
put_page(page);