From: Dietmar Hahn <dietmar.hahn@ts.fujitsu.com>
To: xen-devel@lists.xen.org
Cc: kevin.tian@intel.com, JBeulich@suse.com, jun.nakajima@intel.com,
andrew.cooper3@citrix.com, tim@xen.org,
Aravind.Gopalakrishnan@amd.com, suravee.suthikulpanit@amd.com,
dgdegra@tycho.nsa.gov,
Boris Ostrovsky <boris.ostrovsky@oracle.com>
Subject: Re: [PATCH v19 13/14] x86/VPMU: Add privileged PMU mode
Date: Wed, 25 Mar 2015 13:25:09 +0100 [thread overview]
Message-ID: <1815098.mR3uYJ4ZVe@amur> (raw)
In-Reply-To: <1426604051-2980-14-git-send-email-boris.ostrovsky@oracle.com>
Am Dienstag 17 März 2015, 10:54:10 schrieb Boris Ostrovsky:
> Add support for privileged PMU mode (XENPMU_MODE_ALL) which allows privileged
> domain (dom0) profile both itself (and the hypervisor) and the guests. While
> this mode is on profiling in guests is disabled.
>
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Dietmar Hahn <dietmar.hahn@ts.fujitsu.com>
Dietmar.
> ---
> Changes in v19:
> * Slightly different mode changing logic in xenpmu_op() since we no longer
> allow mode changes while VPMUs are active
>
> xen/arch/x86/hvm/vpmu.c | 34 +++++++++++++++++++++++++---------
> xen/arch/x86/traps.c | 13 +++++++++++++
> xen/include/public/pmu.h | 3 +++
> 3 files changed, 41 insertions(+), 9 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/vpmu.c b/xen/arch/x86/hvm/vpmu.c
> index beed956..71c5063 100644
> --- a/xen/arch/x86/hvm/vpmu.c
> +++ b/xen/arch/x86/hvm/vpmu.c
> @@ -111,7 +111,9 @@ int vpmu_do_msr(unsigned int msr, uint64_t *msr_content,
> const struct arch_vpmu_ops *ops;
> int ret = 0;
>
> - if ( vpmu_mode == XENPMU_MODE_OFF )
> + if ( (vpmu_mode == XENPMU_MODE_OFF) ||
> + ((vpmu_mode & XENPMU_MODE_ALL) &&
> + !is_hardware_domain(current->domain)) )
> goto nop;
>
> curr = current;
> @@ -166,8 +168,12 @@ void vpmu_do_interrupt(struct cpu_user_regs *regs)
> struct vcpu *sampled = current, *sampling;
> struct vpmu_struct *vpmu;
>
> - /* dom0 will handle interrupt for special domains (e.g. idle domain) */
> - if ( sampled->domain->domain_id >= DOMID_FIRST_RESERVED )
> + /*
> + * dom0 will handle interrupt for special domains (e.g. idle domain) or,
> + * in XENPMU_MODE_ALL, for everyone.
> + */
> + if ( (vpmu_mode & XENPMU_MODE_ALL) ||
> + (sampled->domain->domain_id >= DOMID_FIRST_RESERVED) )
> {
> sampling = choose_hwdom_vcpu();
> if ( !sampling )
> @@ -177,17 +183,18 @@ void vpmu_do_interrupt(struct cpu_user_regs *regs)
> sampling = sampled;
>
> vpmu = vcpu_vpmu(sampling);
> - if ( !is_hvm_vcpu(sampling) )
> + if ( !is_hvm_vcpu(sampling) || (vpmu_mode & XENPMU_MODE_ALL) )
> {
> /* PV(H) guest */
> const struct cpu_user_regs *cur_regs;
> uint64_t *flags = &vpmu->xenpmu_data->pmu.pmu_flags;
> - uint32_t domid = DOMID_SELF;
> + uint32_t domid;
>
> if ( !vpmu->xenpmu_data )
> return;
>
> if ( is_pvh_vcpu(sampling) &&
> + !(vpmu_mode & XENPMU_MODE_ALL) &&
> !vpmu->arch_vpmu_ops->do_interrupt(regs) )
> return;
>
> @@ -204,6 +211,11 @@ void vpmu_do_interrupt(struct cpu_user_regs *regs)
> else
> *flags = PMU_SAMPLE_PV;
>
> + if ( sampled == sampling )
> + domid = DOMID_SELF;
> + else
> + domid = sampled->domain->domain_id;
> +
> /* Store appropriate registers in xenpmu_data */
> /* FIXME: 32-bit PVH should go here as well */
> if ( is_pv_32bit_vcpu(sampling) )
> @@ -232,7 +244,8 @@ void vpmu_do_interrupt(struct cpu_user_regs *regs)
>
> if ( (vpmu_mode & XENPMU_MODE_SELF) )
> cur_regs = guest_cpu_user_regs();
> - else if ( !guest_mode(regs) && is_hardware_domain(sampling->domain) )
> + else if ( !guest_mode(regs) &&
> + is_hardware_domain(sampling->domain) )
> {
> cur_regs = regs;
> domid = DOMID_XEN;
> @@ -508,7 +521,8 @@ static int pvpmu_init(struct domain *d, xen_pmu_params_t *params)
> struct page_info *page;
> uint64_t gfn = params->val;
>
> - if ( vpmu_mode == XENPMU_MODE_OFF )
> + if ( (vpmu_mode == XENPMU_MODE_OFF) ||
> + ((vpmu_mode & XENPMU_MODE_ALL) && !is_hardware_domain(d)) )
> return -EINVAL;
>
> if ( (params->vcpu >= d->max_vcpus) || (d->vcpu == NULL) ||
> @@ -627,12 +641,14 @@ long do_xenpmu_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg)
> {
> case XENPMU_mode_set:
> {
> - if ( (pmu_params.val & ~(XENPMU_MODE_SELF | XENPMU_MODE_HV)) ||
> + if ( (pmu_params.val &
> + ~(XENPMU_MODE_SELF | XENPMU_MODE_HV | XENPMU_MODE_ALL)) ||
> (hweight64(pmu_params.val) > 1) )
> return -EINVAL;
>
> /* 32-bit dom0 can only sample itself. */
> - if ( is_pv_32bit_vcpu(current) && (pmu_params.val & XENPMU_MODE_HV) )
> + if ( is_pv_32bit_vcpu(current) &&
> + (pmu_params.val & (XENPMU_MODE_HV | XENPMU_MODE_ALL)) )
> return -EINVAL;
>
> spin_lock(&vpmu_lock);
> diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
> index 1eb7bb4..8a40deb 100644
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -2653,6 +2653,10 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
> case MSR_AMD_FAM15H_EVNTSEL0...MSR_AMD_FAM15H_PERFCTR5:
> if ( vpmu_msr || (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) )
> {
> + if ( (vpmu_mode & XENPMU_MODE_ALL) &&
> + !is_hardware_domain(v->domain) )
> + break;
> +
> if ( vpmu_do_wrmsr(regs->ecx, msr_content, 0) )
> goto fail;
> }
> @@ -2776,6 +2780,15 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
> case MSR_AMD_FAM15H_EVNTSEL0...MSR_AMD_FAM15H_PERFCTR5:
> if ( vpmu_msr || (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) )
> {
> +
> + if ( (vpmu_mode & XENPMU_MODE_ALL) &&
> + !is_hardware_domain(v->domain) )
> + {
> + /* Don't leak PMU MSRs to unprivileged domains */
> + regs->eax = regs->edx = 0;
> + break;
> + }
> +
> if ( vpmu_do_rdmsr(regs->ecx, &val) )
> goto fail;
>
> diff --git a/xen/include/public/pmu.h b/xen/include/public/pmu.h
> index db5321a..a83ae71 100644
> --- a/xen/include/public/pmu.h
> +++ b/xen/include/public/pmu.h
> @@ -52,10 +52,13 @@ DEFINE_XEN_GUEST_HANDLE(xen_pmu_params_t);
> * - XENPMU_MODE_SELF: Guests can profile themselves
> * - XENPMU_MODE_HV: Guests can profile themselves, dom0 profiles
> * itself and Xen
> + * - XENPMU_MODE_ALL: Only dom0 has access to VPMU and it profiles
> + * everyone: itself, the hypervisor and the guests.
> */
> #define XENPMU_MODE_OFF 0
> #define XENPMU_MODE_SELF (1<<0)
> #define XENPMU_MODE_HV (1<<1)
> +#define XENPMU_MODE_ALL (1<<2)
>
> /*
> * PMU features:
>
--
Company details: http://ts.fujitsu.com/imprint.html
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2015-03-25 12:25 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-17 14:53 [PATCH v19 00/14] x86/PMU: Xen PMU PV(H) support Boris Ostrovsky
2015-03-17 14:53 ` [PATCH v19 01/14] x86/VPMU: VPMU should not exist when vpmu_initialise() is called Boris Ostrovsky
2015-03-19 8:43 ` Dietmar Hahn
2015-03-17 14:53 ` [PATCH v19 02/14] common/symbols: Export hypervisor symbols to privileged guest Boris Ostrovsky
2015-03-17 14:54 ` [PATCH v19 03/14] x86/VPMU: Add public xenpmu.h Boris Ostrovsky
2015-03-17 14:54 ` [PATCH v19 04/14] x86/VPMU: Make vpmu not HVM-specific Boris Ostrovsky
2015-03-17 14:54 ` [PATCH v19 05/14] x86/VPMU: Interface for setting PMU mode and flags Boris Ostrovsky
2015-03-19 13:12 ` Dietmar Hahn
2015-03-19 13:28 ` Jan Beulich
2015-03-19 13:49 ` Dietmar Hahn
2015-03-24 13:56 ` Jan Beulich
2015-03-17 14:54 ` [PATCH v19 06/14] x86/VPMU: Initialize VPMUs with __initcall Boris Ostrovsky
2015-03-17 14:54 ` [PATCH v19 07/14] x86/VPMU: Initialize PMU for PV(H) guests Boris Ostrovsky
2015-03-24 14:08 ` Jan Beulich
2015-03-24 15:06 ` Boris Ostrovsky
2015-03-17 14:54 ` [PATCH v19 08/14] x86/VPMU: Save VPMU state for PV guests during context switch Boris Ostrovsky
2015-03-24 14:15 ` Jan Beulich
2015-03-17 14:54 ` [PATCH v19 09/14] x86/VPMU: When handling MSR accesses, leave fault injection to callers Boris Ostrovsky
2015-03-17 14:54 ` [PATCH v19 10/14] x86/VPMU: Add support for PMU register handling on PV guests Boris Ostrovsky
2015-03-17 14:54 ` [PATCH v19 11/14] x86/VPMU: Handle PMU interrupts for " Boris Ostrovsky
2015-03-24 14:28 ` Jan Beulich
2015-03-24 15:13 ` Boris Ostrovsky
2015-03-24 15:36 ` Jan Beulich
2015-03-24 15:47 ` Boris Ostrovsky
2015-03-24 16:03 ` Jan Beulich
2015-03-17 14:54 ` [PATCH v19 12/14] x86/VPMU: Merge vpmu_rdmsr and vpmu_wrmsr Boris Ostrovsky
2015-03-25 8:29 ` Dietmar Hahn
2015-03-25 12:23 ` Dietmar Hahn
2015-03-25 16:52 ` Jan Beulich
2015-03-17 14:54 ` [PATCH v19 13/14] x86/VPMU: Add privileged PMU mode Boris Ostrovsky
2015-03-25 12:25 ` Dietmar Hahn [this message]
2015-03-25 16:57 ` Jan Beulich
2015-03-17 14:54 ` [PATCH v19 14/14] x86/VPMU: Move VPMU files up from hvm/ directory Boris Ostrovsky
2015-03-19 14:32 ` [PATCH v19 00/14] x86/PMU: Xen PMU PV(H) support Dietmar Hahn
2015-03-19 16:03 ` Boris Ostrovsky
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=1815098.mR3uYJ4ZVe@amur \
--to=dietmar.hahn@ts.fujitsu.com \
--cc=Aravind.Gopalakrishnan@amd.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=boris.ostrovsky@oracle.com \
--cc=dgdegra@tycho.nsa.gov \
--cc=jun.nakajima@intel.com \
--cc=kevin.tian@intel.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=tim@xen.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.