91 lines
3.4 KiB
Diff
91 lines
3.4 KiB
Diff
From: Olaf Hering <olaf@aepfle.de>
|
|
Date: Fri, 8 Jan 2021 18:19:49 +0100
|
|
Subject: libxc sr precopy_policy
|
|
|
|
tools: add callback to libxl for precopy_policy and precopy_stats
|
|
|
|
This duplicates simple_precopy_policy. To recap its purpose:
|
|
- do up to 5 iterations of copying dirty domU memory to target,
|
|
including the initial copying of all domU memory, excluding
|
|
the final copying while the domU is suspended
|
|
- do fewer iterations in case the domU dirtied less than 50 pages
|
|
|
|
Take the opportunity to also move xen_pfn_t into qw().
|
|
|
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
|
|
|
v02:
|
|
- use plain struct precopy_stats instead of inventing
|
|
a new precopy_stats_t (anthony)
|
|
---
|
|
tools/libs/light/libxl_dom_save.c | 19 +++++++++++++++++++
|
|
tools/libs/light/libxl_internal.h | 2 ++
|
|
tools/libs/light/libxl_save_msgs_gen.pl | 3 ++-
|
|
3 files changed, 23 insertions(+), 1 deletion(-)
|
|
|
|
--- a/tools/libs/light/libxl_dom_save.c
|
|
+++ b/tools/libs/light/libxl_dom_save.c
|
|
@@ -373,6 +373,24 @@ int libxl__save_emulator_xenstore_data(l
|
|
return rc;
|
|
}
|
|
|
|
+static int libxl__domain_save_precopy_policy(struct precopy_stats stats, void *user)
|
|
+{
|
|
+ libxl__save_helper_state *shs = user;
|
|
+ libxl__domain_save_state *dss = shs->caller_state;
|
|
+ STATE_AO_GC(dss->ao);
|
|
+
|
|
+ LOGD(DEBUG, shs->domid, "iteration %u dirty_count %ld total_written %lu",
|
|
+ stats.iteration, stats.dirty_count, stats.total_written);
|
|
+ if (stats.dirty_count >= 0 && stats.dirty_count < LIBXL_XGS_POLICY_TARGET_DIRTY_COUNT)
|
|
+ goto stop_copy;
|
|
+ if (stats.iteration >= LIBXL_XGS_POLICY_MAX_ITERATIONS)
|
|
+ goto stop_copy;
|
|
+ return XGS_POLICY_CONTINUE_PRECOPY;
|
|
+
|
|
+stop_copy:
|
|
+ return XGS_POLICY_STOP_AND_COPY;
|
|
+}
|
|
+
|
|
/*----- main code for saving, in order of execution -----*/
|
|
|
|
void libxl__domain_save(libxl__egc *egc, libxl__domain_save_state *dss)
|
|
@@ -430,6 +448,7 @@ void libxl__domain_save(libxl__egc *egc,
|
|
callbacks->suspend = libxl__domain_suspend_callback;
|
|
|
|
callbacks->switch_qemu_logdirty = libxl__domain_suspend_common_switch_qemu_logdirty;
|
|
+ callbacks->precopy_policy = libxl__domain_save_precopy_policy;
|
|
|
|
dss->sws.ao = dss->ao;
|
|
dss->sws.dss = dss;
|
|
--- a/tools/libs/light/libxl_internal.h
|
|
+++ b/tools/libs/light/libxl_internal.h
|
|
@@ -125,6 +125,8 @@
|
|
#define DOMID_XS_PATH "domid"
|
|
#define PVSHIM_BASENAME "xen-shim"
|
|
#define PVSHIM_CMDLINE "pv-shim console=xen,pv"
|
|
+#define LIBXL_XGS_POLICY_MAX_ITERATIONS 5
|
|
+#define LIBXL_XGS_POLICY_TARGET_DIRTY_COUNT 50
|
|
|
|
#define DIV_ROUNDUP(n, d) (((n) + (d) - 1) / (d))
|
|
|
|
--- a/tools/libs/light/libxl_save_msgs_gen.pl
|
|
+++ b/tools/libs/light/libxl_save_msgs_gen.pl
|
|
@@ -23,6 +23,7 @@ our @msgs = (
|
|
STRING doing_what),
|
|
'unsigned long', 'done',
|
|
'unsigned long', 'total'] ],
|
|
+ [ 'scxW', "precopy_policy", ['struct precopy_stats', 'stats'] ],
|
|
[ 'srcxA', "suspend", [] ],
|
|
[ 'srcxA', "postcopy", [] ],
|
|
[ 'srcxA', "checkpoint", [] ],
|
|
@@ -142,7 +143,7 @@ static void bytes_put(unsigned char *con
|
|
|
|
END
|
|
|
|
-foreach my $simpletype (qw(int uint16_t uint32_t unsigned), 'unsigned long', 'xen_pfn_t') {
|
|
+foreach my $simpletype (qw(int uint16_t uint32_t unsigned xen_pfn_t), 'struct precopy_stats', 'unsigned long') {
|
|
my $typeid = typeid($simpletype);
|
|
$out_body{'callout'} .= <<END;
|
|
static int ${typeid}_get(const unsigned char **msg,
|