[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Extend save/restore interface to cope with domains >4GB by adding a level of indirection.
# HG changeset patch # User iap10@xxxxxxxxxxxxxxxxxxxx # Node ID fb90dd31c6d7d6f88cce1190a6ef0d74a883ef07 # Parent 8db9c5873b9b4f9edc633f790b22d8683e30de2d Extend save/restore interface to cope with domains >4GB by adding a level of indirection. Signed-off-by: ian@xxxxxxxxxxxxx diff -r 8db9c5873b9b -r fb90dd31c6d7 linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Tue Sep 6 18:29:53 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Wed Sep 7 02:31:24 2005 @@ -359,7 +359,8 @@ shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; EXPORT_SYMBOL(HYPERVISOR_shared_info); -unsigned long *phys_to_machine_mapping, *pfn_to_mfn_frame_list; +unsigned long *phys_to_machine_mapping; +unsigned long *pfn_to_mfn_frame_list_list, *pfn_to_mfn_frame_list[16]; EXPORT_SYMBOL(phys_to_machine_mapping); /* Raw start-of-day parameters from the hypervisor. */ @@ -1519,7 +1520,7 @@ */ void __init setup_arch(char **cmdline_p) { - int i, j; + int i, j, k, fpp; physdev_op_t op; unsigned long max_low_pfn; @@ -1669,14 +1670,31 @@ sizeof(unsigned long)))); } - pfn_to_mfn_frame_list = alloc_bootmem_low_pages(PAGE_SIZE); - for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) - { - pfn_to_mfn_frame_list[j] = - virt_to_mfn(&phys_to_machine_mapping[i]); - } - HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list = - virt_to_mfn(pfn_to_mfn_frame_list); + + /* + * Initialise the list of the frames that specify the list of + * frames that make up the p2m table. Used by save/restore + */ + pfn_to_mfn_frame_list_list = alloc_bootmem_low_pages(PAGE_SIZE); + HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = + virt_to_mfn(pfn_to_mfn_frame_list_list); + + fpp = PAGE_SIZE/sizeof(unsigned long); + for ( i=0, j=0, k=-1; i< max_pfn; i+=fpp, j++ ) + { + if ( (j % fpp) == 0 ) + { + k++; + BUG_ON(k>=16); + pfn_to_mfn_frame_list[k] = alloc_bootmem_low_pages(PAGE_SIZE); + pfn_to_mfn_frame_list_list[k] = + virt_to_mfn(pfn_to_mfn_frame_list[k]); + j=0; + } + pfn_to_mfn_frame_list[k][j] = + virt_to_mfn(&phys_to_machine_mapping[i]); + } + HYPERVISOR_shared_info->arch.max_pfn = max_pfn; /* * NOTE: at this point the bootmem allocator is fully available. diff -r 8db9c5873b9b -r fb90dd31c6d7 linux-2.6-xen-sparse/arch/xen/kernel/reboot.c --- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Tue Sep 6 18:29:53 2005 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Wed Sep 7 02:31:24 2005 @@ -67,7 +67,7 @@ static int __do_suspend(void *ignore) { - int i, j; + int i, j, k, fpp; #ifdef CONFIG_XEN_USB_FRONTEND extern void usbif_resume(); @@ -81,7 +81,7 @@ extern void time_suspend(void); extern void time_resume(void); extern unsigned long max_pfn; - extern unsigned long *pfn_to_mfn_frame_list; + extern unsigned long *pfn_to_mfn_frame_list_list, *pfn_to_mfn_frame_list[]; #ifdef CONFIG_SMP extern void smp_suspend(void); @@ -191,14 +191,24 @@ HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO); memset(empty_zero_page, 0, PAGE_SIZE); - - for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) + + HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = + virt_to_mfn(pfn_to_mfn_frame_list_list); + + fpp = PAGE_SIZE/sizeof(unsigned long); + for ( i=0, j=0, k=-1; i< max_pfn; i+=fpp, j++ ) { - pfn_to_mfn_frame_list[j] = - virt_to_mfn(&phys_to_machine_mapping[i]); - } - HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list = - virt_to_mfn(pfn_to_mfn_frame_list); + if ( (j % fpp) == 0 ) + { + k++; + pfn_to_mfn_frame_list_list[k] = + virt_to_mfn(pfn_to_mfn_frame_list[k]); + j=0; + } + pfn_to_mfn_frame_list[k][j] = + virt_to_mfn(&phys_to_machine_mapping[i]); + } + HYPERVISOR_shared_info->arch.max_pfn = max_pfn; gnttab_resume(); diff -r 8db9c5873b9b -r fb90dd31c6d7 linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Tue Sep 6 18:29:53 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Wed Sep 7 02:31:24 2005 @@ -76,7 +76,8 @@ /* Allows setting of maximum possible memory size */ unsigned long xen_override_max_pfn; -unsigned long *phys_to_machine_mapping, *pfn_to_mfn_frame_list; +unsigned long *phys_to_machine_mapping; +unsigned long *pfn_to_mfn_frame_list_list, *pfn_to_mfn_frame_list[512]; EXPORT_SYMBOL(phys_to_machine_mapping); @@ -730,7 +731,7 @@ #endif #ifdef CONFIG_XEN { - int i, j; + int i, j, k, fpp; /* Make sure we have a large enough P->M table. */ if (end_pfn > xen_start_info->nr_pages) { phys_to_machine_mapping = alloc_bootmem( @@ -746,11 +747,35 @@ sizeof(unsigned long)))); } - pfn_to_mfn_frame_list = alloc_bootmem(PAGE_SIZE); - - for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) - pfn_to_mfn_frame_list[j] = + /* + * Initialise the list of the frames that specify the list of + * frames that make up the p2m table. Used by save/restore + */ + pfn_to_mfn_frame_list_list = alloc_bootmem(PAGE_SIZE); + HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = + virt_to_mfn(pfn_to_mfn_frame_list_list); + + fpp = PAGE_SIZE/sizeof(unsigned long); + for ( i=0, j=0, k=-1; i< max_pfn; i+=fpp, j++ ) + { + if ( (j % fpp) == 0 ) + { + k++; + BUG_ON(k>=fpp); + pfn_to_mfn_frame_list[k] = alloc_bootmem(PAGE_SIZE); + pfn_to_mfn_frame_list_list[k] = + virt_to_mfn(pfn_to_mfn_frame_list[k]); + j=0; + } + pfn_to_mfn_frame_list[k][j] = virt_to_mfn(&phys_to_machine_mapping[i]); + } + HYPERVISOR_shared_info->arch.max_pfn = max_pfn; + + + + + } #endif diff -r 8db9c5873b9b -r fb90dd31c6d7 tools/libxc/xc_linux_save.c --- a/tools/libxc/xc_linux_save.c Tue Sep 6 18:29:53 2005 +++ b/tools/libxc/xc_linux_save.c Wed Sep 7 02:31:24 2005 @@ -419,6 +419,7 @@ unsigned long page[1024]; /* A copy of the pfn-to-mfn table frame list. */ + unsigned long *live_pfn_to_mfn_frame_list_list = NULL; unsigned long *live_pfn_to_mfn_frame_list = NULL; unsigned long pfn_to_mfn_frame_list[1024]; @@ -506,11 +507,20 @@ goto out; } - /* the pfn_to_mfn_frame_list fits in a single page */ + live_pfn_to_mfn_frame_list_list = xc_map_foreign_range(xc_handle, dom, + PAGE_SIZE, PROT_READ, + live_shinfo->arch.pfn_to_mfn_frame_list_list); + + if (!live_pfn_to_mfn_frame_list_list){ + ERR("Couldn't map pfn_to_mfn_frame_list_list"); + goto out; + } + live_pfn_to_mfn_frame_list = - xc_map_foreign_range(xc_handle, dom, - PAGE_SIZE, PROT_READ, - live_shinfo->arch.pfn_to_mfn_frame_list ); + xc_map_foreign_batch(xc_handle, dom, + PROT_READ, + live_pfn_to_mfn_frame_list_list, + (nr_pfns+(1024*1024)-1)/(1024*1024) ); if (!live_pfn_to_mfn_frame_list){ ERR("Couldn't map pfn_to_mfn_frame_list"); diff -r 8db9c5873b9b -r fb90dd31c6d7 xen/include/public/arch-x86_32.h --- a/xen/include/public/arch-x86_32.h Tue Sep 6 18:29:53 2005 +++ b/xen/include/public/arch-x86_32.h Wed Sep 7 02:31:24 2005 @@ -128,8 +128,11 @@ } vcpu_guest_context_t; typedef struct arch_shared_info { - /* MFN of a table of MFNs that make up p2m table */ - u64 pfn_to_mfn_frame_list; + unsigned long max_pfn; /* max pfn that appears in table */ + unsigned long pfn_to_mfn_frame_list_list; + /* frame containing list of mfns + containing list of mfns + containing the p2m table. */ } arch_shared_info_t; #endif diff -r 8db9c5873b9b -r fb90dd31c6d7 xen/include/public/arch-x86_64.h --- a/xen/include/public/arch-x86_64.h Tue Sep 6 18:29:53 2005 +++ b/xen/include/public/arch-x86_64.h Wed Sep 7 02:31:24 2005 @@ -186,8 +186,11 @@ } vcpu_guest_context_t; typedef struct arch_shared_info { - /* MFN of a table of MFNs that make up p2m table */ - u64 pfn_to_mfn_frame_list; + unsigned long max_pfn; /* max pfn that appears in table */ + unsigned long pfn_to_mfn_frame_list_list; + /* frame containing list of mfns + containing list of mfns + containing the p2m table. */ } arch_shared_info_t; #endif /* !__ASSEMBLY__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |