|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86: adjustments to memory_add()
commit ea0b5f0a6b3fe8991cf767770e09addd589102b4
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Mon Aug 31 13:50:56 2015 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Aug 31 13:50:56 2015 +0200
x86: adjustments to memory_add()
The function should clean up after a failed map_pages_to_xen().
Sharing the M2P table with Dom0 needs to happen before adding the new
pages to the heap (so pages handed out by the allocator will be
represented in what a tool stack may need to map).
Avoid the IOMMU mapping loop whenever possible.
Drop a redundant setting of 'ret'.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Release-acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
xen/arch/x86/x86_64/mm.c | 16 +++++++---------
1 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index 24655d4..d918002 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -1376,7 +1376,7 @@ int memory_add(unsigned long spfn, unsigned long epfn,
unsigned int pxm)
ret = map_pages_to_xen((unsigned long)mfn_to_virt(spfn), spfn,
min(epfn, i) - spfn, PAGE_HYPERVISOR);
if ( ret )
- return ret;
+ goto destroy_directmap;
}
if ( i < epfn )
{
@@ -1385,7 +1385,7 @@ int memory_add(unsigned long spfn, unsigned long epfn,
unsigned int pxm)
ret = map_pages_to_xen((unsigned long)mfn_to_virt(i), i,
epfn - i, __PAGE_HYPERVISOR_RW);
if ( ret )
- return ret;
+ goto destroy_directmap;
}
old_node_start = NODE_DATA(node)->node_start_pfn;
@@ -1408,7 +1408,6 @@ int memory_add(unsigned long spfn, unsigned long epfn,
unsigned int pxm)
NODE_DATA(node)->node_spanned_pages = epfn - node_start_pfn(node);
}
- ret = -EINVAL;
info.spfn = spfn;
info.epfn = epfn;
info.cur = spfn;
@@ -1431,7 +1430,7 @@ int memory_add(unsigned long spfn, unsigned long epfn,
unsigned int pxm)
if ( ret )
goto destroy_m2p;
- if ( !need_iommu(hardware_domain) )
+ if ( iommu_enabled && !iommu_passthrough && !need_iommu(hardware_domain) )
{
for ( i = spfn; i < epfn; i++ )
if ( iommu_map_page(hardware_domain, i, i,
IOMMUF_readable|IOMMUF_writable) )
@@ -1445,9 +1444,8 @@ int memory_add(unsigned long spfn, unsigned long epfn,
unsigned int pxm)
}
/* We can't revert any more */
- transfer_pages_to_heap(&info);
-
share_hotadd_m2p_table(&info);
+ transfer_pages_to_heap(&info);
return 0;
@@ -1458,13 +1456,13 @@ destroy_m2p:
max_pdx = pfn_to_pdx(max_page - 1) + 1;
destroy_frametable:
cleanup_frame_table(&info);
- destroy_xen_mappings((unsigned long)mfn_to_virt(spfn),
- (unsigned long)mfn_to_virt(epfn));
-
if ( !orig_online )
node_set_offline(node);
NODE_DATA(node)->node_start_pfn = old_node_start;
NODE_DATA(node)->node_spanned_pages = old_node_span;
+ destroy_directmap:
+ destroy_xen_mappings((unsigned long)mfn_to_virt(spfn),
+ (unsigned long)mfn_to_virt(epfn));
return ret;
}
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |