diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h index b77726eab7..a3063998e0 100644 --- a/tools/include/xenctrl.h +++ b/tools/include/xenctrl.h @@ -882,11 +882,15 @@ typedef struct xen_domctl_shadow_op_stats xc_shadow_op_stats_t; int xc_shadow_control(xc_interface *xch, uint32_t domid, unsigned int sop, - xc_hypercall_buffer_t *dirty_bitmap, - unsigned long pages, - unsigned long *mb, - uint32_t mode, - xc_shadow_op_stats_t *stats); + unsigned int *mb, + unsigned int mode); +long long xc_logdirty_control(xc_interface *xch, + uint32_t domid, + unsigned int sop, + xc_hypercall_buffer_t *dirty_bitmap, + unsigned long pages, + unsigned int mode, + xc_shadow_op_stats_t *stats); int xc_sched_credit_domain_set(xc_interface *xch, uint32_t domid, diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c index a20e081b51..23322b70b5 100644 --- a/tools/libs/ctrl/xc_domain.c +++ b/tools/libs/ctrl/xc_domain.c @@ -650,25 +650,49 @@ int xc_watchdog(xc_interface *xch, int xc_shadow_control(xc_interface *xch, uint32_t domid, unsigned int sop, - xc_hypercall_buffer_t *dirty_bitmap, - unsigned long pages, - unsigned long *mb, - uint32_t mode, - xc_shadow_op_stats_t *stats) + unsigned int *mb, + unsigned int mode) { int rc; DECLARE_DOMCTL; - DECLARE_HYPERCALL_BUFFER_ARGUMENT(dirty_bitmap); memset(&domctl, 0, sizeof(domctl)); domctl.cmd = XEN_DOMCTL_shadow_op; domctl.domain = domid; domctl.u.shadow_op.op = sop; - domctl.u.shadow_op.pages = pages; domctl.u.shadow_op.mb = mb ? *mb : 0; domctl.u.shadow_op.mode = mode; - if (dirty_bitmap != NULL) + + rc = do_domctl(xch, &domctl); + + if ( mb ) + *mb = domctl.u.shadow_op.mb; + + return rc; +} + +long long xc_logdirty_control(xc_interface *xch, + uint32_t domid, + unsigned int sop, + xc_hypercall_buffer_t *dirty_bitmap, + unsigned long pages, + unsigned int mode, + xc_shadow_op_stats_t *stats) +{ + int rc; + struct xen_domctl domctl = { + .cmd = XEN_DOMCTL_shadow_op, + .domain = domid, + .u.shadow_op = { + .op = sop, + .pages = pages, + .mode = mode, + } + }; + DECLARE_HYPERCALL_BUFFER_ARGUMENT(dirty_bitmap); + + if ( dirty_bitmap ) set_xen_guest_handle(domctl.u.shadow_op.dirty_bitmap, dirty_bitmap); @@ -678,9 +702,6 @@ int xc_shadow_control(xc_interface *xch, memcpy(stats, &domctl.u.shadow_op.stats, sizeof(xc_shadow_op_stats_t)); - if ( mb ) - *mb = domctl.u.shadow_op.mb; - return (rc == 0) ? domctl.u.shadow_op.pages : rc; } diff --git a/tools/libs/guest/xg_sr_restore.c b/tools/libs/guest/xg_sr_restore.c index aa4113d7f6..074b56d263 100644 --- a/tools/libs/guest/xg_sr_restore.c +++ b/tools/libs/guest/xg_sr_restore.c @@ -433,10 +433,10 @@ static int send_checkpoint_dirty_pfn_list(struct xc_sr_context *ctx) DECLARE_HYPERCALL_BUFFER_SHADOW(unsigned long, dirty_bitmap, &ctx->restore.dirty_bitmap_hbuf); - if ( xc_shadow_control( + if ( xc_logdirty_control( xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_CLEAN, HYPERCALL_BUFFER(dirty_bitmap), ctx->restore.p2m_size, - NULL, 0, &stats) != ctx->restore.p2m_size ) + 0, &stats) != ctx->restore.p2m_size ) { PERROR("Failed to retrieve logdirty bitmap"); goto err; diff --git a/tools/libs/guest/xg_sr_save.c b/tools/libs/guest/xg_sr_save.c index 0266e0a94a..9853d8d846 100644 --- a/tools/libs/guest/xg_sr_save.c +++ b/tools/libs/guest/xg_sr_save.c @@ -424,18 +424,18 @@ static int enable_logdirty(struct xc_sr_context *ctx) /* This juggling is required if logdirty is enabled for VRAM tracking. */ rc = xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY, - NULL, 0, NULL, 0, NULL); + NULL, 0); if ( rc < 0 ) { on1 = errno; rc = xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_OFF, - NULL, 0, NULL, 0, NULL); + NULL, 0); if ( rc < 0 ) off = errno; else { rc = xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY, - NULL, 0, NULL, 0, NULL); + NULL, 0); if ( rc < 0 ) on2 = errno; } @@ -552,10 +552,10 @@ static int send_memory_live(struct xc_sr_context *ctx) if ( policy_decision != XGS_POLICY_CONTINUE_PRECOPY ) break; - if ( xc_shadow_control( + if ( xc_logdirty_control( xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_CLEAN, &ctx->save.dirty_bitmap_hbuf, ctx->save.p2m_size, - NULL, 0, &stats) != ctx->save.p2m_size ) + 0, &stats) != ctx->save.p2m_size ) { PERROR("Failed to retrieve logdirty bitmap"); rc = -1; @@ -649,10 +649,10 @@ static int suspend_and_send_dirty(struct xc_sr_context *ctx) if ( rc ) goto out; - if ( xc_shadow_control( + if ( xc_logdirty_control( xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_CLEAN, HYPERCALL_BUFFER(dirty_bitmap), ctx->save.p2m_size, - NULL, XEN_DOMCTL_SHADOW_LOGDIRTY_FINAL, &stats) != + XEN_DOMCTL_SHADOW_LOGDIRTY_FINAL, &stats) != ctx->save.p2m_size ) { PERROR("Failed to retrieve logdirty bitmap"); @@ -712,10 +712,10 @@ static int verify_frames(struct xc_sr_context *ctx) if ( rc ) goto out; - if ( xc_shadow_control( + if ( xc_logdirty_control( xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_PEEK, &ctx->save.dirty_bitmap_hbuf, ctx->save.p2m_size, - NULL, 0, &stats) != ctx->save.p2m_size ) + 0, &stats) != ctx->save.p2m_size ) { PERROR("Failed to retrieve logdirty bitmap"); rc = -1; @@ -830,7 +830,7 @@ static void cleanup(struct xc_sr_context *ctx) xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_OFF, - NULL, 0, NULL, 0, NULL); + NULL, 0); if ( ctx->save.ops.cleanup(ctx) ) PERROR("Failed to clean up"); diff --git a/tools/libs/light/libxl_colo_restore.c b/tools/libs/light/libxl_colo_restore.c index aa365670fb..3176eee360 100644 --- a/tools/libs/light/libxl_colo_restore.c +++ b/tools/libs/light/libxl_colo_restore.c @@ -62,7 +62,7 @@ static void colo_enable_logdirty(libxl__colo_restore_state *crs, libxl__egc *egc /* we need to know which pages are dirty to restore the guest */ if (xc_shadow_control(CTX->xch, domid, XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY, - NULL, 0, NULL, 0, NULL) < 0) { + NULL, 0) < 0) { LOGD(ERROR, domid, "cannot enable secondary vm's logdirty"); lds->callback(egc, lds, ERROR_FAIL); return; @@ -90,7 +90,7 @@ static void colo_disable_logdirty(libxl__colo_restore_state *crs, /* we need to know which pages are dirty to restore the guest */ if (xc_shadow_control(CTX->xch, domid, XEN_DOMCTL_SHADOW_OP_OFF, - NULL, 0, NULL, 0, NULL) < 0) + NULL, 0) < 0) LOGD(WARN, domid, "cannot disable secondary vm's logdirty"); if (crs->hvm) { diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c index 18c3c77ccd..6083878315 100644 --- a/tools/libs/light/libxl_x86.c +++ b/tools/libs/light/libxl_x86.c @@ -529,15 +529,15 @@ int libxl__arch_domain_create(libxl__gc *gc, xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset); if (d_config->b_info.type != LIBXL_DOMAIN_TYPE_PV) { - unsigned long shadow_mb = DIV_ROUNDUP(d_config->b_info.shadow_memkb, - 1024); + unsigned int shadow_mb = DIV_ROUNDUP(d_config->b_info.shadow_memkb, + 1024); int r = xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, - NULL, 0, &shadow_mb, 0, NULL); + &shadow_mb, 0); if (r) { LOGED(ERROR, domid, - "Failed to set %lu MiB %s allocation", + "Failed to set %u MiB %s allocation", shadow_mb, libxl_defbool_val(d_config->c_info.hap) ? "HAP" : "shadow"); ret = ERROR_FAIL; diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index dd09cb90aa..ad953d36bd 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -995,13 +995,13 @@ CAMLprim value stub_shadow_allocation_get(value xch, value domid) { CAMLparam2(xch, domid); CAMLlocal1(mb); - unsigned long c_mb; + unsigned int c_mb; int ret; caml_enter_blocking_section(); ret = xc_shadow_control(_H(xch), _D(domid), XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION, - NULL, 0, &c_mb, 0, NULL); + &c_mb, 0); caml_leave_blocking_section(); if (ret != 0) failwith_xc(_H(xch)); @@ -1014,14 +1014,14 @@ CAMLprim value stub_shadow_allocation_set(value xch, value domid, value mb) { CAMLparam3(xch, domid, mb); - unsigned long c_mb; + unsigned int c_mb; int ret; c_mb = Int_val(mb); caml_enter_blocking_section(); ret = xc_shadow_control(_H(xch), _D(domid), XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, - NULL, 0, &c_mb, 0, NULL); + &c_mb, 0); caml_leave_blocking_section(); if (ret != 0) failwith_xc(_H(xch)); diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 13a7603809..6293d205a3 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -1192,8 +1192,7 @@ static PyObject *pyxc_shadow_control(PyObject *self, &dom, &op) ) return NULL; - if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, NULL, 0, NULL) - < 0 ) + if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0) < 0 ) return pyxc_error_to_exception(xc->xc_handle); Py_INCREF(zero); @@ -1208,7 +1207,7 @@ static PyObject *pyxc_shadow_mem_control(PyObject *self, int op; uint32_t dom; int mbarg = -1; - unsigned long mb; + unsigned int mb; static char *kwd_list[] = { "dom", "mb", NULL }; @@ -1223,7 +1222,7 @@ static PyObject *pyxc_shadow_mem_control(PyObject *self, mb = mbarg; op = XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION; } - if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, &mb, 0, NULL) < 0 ) + if ( xc_shadow_control(xc->xc_handle, dom, op, &mb, 0) < 0 ) return pyxc_error_to_exception(xc->xc_handle); mbarg = mb;