|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/cpuid: Introduce dom0-cpuid command line option
On 14.12.2021 22:16, Andrew Cooper wrote:
> Specifically, this lets the user opt in to non-default for dom0.
>
> Split features[] out of parse_xen_cpuid(), giving it a lightly more
> appropraite name, so it can be shared with parse_xen_cpuid().
With the latter one I guess you mean parse_dom0_cpuid()?
> Collect all dom0 settings together in dom0_{en,dis}able_feat[], and apply it
> to dom0's policy when other tweaks are being made.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Wei Liu <wl@xxxxxxx>
> CC: Daniel Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
>
> RFC, because I think we've got a preexisting error with late hwdom here. We
> really should not be cobbering a late hwdom's settings (which were provided in
> the usual way by the toolstack in dom0).
For ITSC I think also covering late hwdom is at least acceptable. For the
speculation controls I'm less certain (but as per the comment there they're
temporary only anyway), and I agree the command line option here should
strictly only apply to Dom0 (or else, as a minor aspect, the option also
would better be named "hwdom-cpuid=").
> Furthermore, the distinction gets more murky in a hyperlaunch future where
> multiple domains may be constructed by Xen, and there is reason to expect that
> a full toolstack-like configuration is made available for them.
Like above, anything created via the toolstack interfaces should use the
toolstack controls. If there was something dom0less-like on x86, domains
created that way (without toolstack involvement) would instead want to
have another way of controlling their CPUID settings.
> One option might be to remove the special case from init_domain_cpuid_policy()
> and instead make a call into the cpuid code from create_dom0(). It would have
> to be placed between domain_create() and alloc_dom0_vcpu0() for dynamic sizing
> of the FPU block to work. Thoughts?
As said above, I think the ITSC special case could stay. But apart from
this I agree.
> --- a/docs/misc/xen-command-line.pandoc
> +++ b/docs/misc/xen-command-line.pandoc
> @@ -801,6 +801,22 @@ Controls for how dom0 is constructed on x86 systems.
>
> If using this option is necessary to fix an issue, please report a bug.
>
> +### dom0-cpuid
> + = List of comma separated booleans
> +
> + Applicability: x86
> +
> +This option allows for fine tuning of the facilities dom0 will use, after
> +accounting for hardware capabilities and Xen settings as enumerated via
> CPUID.
> +
> +Options are accepted in positive and negative form, to enable or disable
> +specific features. All selections via this mechanism are subject to normal
> +CPU Policy safety logic.
> +
> +This option is intended for developers to opt dom0 into non-default features,
> +and is not intended for use in production circumstances. If using this
> option
> +is necessary to fix an issue, please report a bug.
You may want to state explicitly that disables take priority over enables,
as per the present implementation. Personally I would find it better if the
item specified last took effect. This is, as mentioned in other contexts,
so one can override earlier settings (e.g. in a xen.cfg file used with
xen.efi) by simply appending to the command line.
> @@ -97,6 +98,73 @@ static int __init parse_xen_cpuid(const char *s)
> }
> custom_param("cpuid", parse_xen_cpuid);
>
> +static uint32_t __hwdom_initdata dom0_enable_feat[FSCAPINTS];
> +static uint32_t __hwdom_initdata dom0_disable_feat[FSCAPINTS];
> +
> +static int __init parse_dom0_cpuid(const char *s)
> +{
> + const char *ss;
> + int val, rc = 0;
> +
> + do {
> + const struct feature_name *lhs, *rhs, *mid = NULL /* GCC... */;
> + const char *feat;
> +
> + ss = strchr(s, ',');
> + if ( !ss )
> + ss = strchr(s, '\0');
> +
> + /* Skip the 'no-' prefix for name comparisons. */
> + feat = s;
> + if ( strncmp(s, "no-", 3) == 0 )
> + feat += 3;
> +
> + /* (Re)initalise lhs and rhs for binary search. */
> + lhs = feature_names;
> + rhs = feature_names + ARRAY_SIZE(feature_names);
> +
> + while ( lhs < rhs )
> + {
> + int res;
> +
> + mid = lhs + (rhs - lhs) / 2;
> + res = cmdline_strcmp(feat, mid->name);
> +
> + if ( res < 0 )
> + {
> + rhs = mid;
> + continue;
> + }
> + if ( res > 0 )
> + {
> + lhs = mid + 1;
> + continue;
> + }
> +
> + if ( (val = parse_boolean(mid->name, s, ss)) >= 0 )
> + {
> + __set_bit(mid->bit,
> + val ? dom0_enable_feat : dom0_disable_feat);
> + mid = NULL;
> + }
> +
> + break;
> + }
> +
> + /*
> + * Mid being NULL means that the name and boolean were successfully
> + * identified. Everything else is an error.
> + */
> + if ( mid )
> + rc = -EINVAL;
> +
> + s = ss + 1;
> + } while ( *ss );
> +
> + return rc;
> +}
> +custom_param("dom0-cpuid", parse_dom0_cpuid);
I wonder whether it wouldn't be better (less duplication) if the bulk
of the code was also shared with parse_xen_cpuid(). In return moving
features[] wouldn't be needed then.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |