|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.12] x86/vpmu: Improve documentation and parsing for vpmu=
On 04/02/2019 13:53, Jan Beulich wrote:
>>>> On 04.02.19 at 12:41, <andrew.cooper3@xxxxxxxxxx> wrote:
>> --- a/docs/misc/xen-command-line.pandoc
>> +++ b/docs/misc/xen-command-line.pandoc
>> @@ -2088,36 +2088,36 @@ Use Virtual Processor ID support if available. This
>> prevents the need for TLB
>> flushes on VM entry and exit, increasing performance.
>>
>> ### vpmu (x86)
>> -> `= ( <boolean> | { bts | ipc | arch [, ...] } )`
>> + = List of [ <bool>, bts, ipc, arch ]
>>
>> -> Default: `off`
>> + Applicability: x86. Default: false
>>
>> -Switch on the virtualized performance monitoring unit for HVM guests.
>> +Controls for Performance Monitoring Unit virtualisation.
>>
>> -If the current cpu isn't supported a message like
>> -'VPMU: Initialization failed. ...'
>> -is printed on the hypervisor serial log.
>> +Performance monitoring facilities tend to be very hardware specific, and
>> +provide access to a wealth of low level processor information.
>>
>> -For some Intel Nehalem processors a quirk handling exist for an unknown
>> -wrong behaviour (see `handle_pmc_quirk()`).
>> +* An overall boolean can be used to enable or disable vPMU support. vPMU
>> is
>> + disabled by default. Specifying any of `bts`, `ipc` or `arch` implies
>> + `vpmu=true`.
>>
>> -If 'vpmu=bts' is specified the virtualisation of the Branch Trace Store
>> (BTS)
>> -feature is switched on on Intel processors supporting this feature.
>> + Xen's watchdog functionality is implemented using performance counters.
>> + As a result, use of the **watchdog** option will override and disable
>> + vPMU.
>>
>> -vpmu=ipc enables performance monitoring, but restricts the counters to the
>> -most minimum set possible: instructions, cycles, and reference cycles. These
>> -can be used to calculate instructions per cycle (IPC).
>> +* The `bts` option enabled performance monitoring, and permits access to
>> the
> DYM "enables" here (and also below for `ipc`)?
Oops yes. Fixed.
>
>> --- a/xen/arch/x86/cpu/vpmu.c
>> +++ b/xen/arch/x86/cpu/vpmu.c
>> @@ -42,19 +42,9 @@ CHECK_pmu_cntr_pair;
>> CHECK_pmu_data;
>> CHECK_pmu_params;
>>
>> -/*
>> - * "vpmu" : vpmu generally enabled (all counters)
>> - * "vpmu=off" : vpmu generally disabled
>> - * "vpmu=bts" : vpmu enabled and Intel BTS feature switched on.
>> - * "vpmu=ipc" : vpmu enabled for IPC counters only (most restrictive)
>> - * "vpmu=arch" : vpmu enabled for predef arch counters only (restrictive)
>> - * flag combinations are allowed, eg, "vpmu=ipc,bts".
>> - */
>> static unsigned int __read_mostly opt_vpmu_enabled;
>> unsigned int __read_mostly vpmu_mode = XENPMU_MODE_OFF;
>> unsigned int __read_mostly vpmu_features = 0;
>> -static int parse_vpmu_params(const char *s);
>> -custom_param("vpmu", parse_vpmu_params);
>>
>> static DEFINE_SPINLOCK(vpmu_lock);
>> static unsigned vpmu_count;
>> @@ -64,37 +54,37 @@ static DEFINE_PER_CPU(struct vcpu *, last_vcpu);
>> static int __init parse_vpmu_params(const char *s)
>> {
>> const char *ss;
>> + int rc = 0, val;
>> +
>> + do {
>> + ss = strchr(s, ',');
>> + if ( !ss )
>> + ss = strchr(s, '\0');
>> +
>> + if ( (val = parse_bool(s, ss)) >= 0 )
>> + opt_vpmu_enabled = val;
>> + else if ( !cmdline_strcmp(s, "bts") )
>> + vpmu_features |= XENPMU_FEATURE_INTEL_BTS;
>> + else if ( !cmdline_strcmp(s, "ipc") )
>> + vpmu_features |= XENPMU_FEATURE_IPC_ONLY;
>> + else if ( !cmdline_strcmp(s, "arch") )
>> + vpmu_features |= XENPMU_FEATURE_ARCH_ONLY;
>> + else
>> + rc = -EINVAL;
>>
>> - switch ( parse_bool(s, NULL) )
>> - {
>> - case 0:
>> - break;
>> - default:
>> - do {
>> - ss = strchr(s, ',');
>> - if ( !ss )
>> - ss = strchr(s, '\0');
>> -
>> - if ( !cmdline_strcmp(s, "bts") )
>> - vpmu_features |= XENPMU_FEATURE_INTEL_BTS;
>> - else if ( !cmdline_strcmp(s, "ipc") )
>> - vpmu_features |= XENPMU_FEATURE_IPC_ONLY;
>> - else if ( !cmdline_strcmp(s, "arch") )
>> - vpmu_features |= XENPMU_FEATURE_ARCH_ONLY;
>> - else
>> - return -EINVAL;
>> + s = ss + 1;
>> + } while ( *ss );
>> +
>> + /* Selecting bts/ipc/arch forces vpmu to enabled. */
>> + if ( vpmu_features )
>> + opt_vpmu_enabled = true;
> If you want to retain original behavior, the condition here would need
> to be "!rc && vpmu_features". It's not clear whether your modification
> in this regard is intentional.
Oh - that wasn't intentional.
An alternative, now I think about it, is to just have the <bool>=false
case clear vpmu_features. This is new behaviour, but it is more
consistent with how other options work, and it wasn't expressable before.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |