[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 |