From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: david.vrabel@citrix.com, kevin.tian@intel.com, jbeulich@suse.com,
dietmar.hahn@ts.fujitsu.com, stefano.stabellini@eu.citrix.com,
julien.grall@citrix.com, xen-devel@lists.xen.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6 2/6] xen/PMU: Sysfs interface for setting Xen PMU mode
Date: Mon, 10 Aug 2015 10:10:50 -0400 [thread overview]
Message-ID: <20150810141050.GF11826@l.oracle.com> (raw)
In-Reply-To: <1439170307-28370-3-git-send-email-boris.ostrovsky@oracle.com>
On Sun, Aug 09, 2015 at 09:31:43PM -0400, Boris Ostrovsky wrote:
> Set Xen's PMU mode via /sys/hypervisor/pmu/pmu_mode. Add XENPMU hypercall.
>
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
> Documentation/ABI/testing/sysfs-hypervisor-pmu | 23 +++++
> arch/x86/include/asm/xen/hypercall.h | 6 ++
> arch/x86/xen/Kconfig | 1 +
> drivers/xen/Kconfig | 3 +
> drivers/xen/sys-hypervisor.c | 136 ++++++++++++++++++++++++-
> include/xen/interface/xen.h | 1 +
> include/xen/interface/xenpmu.h | 59 +++++++++++
> 7 files changed, 228 insertions(+), 1 deletion(-)
> create mode 100644 Documentation/ABI/testing/sysfs-hypervisor-pmu
> create mode 100644 include/xen/interface/xenpmu.h
>
> diff --git a/Documentation/ABI/testing/sysfs-hypervisor-pmu b/Documentation/ABI/testing/sysfs-hypervisor-pmu
> new file mode 100644
> index 0000000..224faa1
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-hypervisor-pmu
> @@ -0,0 +1,23 @@
> +What: /sys/hypervisor/pmu/pmu_mode
> +Date: August 2015
> +KernelVersion: 4.3
> +Contact: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> +Description:
> + Describes mode that Xen's performance-monitoring unit (PMU)
> + uses. Accepted values are
> + "off" -- PMU is disabled
> + "self" -- The guest can profile itself
> + "hv" -- The guest can profile itself and, if it is
> + privileged (e.g. dom0), the hypervisor
> + "all" -- The guest can profile itself, the hypervisor
> + and all other guests. Only available to
> + privileged guests.
> +
> +What: /sys/hypervisor/pmu/pmu_features
> +Date: August 2015
> +KernelVersion: 4.3
> +Contact: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> +Description:
> + Describes Xen PMU features (as an integer). A set bit indicates
> + that the corresponding feature is enabled. See
> + include/xen/interface/xenpmu.h for available features
> diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h
> index ca08a27..83aea80 100644
> --- a/arch/x86/include/asm/xen/hypercall.h
> +++ b/arch/x86/include/asm/xen/hypercall.h
> @@ -465,6 +465,12 @@ HYPERVISOR_tmem_op(
> return _hypercall1(int, tmem_op, op);
> }
>
> +static inline int
> +HYPERVISOR_xenpmu_op(unsigned int op, void *arg)
> +{
> + return _hypercall2(int, xenpmu_op, op, arg);
> +}
> +
> static inline void
> MULTI_fpu_taskswitch(struct multicall_entry *mcl, int set)
> {
> diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig
> index e88fda8..049cdda 100644
> --- a/arch/x86/xen/Kconfig
> +++ b/arch/x86/xen/Kconfig
> @@ -7,6 +7,7 @@ config XEN
> depends on PARAVIRT
> select PARAVIRT_CLOCK
> select XEN_HAVE_PVMMU
> + select XEN_HAVE_VPMU
> depends on X86_64 || (X86_32 && X86_PAE)
> depends on X86_TSC
> help
> diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig
> index 9367604..73708ac 100644
> --- a/drivers/xen/Kconfig
> +++ b/drivers/xen/Kconfig
> @@ -288,4 +288,7 @@ config XEN_SYMS
> Exports hypervisor symbols (along with their types and addresses) via
> /proc/xen/xensyms file, similar to /proc/kallsyms
>
> +config XEN_HAVE_VPMU
> + bool
> +
> endmenu
> diff --git a/drivers/xen/sys-hypervisor.c b/drivers/xen/sys-hypervisor.c
> index 96453f8..0907275 100644
> --- a/drivers/xen/sys-hypervisor.c
> +++ b/drivers/xen/sys-hypervisor.c
> @@ -20,6 +20,9 @@
> #include <xen/xenbus.h>
> #include <xen/interface/xen.h>
> #include <xen/interface/version.h>
> +#ifdef CONFIG_XEN_HAVE_VPMU
> +#include <xen/interface/xenpmu.h>
> +#endif
>
> #define HYPERVISOR_ATTR_RO(_name) \
> static struct hyp_sysfs_attr _name##_attr = __ATTR_RO(_name)
> @@ -368,6 +371,126 @@ static void xen_properties_destroy(void)
> sysfs_remove_group(hypervisor_kobj, &xen_properties_group);
> }
>
> +#ifdef CONFIG_XEN_HAVE_VPMU
> +struct pmu_mode {
> + const char *name;
> + uint32_t mode;
> +};
> +
> +struct pmu_mode pmu_modes[] = {
> + {"off", XENPMU_MODE_OFF},
> + {"self", XENPMU_MODE_SELF},
> + {"hv", XENPMU_MODE_HV},
> + {"all", XENPMU_MODE_ALL}
> +};
> +
> +static ssize_t pmu_mode_store(struct hyp_sysfs_attr *attr,
> + const char *buffer, size_t len)
> +{
> + int ret;
> + struct xen_pmu_params xp;
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(pmu_modes); i++) {
> + if (strncmp(buffer, pmu_modes[i].name, len - 1) == 0) {
> + xp.val = pmu_modes[i].mode;
> + break;
> + }
> + }
> +
> + if (i == ARRAY_SIZE(pmu_modes))
> + return -EINVAL;
> +
> + xp.version.maj = XENPMU_VER_MAJ;
> + xp.version.min = XENPMU_VER_MIN;
> + ret = HYPERVISOR_xenpmu_op(XENPMU_mode_set, &xp);
> + if (ret)
> + return ret;
> +
> + return len;
> +}
> +
> +static ssize_t pmu_mode_show(struct hyp_sysfs_attr *attr, char *buffer)
> +{
> + int ret;
> + struct xen_pmu_params xp;
> + int i;
> + uint32_t mode;
> +
> + xp.version.maj = XENPMU_VER_MAJ;
> + xp.version.min = XENPMU_VER_MIN;
> + ret = HYPERVISOR_xenpmu_op(XENPMU_mode_get, &xp);
> + if (ret)
> + return ret;
> +
> + mode = (uint32_t)xp.val;
> + for (i = 0; i < ARRAY_SIZE(pmu_modes); i++) {
> + if (mode == pmu_modes[i].mode)
> + return sprintf(buffer, "%s\n", pmu_modes[i].name);
> + }
> +
> + return -EINVAL;
> +}
> +HYPERVISOR_ATTR_RW(pmu_mode);
> +
> +static ssize_t pmu_features_store(struct hyp_sysfs_attr *attr,
> + const char *buffer, size_t len)
> +{
> + int ret;
> + uint32_t features;
> + struct xen_pmu_params xp;
> +
> + ret = kstrtou32(buffer, 0, &features);
> + if (ret)
> + return ret;
> +
> + xp.val = features;
> + xp.version.maj = XENPMU_VER_MAJ;
> + xp.version.min = XENPMU_VER_MIN;
> + ret = HYPERVISOR_xenpmu_op(XENPMU_feature_set, &xp);
> + if (ret)
> + return ret;
> +
> + return len;
> +}
> +
> +static ssize_t pmu_features_show(struct hyp_sysfs_attr *attr, char *buffer)
> +{
> + int ret;
> + struct xen_pmu_params xp;
> +
> + xp.version.maj = XENPMU_VER_MAJ;
> + xp.version.min = XENPMU_VER_MIN;
> + ret = HYPERVISOR_xenpmu_op(XENPMU_feature_get, &xp);
> + if (ret)
> + return ret;
> +
> + return sprintf(buffer, "0x%x\n", (uint32_t)xp.val);
> +}
> +HYPERVISOR_ATTR_RW(pmu_features);
> +
> +static struct attribute *xen_pmu_attrs[] = {
> + &pmu_mode_attr.attr,
> + &pmu_features_attr.attr,
> + NULL
> +};
> +
> +static const struct attribute_group xen_pmu_group = {
> + .name = "pmu",
> + .attrs = xen_pmu_attrs,
> +};
> +
> +static int __init xen_pmu_init(void)
> +{
> + return sysfs_create_group(hypervisor_kobj, &xen_pmu_group);
> +}
> +
> +static void xen_pmu_destroy(void)
> +{
> + sysfs_remove_group(hypervisor_kobj, &xen_pmu_group);
> +}
> +#endif
> +
> static int __init hyper_sysfs_init(void)
> {
> int ret;
> @@ -390,7 +513,15 @@ static int __init hyper_sysfs_init(void)
> ret = xen_properties_init();
> if (ret)
> goto prop_out;
> -
> +#ifdef CONFIG_XEN_HAVE_VPMU
> + if (xen_initial_domain()) {
> + ret = xen_pmu_init();
> + if (ret) {
> + xen_properties_destroy();
> + goto prop_out;
> + }
> + }
> +#endif
> goto out;
>
> prop_out:
> @@ -407,6 +538,9 @@ out:
>
> static void __exit hyper_sysfs_exit(void)
> {
> +#ifdef CONFIG_XEN_HAVE_VPMU
> + xen_pmu_destroy();
> +#endif
> xen_properties_destroy();
> xen_compilation_destroy();
> xen_sysfs_uuid_destroy();
> diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h
> index a483789..c6399a1 100644
> --- a/include/xen/interface/xen.h
> +++ b/include/xen/interface/xen.h
> @@ -80,6 +80,7 @@
> #define __HYPERVISOR_kexec_op 37
> #define __HYPERVISOR_tmem_op 38
> #define __HYPERVISOR_xc_reserved_op 39 /* reserved for XenClient */
> +#define __HYPERVISOR_xenpmu_op 40
>
> /* Architecture-specific hypercall definitions. */
> #define __HYPERVISOR_arch_0 48
> diff --git a/include/xen/interface/xenpmu.h b/include/xen/interface/xenpmu.h
> new file mode 100644
> index 0000000..eac1b49
> --- /dev/null
> +++ b/include/xen/interface/xenpmu.h
> @@ -0,0 +1,59 @@
> +#ifndef __XEN_PUBLIC_XENPMU_H__
> +#define __XEN_PUBLIC_XENPMU_H__
> +
> +#include "xen.h"
> +
> +#define XENPMU_VER_MAJ 0
> +#define XENPMU_VER_MIN 1
> +
> +/*
> + * ` enum neg_errnoval
> + * ` HYPERVISOR_xenpmu_op(enum xenpmu_op cmd, struct xenpmu_params *args);
> + *
> + * @cmd == XENPMU_* (PMU operation)
> + * @args == struct xenpmu_params
> + */
> +/* ` enum xenpmu_op { */
> +#define XENPMU_mode_get 0 /* Also used for getting PMU version */
> +#define XENPMU_mode_set 1
> +#define XENPMU_feature_get 2
> +#define XENPMU_feature_set 3
> +#define XENPMU_init 4
> +#define XENPMU_finish 5
> +
> +/* ` } */
> +
> +/* Parameters structure for HYPERVISOR_xenpmu_op call */
> +struct xen_pmu_params {
> + /* IN/OUT parameters */
> + struct {
> + uint32_t maj;
> + uint32_t min;
> + } version;
> + uint64_t val;
> +
> + /* IN parameters */
> + uint32_t vcpu;
> + uint32_t pad;
> +};
> +
> +/* PMU modes:
> + * - XENPMU_MODE_OFF: No PMU virtualization
> + * - 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:
> + * - XENPMU_FEATURE_INTEL_BTS: Intel BTS support (ignored on AMD)
> + */
> +#define XENPMU_FEATURE_INTEL_BTS 1
> +
> +#endif /* __XEN_PUBLIC_XENPMU_H__ */
> --
> 1.8.1.4
>
next prev parent reply other threads:[~2015-08-10 14:11 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-10 1:31 [PATCH v6 0/6] xen/PMU: PMU support for Xen PV(H) guests Boris Ostrovsky
2015-08-10 1:31 ` [PATCH v6 1/6] xen: xensyms support Boris Ostrovsky
2015-08-10 1:31 ` Boris Ostrovsky
2015-08-10 1:31 ` [PATCH v6 2/6] xen/PMU: Sysfs interface for setting Xen PMU mode Boris Ostrovsky
2015-08-10 14:10 ` Konrad Rzeszutek Wilk [this message]
2015-08-10 14:10 ` Konrad Rzeszutek Wilk
2015-08-10 1:31 ` Boris Ostrovsky
2015-08-10 1:31 ` [PATCH v6 3/6] xen/PMU: Initialization code for Xen PMU Boris Ostrovsky
2015-08-10 1:31 ` Boris Ostrovsky
2015-08-10 1:31 ` [PATCH v6 4/6] xen/PMU: Describe vendor-specific PMU registers Boris Ostrovsky
2015-08-10 1:31 ` Boris Ostrovsky
2015-08-10 1:31 ` [PATCH v6 5/6] xen/PMU: Intercept PMU-related MSR and APIC accesses Boris Ostrovsky
2015-08-10 1:31 ` Boris Ostrovsky
2015-08-10 1:31 ` [PATCH v6 6/6] xen/PMU: PMU emulation code Boris Ostrovsky
2015-08-10 1:31 ` Boris Ostrovsky
2015-08-10 10:01 ` [PATCH v6 0/6] xen/PMU: PMU support for Xen PV(H) guests Stefano Stabellini
2015-08-10 10:01 ` Stefano Stabellini
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=20150810141050.GF11826@l.oracle.com \
--to=konrad.wilk@oracle.com \
--cc=boris.ostrovsky@oracle.com \
--cc=david.vrabel@citrix.com \
--cc=dietmar.hahn@ts.fujitsu.com \
--cc=jbeulich@suse.com \
--cc=julien.grall@citrix.com \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stefano.stabellini@eu.citrix.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 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.