[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/mm: When removing/adding a page from/to the physmap, keep in mind it could be shared
# HG changeset patch # User Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> # Date 1328890027 0 # Node ID 0362b6cf03bfc41ddc3e1c4f24076730435965dd # Parent 9496b7cf14206642140587c3821217aa974f839d x86/mm: When removing/adding a page from/to the physmap, keep in mind it could be shared When removing the m2p mapping it is unconditionally set to invalid, which breaks sharing. When adding to the physmap, if the previous holder of that entry is a shared page, we unshare to default to normal case handling. And, we cannot add a shared page directly to the physmap. Proper interfaces must be employed, otherwise book-keeping goes awry. Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> Acked-by: Tim Deegan <tim@xxxxxxx> Committed-by: Tim Deegan <tim@xxxxxxx> --- diff -r 9496b7cf1420 -r 0362b6cf03bf xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c Fri Feb 10 16:07:07 2012 +0000 +++ b/xen/arch/x86/mm/p2m.c Fri Feb 10 16:07:07 2012 +0000 @@ -438,7 +438,7 @@ for ( i = 0; i < (1UL << page_order); i++ ) { mfn_return = p2m->get_entry(p2m, gfn + i, &t, &a, p2m_query, NULL); - if ( !p2m_is_grant(t) ) + if ( !p2m_is_grant(t) && !p2m_is_shared(t) ) set_gpfn_from_mfn(mfn+i, INVALID_M2P_ENTRY); ASSERT( !p2m_is_valid(t) || mfn + i == mfn_x(mfn_return) ); } @@ -500,6 +500,22 @@ for ( i = 0; i < (1UL << page_order); i++ ) { omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query, NULL); +#ifdef __x86_64__ + if ( p2m_is_shared(ot) ) + { + /* Do an unshare to cleanly take care of all corner + * cases. */ + int rc; + rc = mem_sharing_unshare_page(p2m->domain, gfn + i, 0); + if ( rc ) + { + p2m_unlock(p2m); + return rc; + } + omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, p2m_query, NULL); + ASSERT(!p2m_is_shared(ot)); + } +#endif /* __x86_64__ */ if ( p2m_is_grant(ot) ) { /* Really shouldn't be unmapping grant maps this way */ @@ -528,6 +544,14 @@ /* Then, look for m->p mappings for this range and deal with them */ for ( i = 0; i < (1UL << page_order); i++ ) { + if ( page_get_owner(mfn_to_page(_mfn(mfn + i))) == dom_cow ) + { + /* This is no way to add a shared page to your physmap! */ + gdprintk(XENLOG_ERR, "Adding shared mfn %lx directly to dom %hu " + "physmap not allowed.\n", mfn+i, d->domain_id); + p2m_unlock(p2m); + return -EINVAL; + } if ( page_get_owner(mfn_to_page(_mfn(mfn + i))) != d ) continue; ogfn = mfn_to_gfn(d, _mfn(mfn+i)); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |