From: Konrad Rzeszutek Wilk <konrad@darnok.org>
To: Chao Peng <chao.p.peng@linux.intel.com>
Cc: keir@xen.org, Ian.Campbell@citrix.com,
stefano.stabellini@eu.citrix.com, George.Dunlap@eu.citrix.com,
Andrew Cooper <andrew.cooper3@citrix.com>,
Ian.Jackson@eu.citrix.com, xen-devel@lists.xen.org,
JBeulich@suse.com, dgdegra@tycho.nsa.gov
Subject: Re: [PATCH v15 02/11] x86: add generic resource (e.g. MSR) access hypercall
Date: Mon, 29 Sep 2014 14:52:47 -0400 [thread overview]
Message-ID: <20140929185247.GA6952@andromeda.dapyr.net> (raw)
In-Reply-To: <20140910025512.GH15872@pengc-linux>
On Wed, Sep 10, 2014 at 10:55:12AM +0800, Chao Peng wrote:
> On Fri, Sep 05, 2014 at 11:59:11AM +0100, Andrew Cooper wrote:
> > On 05/09/14 09:37, Chao Peng wrote:
> > > Add a generic resource access hypercall for tool stack or other
> > > components, e.g., accessing MSR, port I/O, etc.
> > >
> > > Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
> > > Signed-off-by: Chao Peng <chao.p.peng@linux.intel.com>
> > > ---
> > > xen/arch/x86/platform_hypercall.c | 63 +++++++++++++++++++++++++++++++++++++
> > > xen/include/public/platform.h | 15 +++++++++
> > > xen/include/xlat.lst | 1 +
> > > 3 files changed, 79 insertions(+)
> > >
> > > diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
> > > index 2162811..e5ad4c9 100644
> > > --- a/xen/arch/x86/platform_hypercall.c
> > > +++ b/xen/arch/x86/platform_hypercall.c
> > > @@ -61,6 +61,42 @@ long cpu_down_helper(void *data);
> > > long core_parking_helper(void *data);
> > > uint32_t get_cur_idle_nums(void);
> > >
> > > +struct xen_resource_access {
> > > + int32_t ret;
> > > + struct xenpf_resource_op *data;
> > > +};
> > > +
> > > +static bool_t allow_access_msr(unsigned int msr)
> > > +{
> > > + return 0;
> > > +}
> > > +
> > > +static void resource_access_one(void *info)
> > > +{
> > > + struct xen_resource_access *ra = info;
> > > + int ret = 0;
> > > +
> > > + switch ( ra->data->cmd )
> > > + {
> > > + case XEN_RESOURCE_OP_MSR_READ:
> > > + case XEN_RESOURCE_OP_MSR_WRITE:
> > > + if ( ra->data->idx >> 32 )
> > > + ret = -EINVAL;
> > > + else if ( !allow_access_msr(ra->data->idx) )
> > > + ret = -EACCES;
> > > + else if ( ra->data->cmd == XEN_RESOURCE_OP_MSR_READ )
> > > + ret = rdmsr_safe(ra->data->idx, ra->data->val);
> > > + else
> > > + ret = wrmsr_safe(ra->data->idx, ra->data->val);
> > > + break;
> > > + default:
> > > + ret = -EINVAL;
> > > + break;
> > > + }
> > > +
> > > + ra->ret = ret;
> > > +}
> > > +
> > > ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
> > > {
> > > ret_t ret = 0;
> > > @@ -601,6 +637,33 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
> > > }
> > > break;
> > >
> > > + case XENPF_resource_op:
> > > + {
> > > + struct xen_resource_access ra;
> > > + struct xenpf_resource_op *rsc_op = &op->u.resource_op;
> > > + unsigned int cpu = smp_processor_id();
> > > +
> > > + ra.data = rsc_op;
> > > +
> > > + if ( rsc_op->cpu == cpu )
> > > + resource_access_one(&ra);
> > > + else if ( cpu_online(rsc_op->cpu) )
> > > + on_selected_cpus(cpumask_of(rsc_op->cpu),
> >
> > You must validate rsc_op->cpu before using it. cpumask_of(something
> > large) will happily wander off the end of an array.
> cpu_online() should detect this.
Why would it? It just looks an array and checks to see if the bit is
set. (If you look at the ASSERT in 'cpumask_check' - the assert is not
part of non-debug build).
> >
> > > + resource_access_one, &ra, 1);
> > > + else
> > > + {
> > > + ret = -ENODEV;
> > > + break;
> > > + }
> > > +
> > > + if ( ra.ret )
> > > + {
> > > + ret = ra.ret;
> > > + break;
> > > + }
> > > + }
> > > + break;
> > > +
> > > default:
> > > ret = -ENOSYS;
> > > break;
> > > diff --git a/xen/include/public/platform.h b/xen/include/public/platform.h
> > > index 053b9fa..3ed50de 100644
> > > --- a/xen/include/public/platform.h
> > > +++ b/xen/include/public/platform.h
> > > @@ -527,6 +527,20 @@ struct xenpf_core_parking {
> > > typedef struct xenpf_core_parking xenpf_core_parking_t;
> > > DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t);
> > >
> > > +#define XENPF_resource_op 61
> > > +
> > > +#define XEN_RESOURCE_OP_MSR_READ 0
> > > +#define XEN_RESOURCE_OP_MSR_WRITE 1
> > > +
> > > +struct xenpf_resource_op {
> > > + uint16_t cmd; /* XEN_RESOURCE_OP_* */
> >
> > There is an alignment issue here between 32 and 64bit. Putting an an
> > explicit unit16_t _resd; field should fix it.
> >
> > ~Andrew
> OK, thanks.
You can also use 'pahole' on the Xen binary to figure these issues out.
> >
> > > + uint32_t cpu;
> > > + uint64_t idx;
> > > + uint64_t val;
> > > +};
> > > +typedef struct xenpf_resource_op xenpf_resource_op_t;
> > > +DEFINE_XEN_GUEST_HANDLE(xenpf_resource_op_t);
> > > +
> > > /*
> > > * ` enum neg_errnoval
> > > * ` HYPERVISOR_platform_op(const struct xen_platform_op*);
> > > @@ -553,6 +567,7 @@ struct xen_platform_op {
> > > struct xenpf_cpu_hotadd cpu_add;
> > > struct xenpf_mem_hotadd mem_add;
> > > struct xenpf_core_parking core_parking;
> > > + struct xenpf_resource_op resource_op;
> > > uint8_t pad[128];
> > > } u;
> > > };
> > > diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
> > > index 9a35dd7..06ed7b9 100644
> > > --- a/xen/include/xlat.lst
> > > +++ b/xen/include/xlat.lst
> > > @@ -88,6 +88,7 @@
> > > ? xenpf_enter_acpi_sleep platform.h
> > > ? xenpf_pcpuinfo platform.h
> > > ? xenpf_pcpu_version platform.h
> > > +? xenpf_resource_op platform.h
> > > ! sched_poll sched.h
> > > ? sched_remote_shutdown sched.h
> > > ? sched_shutdown sched.h
> >
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xen.org
> > http://lists.xen.org/xen-devel
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2014-09-29 18:52 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-05 8:37 [PATCH v15 00/11] enable Cache QoS Monitoring (CQM) feature Chao Peng
2014-09-05 8:37 ` [PATCH v15 01/11] multicall: add no preemption ability between two calls Chao Peng
2014-09-05 10:46 ` Andrew Cooper
2014-09-09 6:43 ` Chao Peng
2014-09-09 10:39 ` Jan Beulich
2014-09-09 10:51 ` Andrew Cooper
2014-09-09 11:51 ` Jan Beulich
2014-09-09 12:44 ` Andrew Cooper
2014-09-09 13:15 ` Jan Beulich
2014-09-10 1:32 ` Chao Peng
2014-09-10 9:43 ` Andrew Cooper
2014-09-10 10:07 ` Jan Beulich
2014-09-10 10:15 ` Andrew Cooper
2014-09-10 10:25 ` Jan Beulich
2014-09-10 11:12 ` Andrew Cooper
2014-09-12 2:55 ` Chao Peng
2014-09-17 9:22 ` Chao Peng
2014-09-17 9:44 ` Jan Beulich
2014-09-18 13:45 ` Chao Peng
2014-09-18 14:22 ` Jan Beulich
2014-09-05 8:37 ` [PATCH v15 02/11] x86: add generic resource (e.g. MSR) access hypercall Chao Peng
2014-09-05 10:59 ` Andrew Cooper
2014-09-05 11:49 ` Jan Beulich
2014-09-10 2:55 ` Chao Peng
2014-09-29 18:52 ` Konrad Rzeszutek Wilk [this message]
2014-09-30 7:45 ` Jan Beulich
2014-09-05 8:37 ` [PATCH v15 03/11] xsm: add resource operation related xsm policy Chao Peng
2014-09-05 8:37 ` [PATCH v15 04/11] tools: provide interface for generic resource access Chao Peng
2014-09-05 8:37 ` [PATCH v15 05/11] x86: detect and initialize Platform QoS Monitoring feature Chao Peng
2014-09-05 11:05 ` Andrew Cooper
2014-09-05 8:37 ` [PATCH v15 06/11] x86: dynamically attach/detach QoS monitoring service for a guest Chao Peng
2014-09-05 8:37 ` [PATCH v15 07/11] x86: collect global QoS monitoring information Chao Peng
2014-09-05 8:37 ` [PATCH v15 08/11] x86: enable QoS monitoring for each domain RMID Chao Peng
2014-09-05 8:37 ` [PATCH v15 09/11] x86: add QoS monitoring related MSRs in allowed list Chao Peng
2014-09-05 8:37 ` [PATCH v15 10/11] xsm: add platform QoS related xsm policies Chao Peng
2014-09-05 8:37 ` [PATCH v15 11/11] tools: CMDs and APIs for Platform QoS Monitoring Chao Peng
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=20140929185247.GA6952@andromeda.dapyr.net \
--to=konrad@darnok.org \
--cc=George.Dunlap@eu.citrix.com \
--cc=Ian.Campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=chao.p.peng@linux.intel.com \
--cc=dgdegra@tycho.nsa.gov \
--cc=keir@xen.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.