[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Re: Making pages writable again in paging_log_dirty mode
> That's the opposite problem. The shadow code needs to remove all the > writeable mappings of a page (because the guest is using it as a > pagetable) and finds that after removing all writeable shadow PTEs that > map the page, the typecount has not reached zero. So: > - there is some other special reason for the frame to have a > typecount. Or, > - somehow you've removed a writeable shadow entry without decrementing > the type count. That shouldn't be a problem because we know that > actions by dom0 (p2m changes, for example) cause writeable shadow > PTEs to be torn down (via shadow_put_page_from_l1e) correctly. Or, > - you've accidentally called get_page_and_type() once too often, > creating two typecounts for only one shadow PTE. Thanks Tim. It make sense that I may accidentally calling get_page_and_type() once too often. I modified the condition in which I manually call an extra get_page_and_type() when trying to make PTEs writable from dom0, but now I get this error condition: (XEN) sh error: sh_remove_shadows(): can't find all shadows of mfn 02673 (shadow_flags=00000008) I think I'm accounting for the page type refcounts correctly... but I'm probably wrong. Here's the code that's trying to add writable mappings back: SHADOW_FOREACH_L1E(sl1mfn, sl1e, 0, done_l1, { flags_l1 = shadow_l1e_get_flags(*sl1e); if ((flags_l1 & _PAGE_PRESENT) && !(flags_l1 & _PAGE_RW)) { mfn = shadow_l1e_get_mfn(*sl1e); pfn = mfn_to_gfn(v->domain, mfn); log_dirty_lock(v->domain); if (mfn_valid(mfn) && VALID_M2P(pfn) && sh_mfn_is_dirty(v->domain, mfn)) { /* hack: because of the external mapping condition * ref count not incremented when this is called from * hypercall originating from dom0, need to do it * manually */ struct page_info *page = mfn_to_page(mfn); if (((page->u.inuse.type_info & PGT_type_mask) == PGT_writable_page) && ((page->u.inuse.type_info & PGT_count_mask) == 0) && get_page_type(page, PGT_writable_page)) { shadow_l1e_t rw_sl1e = shadow_l1e_add_flags(*sl1e, _PAGE_RW); shadow_set_l1e(v, sl1e, rw_sl1e, sl1mfn); cow.made_rw_count++; } } log_dirty_unlock(v->domain); } }); Any ideas? Thanks, Mike _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |