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