[libvirt] [PATCH 1/4] libxl: fix timer configuration

Joao Martins joao.m.martins at oracle.com
Fri Jan 20 23:14:39 UTC 2017



On 01/20/2017 09:55 PM, Jim Fehlig wrote:
> On 01/20/2017 05:00 AM, Joao Martins wrote:
>> On 01/20/2017 01:59 AM, Jim Fehlig wrote:
>>> The current logic around configuring timers in libxl based on
>>> virDomainDef object is a bit brain dead. Unsupported timers are
>>> silently ignored and tsc is only recognized if it is the first
>>> timer specified.
>>>
>>> Change the logic to reject unsupported timers and honor the tsc
>>> timer regardless of its order when multiple timers are specified.
>>>
>>> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
>>> ---
>>>  src/libxl/libxl_conf.c | 40 +++++++++++++++++++++++++++++++---------
>>>  1 file changed, 31 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
>>> index a24f9e0..3e6d623 100644
>>> --- a/src/libxl/libxl_conf.c
>>> +++ b/src/libxl/libxl_conf.c
>>> @@ -313,9 +313,10 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
>>>      for (i = 0; i < virDomainDefGetVcpus(def); i++)
>>>          libxl_bitmap_set((&b_info->avail_vcpus), i);
>>>
>>> -    if (def->clock.ntimers > 0 &&
>>> -        def->clock.timers[0]->name == VIR_DOMAIN_TIMER_NAME_TSC) {
>>> -        switch (def->clock.timers[0]->mode) {
>>> +    for (i = 0; i < def->clock.ntimers; i++) {
>>> +        switch ((virDomainTimerNameType) def->clock.timers[i]->name) {
>>> +        case VIR_DOMAIN_TIMER_NAME_TSC:
>>> +            switch (def->clock.timers[i]->mode) {
>>>              case VIR_DOMAIN_TIMER_MODE_NATIVE:
>>>                  b_info->tsc_mode = 2;
>>>                  break;
>>> @@ -324,8 +325,35 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
>>>                  break;
>>>              default:
>>>                  b_info->tsc_mode = 1;
>>> +            }
>>> +            break;
>>> +
>>> +        case VIR_DOMAIN_TIMER_NAME_HPET:
>>> +            if (!hvm) {
>>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>>> +                               _("unsupported timer type (name) '%s'"),
>>> +                               virDomainTimerNameTypeToString(def->clock.timers[i]->name));
>>> +                return -1;
>>> +            }
>>> +            if (def->clock.timers[i]->present == 1)
>>> +                libxl_defbool_set(&b_info->u.hvm.hpet, 1);
>>> +            break;
>>> +
>>> +        case VIR_DOMAIN_TIMER_NAME_PLATFORM:
>>> +        case VIR_DOMAIN_TIMER_NAME_KVMCLOCK:
>>> +        case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK:
>> Interestingly, and looking at the code [toolstack:
>> tools/libxl/libxl_dom.c:hvm_set_viridian_features(), hypervisor:
>> xen/arch/x86/hvm/viridian.c:update_reference_tsc()] it looks like that to some
>> extent we support the Hyper-V Reference TSC page (Hyper-V Clock?) but it is kept
>> disabled in the viridian base features in libxl. Even if we wanted to enable it
>> would have to be more specific than adding <viridian /> feature like with:
>>
>> libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
>> LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_BASE);
> 
> I'd think <viridian/> OS feature would enable 
> LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_BASE
Yeap.

> 
>> libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
>> LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_TSC);
> 
> And this one would be enabled with
> 
>    <clock>
>      <timer name='hypervclock'/>
>    </clock>
> 
> Is that correct? Should a hypervclock timer also include 
> LIBXL_VIRIDIAN_ENLIGHTENMENT_TIME_REF_COUNT?
IIUC the TIME_REF_COUNT enlightenment is for older versions of windwos, whereas
REFERENCE_TSC is the newer one and most performant. Presumably TIME_REF is
included in the base viridian features.

> 
>> and perhaps behind "#ifdef LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_TSC" as this
>> is only supported since Xen 4.6.0? And I think it would work with tsc_mode not
>> being emulated? Relevant commit on Xen is dd94caca5 ("x86/viridian: add
>> Partition Reference Time enlightenment") Anyhow this is probably not in the
>> context of this series, just food for thought in case we want to have in the future.
> 
> Good points, and agree they could be addressed in a followup series that enables 
> viridian enlightenments.
> 
>>
>>> +        case VIR_DOMAIN_TIMER_NAME_RTC:
>>> +        case VIR_DOMAIN_TIMER_NAME_PIT:
>>> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>>> +                           _("unsupported timer type (name) '%s'"),
>>> +                           virDomainTimerNameTypeToString(def->clock.timers[i]->name));
>>> +            return -1;
>>> +
>>> +        case VIR_DOMAIN_TIMER_NAME_LAST:
>>> +            break;
>>>          }
>>>      }
>>> +
>> Spurious whitespace? Or perhaps it was purposely added?
> 
> Initially I think it was spurious, but looking again I think it brings some 
> needed whitespace between these sections of code.
Yeap that's what it sounded like, that is to separate these two sections.

> 
> Regards,
> Jim
> 
>>
>>>      b_info->sched_params.weight = 1000;
>>>      b_info->max_memkb = virDomainDefGetMemoryInitial(def);
>>>      b_info->target_memkb = def->mem.cur_balloon;
>>> @@ -341,12 +369,6 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
>>>          libxl_defbool_set(&b_info->u.hvm.acpi,
>>>                            def->features[VIR_DOMAIN_FEATURE_ACPI] ==
>>>                            VIR_TRISTATE_SWITCH_ON);
>>> -        for (i = 0; i < def->clock.ntimers; i++) {
>>> -            if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET &&
>>> -                def->clock.timers[i]->present == 1) {
>>> -                libxl_defbool_set(&b_info->u.hvm.hpet, 1);
>>> -            }
>>> -        }
>>>
>>>          if (def->nsounds > 0) {
>>>              /*
>>>
>>
> 




More information about the libvir-list mailing list