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

Re: [Xen-devel] [PATCH v6 for Xen 4.7 3/4] libxl: enable per-VCPU parameter settings for RTDS scheduler



On Tue, Mar 8, 2016 at 1:12 PM, Wei Liu <wei.liu2@xxxxxxxxxx> wrote:
> On Sun, Mar 06, 2016 at 11:55:57AM -0600, Chong Li wrote:
> [...]
>>  tools/libxl/libxl.c         | 326 
>> ++++++++++++++++++++++++++++++++++++++++----
>>  tools/libxl/libxl.h         |  37 +++++
>>  tools/libxl/libxl_types.idl |  14 ++
>>  3 files changed, 354 insertions(+), 23 deletions(-)
>>
>> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
>> index bd3aac8..4532e86 100644
>> --- a/tools/libxl/libxl.c
>> +++ b/tools/libxl/libxl.c
>> @@ -5770,6 +5770,207 @@ static int sched_credit2_domain_set(libxl__gc *gc, 
>> uint32_t domid,
>>      return 0;
>>  }
>>
>> +static int sched_rtds_validate_params(libxl__gc *gc, int period,
>> +                                    int budget, uint32_t *sdom_period,
>> +                                    uint32_t *sdom_budget)
>
>
> This is a strange pattern. It does more than what it's name suggests.
>
> It seems this function just returns the vanilla values in period and
> budget. It can be simplified by removing sdom_period and sdom_budget all
> together. Do you agree?

Yes.

>> +
>> +/* Get the RTDS scheduling parameters of vcpu(s) */
>> +static int sched_rtds_vcpu_get(libxl__gc *gc, uint32_t domid,
>> +                               libxl_vcpu_sched_params *scinfo)
>> +{
>> +    uint32_t num_vcpus;
>> +    int i, r, rc;
>> +    xc_dominfo_t info;
>> +    struct xen_domctl_schedparam_vcpu *vcpus;
>> +
>> +    r = xc_domain_getinfo(CTX->xch, domid, 1, &info);
>> +    if (r < 0) {
>> +        LOGE(ERROR, "getting domain info");
>> +        rc = ERROR_FAIL;
>> +        goto out;
>> +    }
>> +
>> +    num_vcpus = scinfo->num_vcpus ? scinfo->num_vcpus :
>> +                                info.max_vcpu_id + 1;
>> +
>> +    GCNEW_ARRAY(vcpus, num_vcpus);
>> +
>> +    if (scinfo->num_vcpus > 0) {
>> +        for (i = 0; i < num_vcpus; i++) {
>> +            if (scinfo->vcpus[i].vcpuid < 0 ||
>> +                scinfo->vcpus[i].vcpuid > info.max_vcpu_id) {
>> +                LOG(ERROR, "VCPU index is out of range, "
>> +                           "valid values are within range from 0 to %d",
>> +                           info.max_vcpu_id);
>> +                rc = ERROR_INVAL;
>> +                goto out;
>> +            }
>> +            vcpus[i].vcpuid = scinfo->vcpus[i].vcpuid;
>> +        }
>> +    } else
>> +        for (i = 0; i < num_vcpus; i++)
>> +            vcpus[i].vcpuid = i;
>> +
>> +    r = xc_sched_rtds_vcpu_get(CTX->xch, domid, vcpus, num_vcpus);
>> +    if (r != 0) {
>> +        LOGE(ERROR, "getting vcpu sched rtds");
>> +        rc = ERROR_FAIL;
>> +        goto out;
>> +    }
>> +    scinfo->sched = LIBXL_SCHEDULER_RTDS;
>> +    if (scinfo->num_vcpus == 0) {
>> +        scinfo->num_vcpus = num_vcpus;
>> +        scinfo->vcpus = libxl__calloc(NOGC, num_vcpus,
>> +                                sizeof(libxl_sched_params));
>> +    }
>> +    for(i = 0; i < num_vcpus; i++) {
>> +        scinfo->vcpus[i].period = vcpus[i].s.rtds.period;
>> +        scinfo->vcpus[i].budget = vcpus[i].s.rtds.budget;
>> +        scinfo->vcpus[i].vcpuid = vcpus[i].vcpuid;
>> +    }
>> +return r;
>
> Just set rc = 0 here?

Ok.

>
>> +out:
>> +    return rc;
>> +}
>> +
>> +/* Set the RTDS scheduling parameters of vcpu(s) */
>> +static int sched_rtds_vcpus_params_set(libxl__gc *gc, uint32_t domid,
>> +                               const libxl_vcpu_sched_params *scinfo)
>> +{
>> +    int r, rc;
>> +    int i;
>> +    uint16_t max_vcpuid;
>> +    xc_dominfo_t info;
>> +    struct xen_domctl_schedparam_vcpu *vcpus;
>> +    uint32_t num_vcpus;
>> +
>> +    r = xc_domain_getinfo(CTX->xch, domid, 1, &info);
>> +    if (r < 0) {
>> +        LOGE(ERROR, "getting domain info");
>> +        rc = ERROR_FAIL;
>> +        goto out;
>> +    }
>> +    max_vcpuid = info.max_vcpu_id;
>> +
>> +    if (scinfo->num_vcpus > 0) {
>> +        num_vcpus = scinfo->num_vcpus;
>> +        GCNEW_ARRAY(vcpus, num_vcpus);
>> +        for (i = 0; i < num_vcpus; i++) {
>> +            if (scinfo->vcpus[i].vcpuid < 0 ||
>> +                scinfo->vcpus[i].vcpuid > max_vcpuid) {
>> +                LOG(ERROR, "VCPU index is out of range, "
>> +                           "valid values are within range from 0 to %d",
>> +                           max_vcpuid);
>> +                rc = ERROR_INVAL;
>> +                goto out;
>> +            }
>> +            vcpus[i].vcpuid = scinfo->vcpus[i].vcpuid;
>> +
>
> I would suggest you use a separate loop to validate the input, otherwise
> you risk getting input partial success.

What do you mean by "partial success"?
Do you suggest to validate the entire input first, and then create &&
set the vcpus array?

>
>> +            rc = sched_rtds_validate_params(gc,
>> +                    scinfo->vcpus[i].period, scinfo->vcpus[i].budget,
>> +                    &vcpus[i].s.rtds.period, &vcpus[i].s.rtds.budget);
>> +            if (rc) {
>> +                rc = ERROR_INVAL;
>> +                goto out;
>> +            }
>> +        }
>> +    } else {
>> +        rc = ERROR_INVAL;
>> +        goto out;
>> +    }
>

Chong



-- 
Chong Li
Department of Computer Science and Engineering
Washington University in St.louis

_______________________________________________
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®.