[libvirt] [RFC PATCH] Add support for invtsc timer

Peter Krempa pkrempa at redhat.com
Tue May 6 14:40:31 UTC 2014


On 05/06/14 15:27, Ján Tomko wrote:
> Not yet merged in upstream QEMU:
> https://lists.gnu.org/archive/html/qemu-devel/2014-04/msg05024.html
> 
> Add support for invariant TSC timer running at constant rate in
> all ACPI P-, C- and T-states.
> 
> It can be enabled by specifying:
> <clock>
>   <timer name='invtsc' present='yes'/>
> </clock>
> in the domain XML.
> 
> Migration and saving the domain does not work with this timer.
> 
> The support for this timer is indicated by bit 8 of EDX after calling
> CPUID with 0x80000007. It does not show up in /proc/cpuinfo [1]
> and since we're calling qemu without 'enforce', it doesn't error
> out if the host doesn't support this.
> 
> Alternatively, we could expose it in libvirt as a cpu flag:
> <cpu mode='custom' match='exact'>
>   <model fallback='forbid'>qemu64</model>
>   <feature policy='require' name='invtsc'/>
> </cpu>
> or maybe add +invtsc to qemu args when the 'nonstop_tsc' flag is
> requested?
> 
> [1]:
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/kernel/cpu/powerflags.c?id=30321c7b#n18
> ---
>  docs/formatdomain.html.in                          |  9 ++++++--
>  docs/schemas/domaincommon.rng                      |  1 +
>  src/conf/domain_conf.c                             |  6 +++--
>  src/conf/domain_conf.h                             |  1 +
>  src/qemu/qemu_command.c                            |  6 +++++
>  src/qemu/qemu_migration.c                          | 14 ++++++++++++
>  .../qemuxml2argv-clock-timer-inv-tsc.args          |  5 +++++
>  .../qemuxml2argv-clock-timer-inv-tsc.xml           | 26 ++++++++++++++++++++++
>  tests/qemuxml2argvtest.c                           |  1 +
>  tests/qemuxml2xmltest.c                            |  1 +
>  10 files changed, 66 insertions(+), 4 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-inv-tsc.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-inv-tsc.xml

...

> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 4249ed5..5154826 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -918,6 +918,7 @@
>              <choice>
>                <value>kvmclock</value>
>                <value>hypervclock</value>
> +              <value>invtsc</value>

I'd prefer to change the name of the feature to "invarianttsc" in
libvirt's representation, but that's just bikeshedding.

>              </choice>
>            </attribute>
>          </group>

...

> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index a9f7fea..c1ffc0f 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -1513,6 +1513,20 @@ qemuMigrationIsAllowed(virQEMUDriverPtr driver, virDomainObjPtr vm,
>          return false;
>      }
>  
> +    for (i = 0; i < def->clock.ntimers; i++) {
> +        virDomainTimerDefPtr timer = def->clock.timers[i];
> +
> +        if (timer->present != 1)
> +            continue;
> +
> +        if (timer->name == VIR_DOMAIN_TIMER_NAME_INVTSC) {
> +            virReportError(VIR_ERR_OPERATION_INVALID,
> +                           _("domain has '%s' timer"),
> +                           virDomainTimerNameTypeToString(timer->name));
> +            return false;
> +        }
> +    }
> +
>      return true;
>  }
>  

It's a shame that this doesn't work across migration in a way HyperV has
designed it.

ACK once the qemu functionality will be released

Peter


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 901 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140506/90a88d84/attachment-0001.sig>


More information about the libvir-list mailing list