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

Re: [Xen-devel] [PATCH v2] new config option vtsc_khz_tolerance to avoid TSC emulation



>>> On 05.03.18 at 12:35, <olaf@xxxxxxxxx> wrote:

One thing I'm missing in the description (or the added documentation)
is a discussion of the conditions under which it is safe to make use of
the new setting.

> @@ -954,11 +955,21 @@ long arch_do_domctl(
>              tsc_set_info(d, domctl->u.tsc_info.tsc_mode,
>                           domctl->u.tsc_info.elapsed_nsec,
>                           domctl->u.tsc_info.gtsc_khz,
> +                         domctl->u.tsc_info.vtsc_khz_tolerance,
>                           domctl->u.tsc_info.incarnation);
>              domain_unpause(d);
>          }
>          break;
>  
> +    case XEN_DOMCTL_set_vtsc_khz_tolerance:
> +        if ( d == currd )
> +            ret = -EINVAL;

Why? There's e.g. no domain_pause() involved here. And without
that there's no difference between changing the value behind the
back of a foreign domain, of for oneself. Granted Dom0 isn't likely
to want to do that, but such checks should have a reason.

> +        else
> +        {
> +            d->arch.vtsc_khz_tolerance = 
> domctl->u.tsc_info.vtsc_khz_tolerance;
> +        }

Stray braces (the more that the if() side doesn't have them).

Also throughout the patch I wonder if it wasn't more natural to
put the unit last in the parameter / field names.

> @@ -2122,7 +2123,8 @@ void tsc_get_info(struct domain *d, uint32_t *tsc_mode,
>   */
>  void tsc_set_info(struct domain *d,
>                    uint32_t tsc_mode, uint64_t elapsed_nsec,
> -                  uint32_t gtsc_khz, uint32_t incarnation)
> +                  uint32_t gtsc_khz, uint16_t vtsc_khz_tolerance,
> +                  uint32_t incarnation)

For the sake of consistency with the other types here I'm not
going to demand to replace uint16_t here, but it's really not
necessary to use that type here (other than on the read path).

> @@ -2147,8 +2152,24 @@ void tsc_set_info(struct domain *d,
>           * When a guest is created, gtsc_khz is passed in as zero, making
>           * d->arch.tsc_khz == cpu_khz. Thus no need to check incarnation.
>           */
> +        diff_tolerated = d->arch.tsc_khz == cpu_khz;
> +
> +        if ( tsc_mode == TSC_MODE_DEFAULT && gtsc_khz ) {

Style.

> +            uint32_t khz_diff;
> +
> +            khz_diff = cpu_khz > gtsc_khz ?
> +                       cpu_khz - gtsc_khz : gtsc_khz - cpu_khz;
> +            if (vtsc_khz_tolerance)

Again.

> +                diff_tolerated = khz_diff <= vtsc_khz_tolerance;
> +
> +            printk(XENLOG_WARNING "%s: d%u: host has %lu kHz,"
> +                   " domU expects %u kHz,"
> +                   " difference of %u is %s tolerance of %u\n",
> +                   __func__, d->domain_id, cpu_khz, gtsc_khz, khz_diff,
> +                   diff_tolerated ? "within" : "outside", 
> vtsc_khz_tolerance);

Leftover debugging message?

> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -697,12 +697,14 @@ struct xen_domctl_disable_migrate {
>  
>  /* XEN_DOMCTL_gettscinfo */
>  /* XEN_DOMCTL_settscinfo */
> +/* XEN_DOMCTL_set_vtsc_khz_tolerance */
>  struct xen_domctl_tsc_info {
>      /* IN/OUT */
>      uint32_t tsc_mode;
>      uint32_t gtsc_khz;
>      uint32_t incarnation;
> -    uint32_t pad;
> +    uint16_t vtsc_khz_tolerance;
> +    uint16_t pad;

Generally with the prior pad field not being checked anywhere this
isn't a valid extension. However, this being a domctl (and the
interface version suitably bumped already) plus looking at how the
libxc code works, I think you can get away doing it like this.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.