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

Joao Martins joao.m.martins at oracle.com
Fri Jan 20 12:00:34 UTC 2017


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);

libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_TSC);

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.

> +        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?

>      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