[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1 of 5] libxl: validate scheduler parameters



On Fri, 2012-06-22 at 11:56 +0100, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1340361703 -3600
> # Node ID 998d48ccb8905907cb2f104b475e5ab6ad445348
> # Parent  5fb3c536b5a8810fb8be4149df609d272beff959
> libxl: validate scheduler parameters
> 
> This was previously done by xl itself however the domain was not
> created at that point so there was no domid to check. This happened to
> work on first boot because xl's global domid was initialised to zero
> so we would (incorrectly) validate the new domain to be against
> domain0. On reboot though we would try to use the old domain's id and
> fail.
> 
> sched_params_valid is moved and gains a gc+domid parameters and
> s/ctx/CTX/. The call is placed after
> libxl__domain_build_info_setdefault in the create path, because
> set_defaults doesn't have access to the domid and there are other
> callers which don't even have a domid to give it.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

After consultation with Ian J and Dario I have committed this one in
order to get a test pass ASAP. I'll leave the remainder of this series
to get properly reviewed.

Ian.

> 
> diff -r 5fb3c536b5a8 -r 998d48ccb890 tools/libxl/libxl_create.c
> --- a/tools/libxl/libxl_create.c      Fri Jun 22 10:14:46 2012 +0100
> +++ b/tools/libxl/libxl_create.c      Fri Jun 22 11:41:43 2012 +0100
> @@ -72,6 +72,49 @@ int libxl__domain_create_info_setdefault
>      return 0;
>  }
>  
> +static int sched_params_valid(libxl__gc *gc,
> +                              uint32_t domid, libxl_domain_sched_params *scp)
> +{
> +    int has_weight = scp->weight != LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT;
> +    int has_period = scp->period != LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT;
> +    int has_slice = scp->slice != LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT;
> +    int has_extratime =
> +                scp->extratime != LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT;
> +    libxl_domain_sched_params sci;
> +
> +    libxl_domain_sched_params_get(CTX, domid, &sci);
> +
> +    /* The sedf scheduler needs some more consistency checking */
> +    if (sci.sched == LIBXL_SCHEDULER_SEDF) {
> +        if (has_weight && (has_period || has_slice))
> +            return 0;
> +        if (has_period != has_slice)
> +            return 0;
> +
> +        /*
> +         * Idea is, if we specify a weight, then both period and
> +         * slice has to be zero. OTOH, if we do not specify a weight,
> +         * that means we want a pure best effort domain or an actual
> +         * real-time one. In the former case, it is period that needs
> +         * to be zero, in the latter, weight should be.
> +         */
> +        if (has_weight) {
> +            scp->slice = 0;
> +            scp->period = 0;
> +        }
> +        else if (!has_period) {
> +            /* We can setup a proper best effort domain (extra time only)
> +             * iff we either already have or are asking for some extra time. 
> */
> +            scp->weight = has_extratime ? scp->extratime : sci.extratime;
> +            scp->period = 0;
> +        }
> +        if (has_period && has_slice)
> +            scp->weight = 0;
> +    }
> +
> +    return 1;
> +}
> +
>  int libxl__domain_build_info_setdefault(libxl__gc *gc,
>                                          libxl_domain_build_info *b_info)
>  {
> @@ -622,6 +665,12 @@ static void initiate_domain_create(libxl
>      ret = libxl__domain_build_info_setdefault(gc, &d_config->b_info);
>      if (ret) goto error_out;
>  
> +    if (!sched_params_valid(gc, domid, &d_config->b_info.sched_params)) {
> +        LOG(ERROR, "Invalid scheduling parameters\n");
> +        ret = ERROR_INVAL;
> +        goto error_out;
> +    }
> +
>      for (i = 0; i < d_config->num_disks; i++) {
>          ret = libxl__device_disk_setdefault(gc, &d_config->disks[i]);
>          if (ret) goto error_out;
> diff -r 5fb3c536b5a8 -r 998d48ccb890 tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c        Fri Jun 22 10:14:46 2012 +0100
> +++ b/tools/libxl/xl_cmdimpl.c        Fri Jun 22 11:41:43 2012 +0100
> @@ -550,48 +550,6 @@ vcpp_out:
>      return rc;
>  }
>  
> -static int sched_params_valid(libxl_domain_sched_params *scp)
> -{
> -    int has_weight = scp->weight != LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT;
> -    int has_period = scp->period != LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT;
> -    int has_slice = scp->slice != LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT;
> -    int has_extratime =
> -                scp->extratime != LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT;
> -    libxl_domain_sched_params sci;
> -
> -    libxl_domain_sched_params_get(ctx, domid, &sci);
> -
> -    /* The sedf scheduler needs some more consistency checking */
> -    if (sci.sched == LIBXL_SCHEDULER_SEDF) {
> -        if (has_weight && (has_period || has_slice))
> -            return 0;
> -        if (has_period != has_slice)
> -            return 0;
> -
> -        /*
> -         * Idea is, if we specify a weight, then both period and
> -         * slice has to be zero. OTOH, if we do not specify a weight,
> -         * that means we want a pure best effort domain or an actual
> -         * real-time one. In the former case, it is period that needs
> -         * to be zero, in the latter, weight should be.
> -         */
> -        if (has_weight) {
> -            scp->slice = 0;
> -            scp->period = 0;
> -        }
> -        else if (!has_period) {
> -            /* We can setup a proper best effort domain (extra time only)
> -             * iff we either already have or are asking for some extra time. 
> */
> -            scp->weight = has_extratime ? scp->extratime : sci.extratime;
> -            scp->period = 0;
> -        }
> -        if (has_period && has_slice)
> -            scp->weight = 0;
> -    }
> -
> -    return 1;
> -}
> -
>  static void parse_config_data(const char *config_source,
>                                const char *config_data,
>                                int config_len,
> @@ -686,10 +644,6 @@ static void parse_config_data(const char
>          b_info->sched_params.latency = l;
>      if (!xlu_cfg_get_long (config, "extratime", &l, 0))
>          b_info->sched_params.extratime = l;
> -    if (!sched_params_valid(&b_info->sched_params)) {
> -        fprintf(stderr, "Invalid scheduling parameters\n");
> -        exit(1);
> -    }
>  
>      if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) {
>          b_info->max_vcpus = l;
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.