move the suspend_ctx on the save stack instead of a global one
---
tools/libxc/xc_domain_save.c | 28 +++++++++++++++-------------
1 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index 97bd4ad..341b0e0 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -41,13 +41,6 @@ struct suspend_ctx {
xen_pfn_t *live_p2m; /* Live mapping of the table mapping each PFN to its
current MFN. */
};
-struct suspend_ctx _ctx = {
- .live_p2m = NULL,
- .live_m2p = NULL,
-};
-
-struct suspend_ctx *ctx = &_ctx;
-
/* buffer for output */
struct outbuf {
void* buf;
@@ -398,6 +391,7 @@ static int print_stats(int xc_handle, uint32_t domid, int
pages_sent,
static int analysis_phase(int xc_handle, uint32_t domid,
+ struct suspend_ctx *ctx,
unsigned long *arr, int runs)
{
long long start, now;
@@ -454,6 +448,7 @@ static int suspend_and_state(int (*suspend)(void*), void*
data,
** it to update the MFN to a reasonable value.
*/
static void *map_frame_list_list(int xc_handle, uint32_t dom,
+ struct suspend_ctx *ctx,
shared_info_any_t *shinfo)
{
int count = 100;
@@ -488,7 +483,8 @@ static void *map_frame_list_list(int xc_handle, uint32_t
dom,
** which entries do not require canonicalization (in particular, those
** entries which map the virtual address reserved for the hypervisor).
*/
-static int canonicalize_pagetable(unsigned long type, unsigned long pfn,
+static int canonicalize_pagetable(struct suspend_ctx *ctx,
+ unsigned long type, unsigned long pfn,
const void *spage, void *dpage)
{
@@ -669,6 +665,7 @@ err0:
static xen_pfn_t *map_and_save_p2m_table(int xc_handle,
int io_fd,
uint32_t dom,
+ struct suspend_ctx *ctx,
shared_info_any_t *live_shinfo)
{
vcpu_guest_context_any_t ctxt;
@@ -686,7 +683,7 @@ static xen_pfn_t *map_and_save_p2m_table(int xc_handle,
int i, success = 0;
- live_p2m_frame_list_list = map_frame_list_list(xc_handle, dom,
+ live_p2m_frame_list_list = map_frame_list_list(xc_handle, dom, ctx,
live_shinfo);
if ( !live_p2m_frame_list_list )
goto out;
@@ -892,9 +889,14 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom,
uint32_t max_iters,
unsigned long mfn;
struct outbuf ob;
-
int completed = 0;
+ struct suspend_ctx _ctx = {
+ .live_p2m = NULL,
+ .live_m2p = NULL,
+ };
+ struct suspend_ctx *ctx = &_ctx;
+
outbuf_init(&ob, OUTBUF_SIZE);
/* If no explicit control parameters given, use defaults */
@@ -1022,7 +1024,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t
dom, uint32_t max_iters,
}
}
- analysis_phase(xc_handle, dom, to_skip, 0);
+ analysis_phase(xc_handle, dom, ctx, to_skip, 0);
pfn_type = xg_memalign(PAGE_SIZE, ROUNDUP(
MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT));
@@ -1061,7 +1063,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t
dom, uint32_t max_iters,
int err = 0;
/* Map the P2M table, and write the list of P2M frames */
- ctx->live_p2m = map_and_save_p2m_table(xc_handle, io_fd, dom,
live_shinfo);
+ ctx->live_p2m = map_and_save_p2m_table(xc_handle, io_fd, dom, ctx,
live_shinfo);
if ( ctx->live_p2m == NULL )
{
ERROR("Failed to map/save the p2m frame list");
@@ -1349,7 +1351,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t
dom, uint32_t max_iters,
{
/* We have a pagetable page: need to rewrite it. */
race =
- canonicalize_pagetable(pagetype, pfn, spage, page);
+ canonicalize_pagetable(ctx, pagetype, pfn, spage,
page);
if ( race && !live )
{
--
1.6.5.2
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|