From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
To: Brendan Gregg <bgregg@netflix.com>, xen-devel@lists.xen.org
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
"Tian, Kevin" <kevin.tian@intel.com>,
Jan Beulich <jbeulich@suse.com>,
Jun Nakajima <jun.nakajima@intel.com>,
dietmar.hahn@ts.fujitsu.com
Subject: Re: [PATCH v4 2/2] x86/VPMU: implement ipc and arch filter flags
Date: Mon, 7 Dec 2015 14:13:47 -0500 [thread overview]
Message-ID: <5665DA6B.8010300@oracle.com> (raw)
In-Reply-To: <1448930346-16902-1-git-send-email-bgregg@netflix.com>
On 11/30/2015 07:39 PM, Brendan Gregg wrote:
> This introduces a way to have a restricted VPMU, by specifying one of two
> predefined groups of PMCs to make available. For secure environments, this
> allows the VPMU to be used without needing to enable all PMCs.
>
> Signed-off-by: Brendan Gregg <bgregg@netflix.com>
> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
This needs to be reviewed also by Intel maintainers (copied). Plus x86
maintainers.
-boris
> ---
> docs/misc/xen-command-line.markdown | 15 ++++++++++-
> xen/arch/x86/cpu/vpmu.c | 51 +++++++++++++++++++++++++++++--------
> xen/arch/x86/cpu/vpmu_intel.c | 50 ++++++++++++++++++++++++++++++++++++
> xen/include/asm-x86/msr-index.h | 1 +
> xen/include/public/pmu.h | 14 ++++++++--
> 5 files changed, 117 insertions(+), 14 deletions(-)
>
> diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown
> index 70daa84..795661e 100644
> --- a/docs/misc/xen-command-line.markdown
> +++ b/docs/misc/xen-command-line.markdown
> @@ -1452,7 +1452,7 @@ Use Virtual Processor ID support if available. This prevents the need for TLB
> flushes on VM entry and exit, increasing performance.
>
> ### vpmu
> -> `= ( bts )`
> +> `= ( <boolean> | { bts | ipc | arch [, ...] } )`
>
> > Default: `off`
>
> @@ -1468,6 +1468,19 @@ wrong behaviour (see handle\_pmc\_quirk()).
> If 'vpmu=bts' is specified the virtualisation of the Branch Trace Store (BTS)
> feature is switched on on Intel processors supporting this feature.
>
> +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).
> +
> +vpmu=arch enables performance monitoring, but restricts the counters to the
> +pre-defined architectural events only. These are exposed by cpuid, and listed
> +in the Pre-Defined Architectural Performance Events table from the Intel 64
> +and IA-32 Architectures Software Developer's Manual, Volume 3B, System
> +Programming Guide, Part 2.
> +
> +If a boolean is not used, combinations of flags are allowed, comma separated.
> +For example, vpmu=arch,bts.
> +
> Note that if **watchdog** option is also specified vpmu will be turned off.
>
> *Warning:*
> diff --git a/xen/arch/x86/cpu/vpmu.c b/xen/arch/x86/cpu/vpmu.c
> index 2f5156a..46b5324 100644
> --- a/xen/arch/x86/cpu/vpmu.c
> +++ b/xen/arch/x86/cpu/vpmu.c
> @@ -43,34 +43,59 @@ CHECK_pmu_data;
> CHECK_pmu_params;
>
> /*
> - * "vpmu" : vpmu generally enabled
> - * "vpmu=off" : vpmu generally disabled
> - * "vpmu=bts" : vpmu enabled and Intel BTS feature switched on.
> + * "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 void parse_vpmu_param(char *s);
> -custom_param("vpmu", parse_vpmu_param);
> +static void parse_vpmu_params(char *s);
> +custom_param("vpmu", parse_vpmu_params);
>
> static DEFINE_SPINLOCK(vpmu_lock);
> static unsigned vpmu_count;
>
> static DEFINE_PER_CPU(struct vcpu *, last_vcpu);
>
> -static void __init parse_vpmu_param(char *s)
> +static int parse_vpmu_param(char *s, int len)
> {
> + if ( ! *s || ! len )
> + return 0;
> + if ( !strncmp(s, "bts", len) )
> + vpmu_features |= XENPMU_FEATURE_INTEL_BTS;
> + else if ( !strncmp(s, "ipc", len) )
> + vpmu_features |= XENPMU_FEATURE_IPC_ONLY;
> + else if ( !strncmp(s, "arch", len) )
> + vpmu_features |= XENPMU_FEATURE_ARCH_ONLY;
> + else
> + return 1;
> + return 0;
> +}
> +
> +static void __init parse_vpmu_params(char *s)
> +{
> + char *sep, *p = s;
> +
> switch ( parse_bool(s) )
> {
> case 0:
> break;
> default:
> - if ( !strcmp(s, "bts") )
> - vpmu_features |= XENPMU_FEATURE_INTEL_BTS;
> - else if ( *s )
> + while (1)
> {
> - printk("VPMU: unknown flag: %s - vpmu disabled!\n", s);
> - break;
> + sep = strchr(p, ',');
> + if ( sep == NULL )
> + sep = strchr(p, 0);
> + if ( parse_vpmu_param(p, sep - p) )
> + goto error;
> + if ( *sep == 0 )
> + /* reached end of flags */
> + break;
> + p = sep + 1;
> }
> /* fall through */
> case 1:
> @@ -79,6 +104,10 @@ static void __init parse_vpmu_param(char *s)
> opt_vpmu_enabled = 1;
> break;
> }
> + return;
> +
> + error:
> + printk("VPMU: unknown flags: %s - vpmu disabled!\n", s);
> }
>
> void vpmu_lvtpc_update(uint32_t val)
> diff --git a/xen/arch/x86/cpu/vpmu_intel.c b/xen/arch/x86/cpu/vpmu_intel.c
> index 8d83a1a..a6c5545 100644
> --- a/xen/arch/x86/cpu/vpmu_intel.c
> +++ b/xen/arch/x86/cpu/vpmu_intel.c
> @@ -602,12 +602,19 @@ static int core2_vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content,
> "MSR_PERF_GLOBAL_STATUS(0x38E)!\n");
> return -EINVAL;
> case MSR_IA32_PEBS_ENABLE:
> + if ( vpmu_features & (XENPMU_FEATURE_IPC_ONLY |
> + XENPMU_FEATURE_ARCH_ONLY) )
> + return -EINVAL;
> if ( msr_content & 1 )
> gdprintk(XENLOG_WARNING, "Guest is trying to enable PEBS, "
> "which is not supported.\n");
> core2_vpmu_cxt->pebs_enable = msr_content;
> return 0;
> case MSR_IA32_DS_AREA:
> + if ( (vpmu_features & (XENPMU_FEATURE_IPC_ONLY |
> + XENPMU_FEATURE_ARCH_ONLY)) &&
> + !(vpmu_features & XENPMU_FEATURE_INTEL_BTS) )
> + return -EINVAL;
> if ( vpmu_is_set(vpmu, VPMU_CPU_HAS_DS) )
> {
> if ( !is_canonical_address(msr_content) )
> @@ -652,12 +659,55 @@ static int core2_vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content,
> tmp = msr - MSR_P6_EVNTSEL(0);
> if ( tmp >= 0 && tmp < arch_pmc_cnt )
> {
> + bool_t blocked = 0;
> + uint64_t umaskevent;
> struct xen_pmu_cntr_pair *xen_pmu_cntr_pair =
> vpmu_reg_pointer(core2_vpmu_cxt, arch_counters);
>
> if ( msr_content & ARCH_CTRL_MASK )
> return -EINVAL;
>
> + /* PMC filters */
> + umaskevent = msr_content & MSR_IA32_CMT_EVTSEL_UE_MASK;
> + if ( vpmu_features & XENPMU_FEATURE_IPC_ONLY ||
> + vpmu_features & XENPMU_FEATURE_ARCH_ONLY )
> + {
> + blocked = 1;
> + switch ( umaskevent )
> + {
> + /*
> + * See the Pre-Defined Architectural Performance Events table
> + * from the Intel 64 and IA-32 Architectures Software
> + * Developer's Manual, Volume 3B, System Programming Guide,
> + * Part 2.
> + */
> + case 0x003c: /* unhalted core cycles */
> + case 0x013c: /* unhalted ref cycles */
> + case 0x00c0: /* instruction retired */
> + blocked = 0;
> + default:
> + break;
> + }
> + }
> +
> + if ( vpmu_features & XENPMU_FEATURE_ARCH_ONLY )
> + {
> + /* additional counters beyond IPC only; blocked already set */
> + switch ( umaskevent )
> + {
> + case 0x4f2e: /* LLC reference */
> + case 0x412e: /* LLC misses */
> + case 0x00c4: /* branch instruction retired */
> + case 0x00c5: /* branch */
> + blocked = 0;
> + default:
> + break;
> + }
> + }
> +
> + if ( blocked )
> + return -EINVAL;
> +
> if ( has_hvm_container_vcpu(v) )
> vmx_read_guest_msr(MSR_CORE_PERF_GLOBAL_CTRL,
> &core2_vpmu_cxt->global_ctrl);
> diff --git a/xen/include/asm-x86/msr-index.h b/xen/include/asm-x86/msr-index.h
> index b8ad93c..0542064 100644
> --- a/xen/include/asm-x86/msr-index.h
> +++ b/xen/include/asm-x86/msr-index.h
> @@ -328,6 +328,7 @@
>
> /* Platform Shared Resource MSRs */
> #define MSR_IA32_CMT_EVTSEL 0x00000c8d
> +#define MSR_IA32_CMT_EVTSEL_UE_MASK 0x0000ffff
> #define MSR_IA32_CMT_CTR 0x00000c8e
> #define MSR_IA32_PSR_ASSOC 0x00000c8f
> #define MSR_IA32_PSR_L3_QOS_CFG 0x00000c81
> diff --git a/xen/include/public/pmu.h b/xen/include/public/pmu.h
> index 7753df0..f9ad7b4 100644
> --- a/xen/include/public/pmu.h
> +++ b/xen/include/public/pmu.h
> @@ -84,9 +84,19 @@ DEFINE_XEN_GUEST_HANDLE(xen_pmu_params_t);
>
> /*
> * PMU features:
> - * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD)
> + * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD)
> + * - XENPMU_FEATURE_IPC_ONLY: Restrict PMC to the most minimum set possible.
> + * Instructions, cycles, and ref cycles. Can be
> + * used to calculate instructions-per-cycle (IPC)
> + * (ignored on AMD).
> + * - XENPMU_FEATURE_ARCH_ONLY: Restrict PMCs to the Intel Pre-Defined
> + * Architecteral Performance Events exposed by
> + * cpuid and listed in the Intel developer's manual
> + * (ignored on AMD).
> */
> -#define XENPMU_FEATURE_INTEL_BTS 1
> +#define XENPMU_FEATURE_INTEL_BTS (1<<0)
> +#define XENPMU_FEATURE_IPC_ONLY (1<<1)
> +#define XENPMU_FEATURE_ARCH_ONLY (1<<2)
>
> /*
> * Shared PMU data between hypervisor and PV(H) domains.
next prev parent reply other threads:[~2015-12-07 19:13 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-01 0:39 [PATCH v4 2/2] x86/VPMU: implement ipc and arch filter flags Brendan Gregg
2015-12-07 19:13 ` Boris Ostrovsky [this message]
2015-12-11 7:54 ` Tian, Kevin
2015-12-18 6:12 ` Tian, Kevin
2016-01-05 1:37 ` Brendan Gregg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5665DA6B.8010300@oracle.com \
--to=boris.ostrovsky@oracle.com \
--cc=andrew.cooper3@citrix.com \
--cc=bgregg@netflix.com \
--cc=dietmar.hahn@ts.fujitsu.com \
--cc=jbeulich@suse.com \
--cc=jun.nakajima@intel.com \
--cc=kevin.tian@intel.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).