|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1 of 2] libxc: Pass the save_ctx struct to more functions
This is in preparation for a patch that will print the domain ID
in the error messages.
Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -125,7 +125,8 @@ static int noncached_write(xc_interface
return rc;
}
-static int outbuf_init(xc_interface *xch, struct outbuf* ob, size_t size)
+static int outbuf_init(xc_interface *xch, struct save_ctx *ctx,
+ struct outbuf* ob, size_t size)
{
memset(ob, 0, sizeof(*ob));
@@ -139,7 +140,7 @@ static int outbuf_init(xc_interface *xch
return 0;
}
-static inline int outbuf_write(xc_interface *xch,
+static inline int outbuf_write(xc_interface *xch, struct save_ctx *ctx,
struct outbuf* ob, void* buf, size_t len)
{
if ( len > ob->size - ob->pos ) {
@@ -154,7 +155,8 @@ static inline int outbuf_write(xc_interf
}
/* prep for nonblocking I/O */
-static int outbuf_flush(xc_interface *xch, struct outbuf* ob, int fd)
+static int outbuf_flush(xc_interface *xch, struct save_ctx *ctx,
+ struct outbuf* ob, int fd)
{
int rc;
int cur = 0;
@@ -180,45 +182,46 @@ static int outbuf_flush(xc_interface *xc
}
/* if there's no room in the buffer, flush it and try again. */
-static inline int outbuf_hardwrite(xc_interface *xch,
+static inline int outbuf_hardwrite(xc_interface *xch, struct save_ctx *ctx,
struct outbuf* ob, int fd, void* buf,
size_t len)
{
if ( !len )
return 0;
- if ( !outbuf_write(xch, ob, buf, len) )
+ if ( !outbuf_write(xch, ctx, ob, buf, len) )
return 0;
- if ( outbuf_flush(xch, ob, fd) < 0 )
+ if ( outbuf_flush(xch, ctx, ob, fd) < 0 )
return -1;
- return outbuf_write(xch, ob, buf, len);
+ return outbuf_write(xch, ctx, ob, buf, len);
}
/* start buffering output once we've reached checkpoint mode. */
-static inline int write_buffer(xc_interface *xch,
+static inline int write_buffer(xc_interface *xch, struct save_ctx *ctx,
int dobuf, struct outbuf* ob, int fd, void* buf,
size_t len)
{
if ( dobuf )
- return outbuf_hardwrite(xch, ob, fd, buf, len);
+ return outbuf_hardwrite(xch, ctx, ob, fd, buf, len);
else
return write_exact(fd, buf, len);
}
/* like write_buffer for noncached, which returns number of bytes written */
-static inline int write_uncached(xc_interface *xch,
+static inline int write_uncached(xc_interface *xch, struct save_ctx *ctx,
int dobuf, struct outbuf* ob, int fd,
void* buf, size_t len)
{
if ( dobuf )
- return outbuf_hardwrite(xch, ob, fd, buf, len) ? -1 : len;
+ return outbuf_hardwrite(xch, ctx, ob, fd, buf, len) ? -1 : len;
else
return noncached_write(xch, ob, fd, buf, len);
}
-static int write_compressed(xc_interface *xch, comp_ctx *compress_ctx,
+static int write_compressed(xc_interface *xch, struct save_ctx *ctx,
+ comp_ctx *compress_ctx,
int dobuf, struct outbuf* ob, int fd)
{
int rc = 0;
@@ -231,7 +234,7 @@ static int write_compressed(xc_interface
/* check for available space (atleast 8k) */
if ((ob->pos + header + XC_PAGE_SIZE * 2) > ob->size)
{
- if (outbuf_flush(xch, ob, fd) < 0)
+ if (outbuf_flush(xch, ctx, ob, fd) < 0)
{
ERROR("Error when flushing outbuf intermediate");
return -1;
@@ -245,20 +248,20 @@ static int write_compressed(xc_interface
if (!rc)
return 0;
- if (outbuf_hardwrite(xch, ob, fd, &marker, sizeof(marker)) < 0)
+ if (outbuf_hardwrite(xch, ctx, ob, fd, &marker, sizeof(marker)) < 0)
{
PERROR("Error when writing marker (errno %d)", errno);
return -1;
}
- if (outbuf_hardwrite(xch, ob, fd, &compbuf_len, sizeof(compbuf_len)) <
0)
+ if (outbuf_hardwrite(xch, ctx, ob, fd, &compbuf_len,
sizeof(compbuf_len)) < 0)
{
PERROR("Error when writing compbuf_len (errno %d)", errno);
return -1;
}
ob->pos += (size_t) compbuf_len;
- if (!dobuf && outbuf_flush(xch, ob, fd) < 0)
+ if (!dobuf && outbuf_flush(xch, ctx, ob, fd) < 0)
{
ERROR("Error when writing compressed chunk");
return -1;
@@ -273,7 +276,8 @@ struct time_stats {
long long d0_cpu, d1_cpu;
};
-static int print_stats(xc_interface *xch, uint32_t domid, int pages_sent,
+static int print_stats(xc_interface *xch, struct save_ctx *ctx,
+ uint32_t domid, int pages_sent,
struct time_stats *last,
xc_shadow_op_stats_t *stats, int print)
{
@@ -349,7 +353,8 @@ static int analysis_phase(xc_interface *
}
static int suspend_and_state(int (*suspend)(void*), void* data,
- xc_interface *xch, int io_fd, int dom,
+ xc_interface *xch, struct save_ctx *ctx,
+ int io_fd, int dom,
xc_dominfo_t *info)
{
if ( !(*suspend)(data) )
@@ -904,7 +909,7 @@ int xc_domain_save(xc_interface *xch, in
return 1;
}
- outbuf_init(xch, &ob_pagebuf, OUTBUF_SIZE);
+ outbuf_init(xch, ctx, &ob_pagebuf, OUTBUF_SIZE);
memset(ctx, 0, sizeof(*ctx));
@@ -984,7 +989,7 @@ int xc_domain_save(xc_interface *xch, in
else
{
/* This is a non-live suspend. Suspend the domain .*/
- if ( suspend_and_state(callbacks->suspend, callbacks->data, xch,
+ if ( suspend_and_state(callbacks->suspend, callbacks->data, xch, ctx,
io_fd, dom, &info) )
{
ERROR("Domain appears not to have suspended");
@@ -999,7 +1004,7 @@ int xc_domain_save(xc_interface *xch, in
ERROR("Failed to create compression context");
goto out;
}
- outbuf_init(xch, &ob_tailbuf, OUTBUF_SIZE/4);
+ outbuf_init(xch, ctx, &ob_tailbuf, OUTBUF_SIZE/4);
}
last_iter = !live;
@@ -1094,7 +1099,7 @@ int xc_domain_save(xc_interface *xch, in
DPRINTF("Had %d unexplained entries in p2m table\n", err);
}
- print_stats(xch, dom, 0, &time_stats, &shadow_stats, 0);
+ print_stats(xch, ctx, dom, 0, &time_stats, &shadow_stats, 0);
tmem_saved = xc_tmem_save(xch, dom, io_fd, live, XC_SAVE_ID_TMEM);
if ( tmem_saved == -1 )
@@ -1110,9 +1115,9 @@ int xc_domain_save(xc_interface *xch, in
}
copypages:
-#define wrexact(fd, buf, len) write_buffer(xch, last_iter, ob, (fd), (buf),
(len))
-#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, ob,
(fd), (buf), (len))
-#define wrcompressed(fd) write_compressed(xch, compress_ctx, last_iter, ob,
(fd))
+#define wrexact(fd, buf, len) write_buffer(xch, ctx, last_iter, ob, (fd),
(buf), (len))
+#define wruncached(fd, live, buf, len) write_uncached(xch, ctx, last_iter, ob,
(fd), (buf), (len))
+#define wrcompressed(fd) write_compressed(xch, ctx, compress_ctx, last_iter,
ob, (fd))
ob = &ob_pagebuf; /* Holds pfn_types, pages/compressed pages */
/* Now write out each data page, canonicalising page tables as we go... */
@@ -1494,7 +1499,7 @@ int xc_domain_save(xc_interface *xch, in
if ( last_iter )
{
- print_stats( xch, dom, sent_this_iter, &time_stats, &shadow_stats,
1);
+ print_stats( xch, ctx, dom, sent_this_iter, &time_stats,
&shadow_stats, 1);
DPRINTF("Total pages sent= %ld (%.2fx)\n",
total_sent, ((float)total_sent)/dinfo->p2m_size );
@@ -1531,7 +1536,7 @@ int xc_domain_save(xc_interface *xch, in
last_iter = 1;
if ( suspend_and_state(callbacks->suspend, callbacks->data,
- xch, io_fd, dom, &info) )
+ xch, ctx, io_fd, dom, &info) )
{
ERROR("Domain appears not to have suspended");
goto out;
@@ -1564,7 +1569,7 @@ int xc_domain_save(xc_interface *xch, in
sent_last_iter = sent_this_iter;
- print_stats(xch, dom, sent_this_iter, &time_stats, &shadow_stats,
1);
+ print_stats(xch, ctx, dom, sent_this_iter, &time_stats,
&shadow_stats, 1);
}
} /* end of infinite for loop */
@@ -2023,7 +2028,7 @@ int xc_domain_save(xc_interface *xch, in
}
/* Flush last write and discard cache for file. */
- if ( outbuf_flush(xch, ob, io_fd) < 0 ) {
+ if ( outbuf_flush(xch, ctx, ob, io_fd) < 0 ) {
PERROR("Error when flushing output buffer");
rc = 1;
}
@@ -2038,18 +2043,18 @@ int xc_domain_save(xc_interface *xch, in
callbacks->checkpoint(callbacks->data) > 0)
{
/* reset stats timer */
- print_stats(xch, dom, 0, &time_stats, &shadow_stats, 0);
+ print_stats(xch, ctx, dom, 0, &time_stats, &shadow_stats, 0);
rc = 1;
/* last_iter = 1; */
- if ( suspend_and_state(callbacks->suspend, callbacks->data, xch,
+ if ( suspend_and_state(callbacks->suspend, callbacks->data, xch, ctx,
io_fd, dom, &info) )
{
ERROR("Domain appears not to have suspended");
goto out;
}
DPRINTF("SUSPEND shinfo %08lx\n", info.shared_info_frame);
- print_stats(xch, dom, 0, &time_stats, &shadow_stats, 1);
+ print_stats(xch, ctx, dom, 0, &time_stats, &shadow_stats, 1);
if ( xc_shadow_control(xch, dom,
XEN_DOMCTL_SHADOW_OP_CLEAN,
HYPERCALL_BUFFER(to_send),
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |