* [PATCH] x86/mm: Clean up unshare path for foreign mappings
@ 2012-06-19 14:48 Andres Lagar-Cavilla
2012-06-28 11:46 ` Tim Deegan
0 siblings, 1 reply; 2+ messages in thread
From: Andres Lagar-Cavilla @ 2012-06-19 14:48 UTC (permalink / raw)
To: xen-devel; +Cc: andres, tim
xen/arch/x86/mm.c | 34 +++++++++++-----------------------
1 files changed, 11 insertions(+), 23 deletions(-)
In its current shape, if Xen unshares a foreign gfn successfully while building
a foreign writable map, it is left with a reference to the old shared page in
the "target" var.
Instead, push unsharing request down on the initial get_page_from_gfn call,
which will DTRT.
This allows for greatly simplifying the unshare related condition handling,
removing ugly comments and s86_64 ifdef-ery.
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
diff -r f0806cb74009 -r b3a8ef4c556c xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -3563,10 +3563,12 @@ int do_mmu_update(
l1_pgentry_t l1e = l1e_from_intpte(req.val);
p2m_type_t l1e_p2mt = p2m_ram_rw;
struct page_info *target = NULL;
+ p2m_query_t q = (l1e_get_flags(l1e) & _PAGE_RW) ?
+ P2M_UNSHARE : P2M_ALLOC;
if ( paging_mode_translate(pg_owner) )
target = get_page_from_gfn(pg_owner, l1e_get_pfn(l1e),
- &l1e_p2mt, P2M_ALLOC);
+ &l1e_p2mt, q);
if ( p2m_is_paged(l1e_p2mt) )
{
@@ -3581,29 +3583,15 @@ int do_mmu_update(
rc = -ENOENT;
break;
}
-#ifdef __x86_64__
- /* XXX: Ugly: pull all the checks into a separate function.
- * Don't want to do it now, not to interfere with mem_paging
- * patches */
- else if ( p2m_ram_shared == l1e_p2mt )
+ /* If we tried to unshare and failed */
+ else if ( (q & P2M_UNSHARE) && p2m_is_shared(l1e_p2mt) )
{
- /* Unshare the page for RW foreign mappings */
- if ( l1e_get_flags(l1e) & _PAGE_RW )
- {
- unsigned long gfn = l1e_get_pfn(l1e);
- rc = mem_sharing_unshare_page(pg_owner, gfn, 0);
- if ( rc )
- {
- if ( target )
- put_page(target);
- /* Notify helper, don't care about errors, will not
- * sleep on wq, since we're a foreign domain. */
- (void)mem_sharing_notify_enomem(pg_owner, gfn, 0);
- break;
- }
- }
- }
-#endif
+ /* We could not have obtained a page ref. */
+ ASSERT(target == NULL);
+ /* And mem_sharing_notify has already been called. */
+ rc = -ENOMEM;
+ break;
+ }
rc = mod_l1_entry(va, l1e, mfn,
cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] x86/mm: Clean up unshare path for foreign mappings
2012-06-19 14:48 [PATCH] x86/mm: Clean up unshare path for foreign mappings Andres Lagar-Cavilla
@ 2012-06-28 11:46 ` Tim Deegan
0 siblings, 0 replies; 2+ messages in thread
From: Tim Deegan @ 2012-06-28 11:46 UTC (permalink / raw)
To: Andres Lagar-Cavilla; +Cc: andres, xen-devel
At 10:48 -0400 on 19 Jun (1340102900), Andres Lagar-Cavilla wrote:
> In its current shape, if Xen unshares a foreign gfn successfully while building
> a foreign writable map, it is left with a reference to the old shared page in
> the "target" var.
>
> Instead, push unsharing request down on the initial get_page_from_gfn call,
> which will DTRT.
>
> This allows for greatly simplifying the unshare related condition handling,
> removing ugly comments and s86_64 ifdef-ery.
>
> Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Applied, thanks.
Tim.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-06-28 11:46 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-19 14:48 [PATCH] x86/mm: Clean up unshare path for foreign mappings Andres Lagar-Cavilla
2012-06-28 11:46 ` Tim Deegan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).