void set_vcpu_migration_delay_func(int argc, char *argv[]) { struct xen_sysctl_credit_schedule sparam; int value; fprintf(stderr, "WARNING: using xenpm for this purpose is deprecated." " Check out `xl sched-credit -s -m DELAY'\n"); if ( argc != 1 || (value = atoi(argv[0])) < 0 ) { fprintf(stderr, "Missing or invalid argument(s)\n"); exit(EINVAL); } if ( xc_sched_credit_params_get(xc_handle, 0, &sparam) < 0 ) { fprintf(stderr, "getting Credit scheduler parameters failed\n"); exit(EINVAL); } sparam.vcpu_migr_delay_us = value; if ( !xc_sched_credit_params_set(xc_handle, 0, &sparam) ) printf("set vcpu migration delay to %d us succeeded\n", value); else fprintf(stderr, "set vcpu migration delay failed (%d - %s)\n", errno, strerror(errno)); }
int libxl_sched_credit_params_set(libxl_ctx *ctx, uint32_t poolid, libxl_sched_credit_params *scinfo) { struct xen_sysctl_credit_schedule sparam; int r, rc; GC_INIT(ctx); if (scinfo->tslice_ms < XEN_SYSCTL_CSCHED_TSLICE_MIN || scinfo->tslice_ms > XEN_SYSCTL_CSCHED_TSLICE_MAX) { LOG(ERROR, "Time slice out of range, valid range is from %d to %d", XEN_SYSCTL_CSCHED_TSLICE_MIN, XEN_SYSCTL_CSCHED_TSLICE_MAX); rc = ERROR_INVAL; goto out; } rc = sched_ratelimit_check(gc, scinfo->ratelimit_us); if (rc) { goto out; } if (scinfo->ratelimit_us > scinfo->tslice_ms*1000) { LOG(ERROR, "Ratelimit cannot be greater than timeslice"); rc = ERROR_INVAL; goto out; } sparam.tslice_ms = scinfo->tslice_ms; sparam.ratelimit_us = scinfo->ratelimit_us; r = xc_sched_credit_params_set(ctx->xch, poolid, &sparam); if ( r < 0 ) { LOGE(ERROR, "Setting Credit scheduler parameters"); rc = ERROR_FAIL; goto out; } scinfo->tslice_ms = sparam.tslice_ms; scinfo->ratelimit_us = sparam.ratelimit_us; rc = 0; out: GC_FREE; return rc; }