|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 3/4] libxl: add rt scheduler
Hi Dario,
2014-09-05 6:21 GMT-04:00 Dario Faggioli <dario.faggioli@xxxxxxxxxx>:
> On dom, 2014-08-24 at 18:58 -0400, Meng Xu wrote:
>> --- a/tools/libxl/libxl.c
>> +++ b/tools/libxl/libxl.c
>> @@ -5154,6 +5154,139 @@ static int sched_sedf_domain_set(libxl__gc *gc,
>> uint32_t domid,
>> return 0;
>> }
>>
>> +static int sched_rt_domain_get(libxl__gc *gc, uint32_t domid,
>> + libxl_domain_sched_params *scinfo)
>> +{
>> + struct xen_domctl_sched_rt_params* sdom;
>> + uint16_t num_vcpus;
>> + int rc, i;
>> +
>> + rc = xc_sched_rt_domain_get_num_vcpus(CTX->xch, domid, &num_vcpus);
>> + if (rc != 0) {
>> + LOGE(ERROR, "getting num_vcpus of domain sched rt");
>> + return ERROR_FAIL;
>> + }
>>
> As George pointed out already, you can get the num_vcpus via
> xc_domain_getinfo().
>
> I agree with George's review about the rest of this function
> (appropriately updated to take what we decided about the interface into
> account :-) ).
>
>> +#define SCHED_RT_VCPU_PERIOD_MAX 31536000000000 /* one year in
>> microsecond*/
>> +#define SCHED_RT_VCPU_BUDGET_MAX SCHED_RT_VCPU_PERIOD_MAX
>> +
> This may be me not remembering correctly the outcome of a preceding
> discussion... did we say we were going with _RT_ or with something like
> _RTDS_ ?
>
> ISTR the latter...
So I also need to change all RT to RT_DS in the tool stack, except
keeping the command 'xl sched-rt'? If so, I will do that.
>
> Also, macros like INT_MAX, UINT_MAX, etc., or << and ~ "tricks" are,
> IMO, preferrable to the open coding of the value.
What does open coding of the value mean? Do you mean (2^32-1) instead
of 4294967295?
>
> Finally, I wonder whether these would better live in some headers,
> closer to the declaration of period and budget (where their type is also
> visible) and, as a nice side effect of that, available to libxl callers
> as well.
I actually considered the possibility of adding it to
xen/include/public/domctl.h, but other schedulers do not have such
range macro in the domctl.h, so I'm not sure if it will cause
inconsistence?
>
>> +/*
>> + * Sanity check of the scinfo parameters
>> + * return 0 if all values are valid
>> + * return 1 if one param is default value
>> + * return 2 if the target vcpu's index, period or budget is out of range
>> + */
>> +static int sched_rt_domain_set_validate_params(libxl__gc *gc,
>> + const
>> libxl_domain_sched_params *scinfo,
>> + const uint16_t num_vcpus)
>> +{
>> + int vcpu_index = scinfo->rt.vcpu_index;
>> +
> As per the low level interface (Xen and libxc) there should be no need
> for any vcpu_index anymore, right?
>
> I'm just double checking, as the discussion was --as it should, on these
> things-- long and involved :-D
>
>> + if (vcpu_index < 0 || vcpu_index > num_vcpus)
>> + {
>> + LOG(ERROR, "VCPU index is not set or out of range, "
>> + "valid values are within range from 0 to %d",
>> num_vcpus);
>> + return 2;
>> + }
>> +
>> + if (scinfo->rt.period < 1 ||
>> + scinfo->rt.period > SCHED_RT_VCPU_PERIOD_MAX)
>> + {
>> + LOG(ERROR, "VCPU period is not set or out of range, "
>> + "valid values are within range from 0 to %lu",
>> SCHED_RT_VCPU_PERIOD_MAX);
>> + return 2;
>> + }
>> +
>> + if (scinfo->rt.budget < 1 ||
>> + scinfo->rt.budget > SCHED_RT_VCPU_BUDGET_MAX)
>> + {
>> + LOG(ERROR, "VCPU budget is not set or out of range, "
>> + "valid values are within range from 0 to %lu",
>> SCHED_RT_VCPU_BUDGET_MAX);
>> + return 2;
>> + }
>> +
> I think some basics sanity checking are fine done here. E.g., you may
> also add a (budget <= period) check. However, as George said already:
> - make sure you limit these to the kind of checks based on info the
> toolstack should have, and defer the rest to the hypervisor
> - if something goes wrong, make sure to always return libxl error codes
> (typically, ERROR_INVAL), as sched_credit_domain_set() does.
>
> Oh and, just double checking again, I think we decided to handle
> (budget ==0 && period == 0) in a special way, so remember that! :-P
Yes. Now I didn't use any array in toolstack or kernel to set/get
domain's parameters. So we don't use (budget == 0 && period == 0) to
indicate the vcpus not changed. (Whenever user set a domain's vcpu's
parameters, we set all vcpus' parameters of this domain, so we don't
need such implication for 4.5 release. :-P) The array comes "only"
when we allow users to set/get a specific vcpu's parameters and vcpus
have different periods and budgets.
As to the 4.5 release, because we decide to not having the
functionality of setting/getting each vcpu's parameters. The current
toolstack implementation is aimed to setting/getting each vcpu's
parameters, the code change could be a lot, (but the result tool stack
code for 4.5 will be very similar to the toolstack code of existing
schedulers.) I think I will release a version soon to let you guys
have a look. What do you think?
>
> It's personal taste, I guess, but I think you don't really need an
> helper function for this, and it can leave in sched_rt_domain_set.
Right!
>
>> +static int sched_rt_domain_set(libxl__gc *gc, uint32_t domid,
>> + const libxl_domain_sched_params *scinfo)
>> +{
>> + struct xen_domctl_sched_rt_params sdom;
>> + uint16_t num_vcpus;
>> + int rc;
>> +
>> + rc = xc_sched_rt_domain_get_num_vcpus(CTX->xch, domid, &num_vcpus);
>> + if (rc != 0) {
>> + LOGE(ERROR, "getting domain sched rt");
>> + return ERROR_FAIL;
>> + }
>> +
>> + rc = sched_rt_domain_set_validate_params(gc, scinfo, num_vcpus);
>> + if (rc == 2)
>> + return ERROR_INVAL;
>> + if (rc == 1)
>> + return 0;
>> + if (rc == 0)
>> + {
>> + sdom.index = scinfo->rt.vcpu_index;
>> + sdom.period = scinfo->rt.period;
>> + sdom.budget = scinfo->rt.budget;
>> + }
>> +
> So, I see that you are actually returning libxl error codes, good. Well,
> again, just put the code above directly here, instead of having to
> define and then interpret an ad-hoc error handling logic. :-)
Removed the ad-hoc error code. :-)
>
>> @@ -5177,6 +5310,9 @@ int libxl_domain_sched_params_set(libxl_ctx *ctx,
>> uint32_t domid,
>> case LIBXL_SCHEDULER_ARINC653:
>> ret=sched_arinc653_domain_set(gc, domid, scinfo);
>> break;
>> + case LIBXL_SCHEDULER_RT:
>> + ret=sched_rt_domain_set(gc, domid, scinfo);
>> + break;
> Again, I seriously think I remember we agreed upon _SCHEDULER_RTDS (or
> _RT_DS) as thee name of this thing. Am I wrong?
>
Right! We agreed on RT_DS. I changed the hypervisor code and didn't
realize I also need to change the tool stack part. Will change it the
next patch.
>> --- a/tools/libxl/libxl_types.idl
>> +++ b/tools/libxl/libxl_types.idl
>> @@ -153,6 +153,7 @@ libxl_scheduler = Enumeration("scheduler", [
>> (5, "credit"),
>> (6, "credit2"),
>> (7, "arinc653"),
>> + (8, "rt"),
> rtds? rt_ds?
>
>> @@ -303,6 +304,19 @@ libxl_domain_restore_params =
>> Struct("domain_restore_params", [
>> ("checkpointed_stream", integer),
>> ])
>>
>> +libxl_rt_vcpu = Struct("vcpu",[
>> + ("period", uint64, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT'}),
>> + ("budget", uint64, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT'}),
>> + ("index", integer, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_VCPU_INDEX_DEFAULT'}),
>> + ])
>> +
>> +libxl_domain_sched_rt_params = Struct("domain_sched_rt_params",[
>> + ("vcpus", Array(libxl_rt_vcpu, "num_vcpus")),
>> + ("period", uint64, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT'}),
>> + ("budget", uint64, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT'}),
>> + ("vcpu_index", integer, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_VCPU_INDEX_DEFAULT'}),
>> + ])
>> +
>> libxl_domain_sched_params = Struct("domain_sched_params",[
>> ("sched", libxl_scheduler),
>> ("weight", integer, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT'}),
>> @@ -311,6 +325,7 @@ libxl_domain_sched_params =
>> Struct("domain_sched_params",[
>> ("slice", integer, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT'}),
>> ("latency", integer, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_LATENCY_DEFAULT'}),
>> ("extratime", integer, {'init_val':
>> 'LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT'}),
>> + ("rt", libxl_domain_sched_rt_params),
>> ])
> And about this part, we discussed and agreed already in the other
> thread. :-)
>
Yes. Modified for the next patch.
Thank you very much!
Meng
-----------
Meng Xu
PhD Student in Computer and Information Science
University of Pennsylvania
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |