From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: keir@xen.org, Ian.Campbell@citrix.com,
stefano.stabellini@eu.citrix.com, George.Dunlap@eu.citrix.com,
Ian.Jackson@eu.citrix.com, xen-devel@lists.xen.org,
JBeulich@suse.com, Chao Peng <chao.p.peng@linux.intel.com>,
dgdegra@tycho.nsa.gov
Subject: Re: [PATCH v16 01/10] x86: add generic resource (e.g. MSR) access hypercall
Date: Thu, 25 Sep 2014 16:12:18 -0400 [thread overview]
Message-ID: <20140925201218.GB24583@laptop.dumpdata.com> (raw)
In-Reply-To: <542473B2.5040504@citrix.com>
On Thu, Sep 25, 2014 at 08:57:38PM +0100, Andrew Cooper wrote:
> On 25/09/14 11:19, Chao Peng wrote:
> > Add a generic resource access hypercall for tool stack or other
> > components, e.g., accessing MSR, port I/O, etc.
> >
You should include a bit more information in the description.
Please give a bit information on what kind of parameters the
hypercall is to have.
> > 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 | 90 ++++++++++++++++++++++++++++++
> > xen/arch/x86/x86_64/platform_hypercall.c | 4 ++
> > xen/include/public/platform.h | 23 ++++++++
> > xen/include/xlat.lst | 2 +
> > 4 files changed, 119 insertions(+)
> >
> > diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
> > index 2162811..081d9f5 100644
> > --- a/xen/arch/x86/platform_hypercall.c
> > +++ b/xen/arch/x86/platform_hypercall.c
> > @@ -61,6 +61,68 @@ 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;
> > + uint32_t nr;
> > + XEN_GUEST_HANDLE(xenpf_resource_data_t) data;
> > +};
> > +
> > +static bool_t allow_access_msr(unsigned int msr)
> > +{
> > + return 0;
> > +}
> > +
> > +static void resource_access(void *info)
> > +{
> > + struct xen_resource_access *ra = info;
> > + xenpf_resource_data_t data;
> > + int ret = 0;
> > + unsigned int i;
> > +
> > + for ( i = 0; i < ra->nr; i++ )
> > + {
> > + if ( copy_from_guest_offset(&data, ra->data, i, 1) )
>
> You cannot use copy_{to,from}_guest() here. You are almost certainly on
> the wrong cpu, and running on the wrong set of pagetables.
>
> At best, you will copy bogus data from the wrong process/domain, and
> likely corrupt it when copying back.
>
> > + {
> > + ret = -EFAULT;
> > + break;
> > + }
> > +
> > + if ( data.rsvd ) {
That '{' needs to be on its own line.
> > + ret = -EINVAL;
> > + break;
> > + }
> > +
> > + switch ( data.cmd )
> > + {
> > + case XEN_RESOURCE_OP_MSR_READ:
> > + case XEN_RESOURCE_OP_MSR_WRITE:
> > + if ( data.idx >> 32 )
> > + ret = -EINVAL;
> > + else if ( !allow_access_msr(data.idx) )
> > + ret = -EACCES;
> > + else if ( data.cmd == XEN_RESOURCE_OP_MSR_READ )
> > + ret = rdmsr_safe(data.idx, data.val);
> > + else
> > + ret = wrmsr_safe(data.idx, data.val);
> > + break;
> > + default:
> > + ret = -EINVAL;
> > + break;
> > + }
> > +
> > + if ( ret )
> > + break;
> > +
> > + if ( copy_to_guest_offset(ra->data, i, &data, 1) )
> > + {
> > + ret = -EFAULT;
> > + 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 +663,34 @@ 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.nr = rsc_op->nr;
> > + ra.data = rsc_op->data;
>
> You must do all copy_{from,to}_user() here, and strictly only pass Xen
> pointers to resource_access().
>
> This means you will need to xmalloc() yourself some space for the
> xenpf_resource_data_t array.
>
>
> On a different note, you need to enforce a maximum resource_op.nr of
> something rather low to (16/32 perhaps?) to prevent a toolstack asking
> for 0xffffffff non-preemptible operations.
The toolstack has:
int xc_resource_op(xc_interface *xch, uint32_t nr_ops, xc_resource_op_t *ops)
{
if ( nr_ops == 1 )
return xc_resource_op_one(xch, ops);
And with that expectation we ought to have a similar check here, in the form
of:
if ( ra.nr != 1 )
return -EINVAL;
>
> ~Andrew
>
> > +
> > + if ( rsc_op->cpu == cpu )
> > + resource_access(&ra);
> > + else if ( cpu_online(rsc_op->cpu) )
> > + on_selected_cpus(cpumask_of(rsc_op->cpu),
> > + resource_access, &ra, 1);
> > + else
> > + {
> > + ret = -ENODEV;
> > + break;
> > + }
> > +
> > + if ( ra.ret )
> > + {
> > + ret = ra.ret;
> > + break;
> > + }
> > + }
> > + break;
> > +
> > default:
> > ret = -ENOSYS;
> > break;
> > diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c
> > index b6f380e..4db6622 100644
> > --- a/xen/arch/x86/x86_64/platform_hypercall.c
> > +++ b/xen/arch/x86/x86_64/platform_hypercall.c
> > @@ -32,6 +32,10 @@ CHECK_pf_pcpu_version;
> > CHECK_pf_enter_acpi_sleep;
> > #undef xen_pf_enter_acpi_sleep
> >
> > +#define xen_pf_resource_data xenpf_resource_data
> > +CHECK_pf_resource_data;
> > +#undef xen_pf_resource_data
> > +
> > #define COMPAT
> > #define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t)
> > #define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE_PARAM(t)
> > diff --git a/xen/include/public/platform.h b/xen/include/public/platform.h
> > index 053b9fa..e4d9091 100644
> > --- a/xen/include/public/platform.h
> > +++ b/xen/include/public/platform.h
> > @@ -527,6 +527,28 @@ 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
More details please.
> > +
> > +#define XEN_RESOURCE_OP_MSR_READ 0
> > +#define XEN_RESOURCE_OP_MSR_WRITE 1
> > +
> > +struct xenpf_resource_data {
> > + uint32_t cmd; /* XEN_RESOURCE_OP_* */
> > + uint32_t rsvd;
> > + uint64_t idx;
> > + uint64_t val;
More details please. Pls say what the 'rsvd' is for, what
the expected values are for 'idx', and 'val'.
Do also say which ones are IN or OUT.
Put yourself in the mindset of somebody who wants to use this
and does not want to dive in the hypervisor to figure this out.
Give as much information as possible in the headers.
> > +typedef struct xenpf_resource_data xenpf_resource_data_t;
> > +DEFINE_XEN_GUEST_HANDLE(xenpf_resource_data_t);
> > +
> > +struct xenpf_resource_op {
> > + uint32_t nr; /* number of data entry */
> > + uint32_t cpu; /* which cpu to run */
> > + XEN_GUEST_HANDLE(xenpf_resource_data_t) data;
> > +};
> > +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 +575,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;
resource_op? I would really call this 'msr' or 'msr_data'
> > uint8_t pad[128];
> > } u;
> > };
> > diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
> > index 9a35dd7..100fcf5 100644
> > --- a/xen/include/xlat.lst
> > +++ b/xen/include/xlat.lst
> > @@ -88,6 +88,8 @@
> > ? xenpf_enter_acpi_sleep platform.h
> > ? xenpf_pcpuinfo platform.h
> > ? xenpf_pcpu_version platform.h
> > +? xenpf_resource_op platform.h
> > +? xenpf_resource_data platform.h
> > ! sched_poll sched.h
> > ? sched_remote_shutdown sched.h
> > ? sched_shutdown sched.h
>
>
next prev parent reply other threads:[~2014-09-25 20:12 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-25 10:19 [PATCH v16 00/10] enable Cache Monitoring Technology (CMT) feature Chao Peng
2014-09-25 10:19 ` [PATCH v16 01/10] x86: add generic resource (e.g. MSR) access hypercall Chao Peng
2014-09-25 19:57 ` Andrew Cooper
2014-09-25 20:12 ` Konrad Rzeszutek Wilk [this message]
2014-09-25 20:17 ` Konrad Rzeszutek Wilk
2014-09-26 1:34 ` Chao Peng
2014-09-26 1:19 ` Chao Peng
2014-09-26 8:28 ` Jan Beulich
2014-09-26 8:58 ` Chao Peng
2014-09-26 15:40 ` Jan Beulich
2014-09-28 2:47 ` Chao Peng
2014-09-25 10:19 ` [PATCH v16 02/10] xsm: add resource operation related xsm policy Chao Peng
2014-09-25 10:19 ` [PATCH v16 03/10] tools: provide interface for generic resource access Chao Peng
2014-09-25 20:06 ` Konrad Rzeszutek Wilk
2014-09-25 10:19 ` [PATCH v16 04/10] x86: detect and initialize Cache Monitoring Technology feature Chao Peng
2014-09-25 20:33 ` Konrad Rzeszutek Wilk
2014-09-25 21:14 ` Andrew Cooper
2014-09-26 1:54 ` Chao Peng
2014-09-26 15:45 ` Jan Beulich
2014-09-25 10:19 ` [PATCH v16 05/10] x86: dynamically attach/detach CMT service for a guest Chao Peng
2014-09-25 20:41 ` Konrad Rzeszutek Wilk
2014-09-25 10:19 ` [PATCH v16 06/10] x86: collect global CMT information Chao Peng
2014-09-25 20:53 ` Konrad Rzeszutek Wilk
2014-09-26 9:21 ` Chao Peng
2014-09-26 13:23 ` Konrad Rzeszutek Wilk
2014-09-25 10:19 ` [PATCH v16 07/10] x86: enable CMT for each domain RMID Chao Peng
2014-09-25 21:23 ` Andrew Cooper
2014-09-25 10:19 ` [PATCH v16 08/10] x86: add CMT related MSRs in allowed list Chao Peng
2014-09-25 20:58 ` Konrad Rzeszutek Wilk
2014-09-26 8:38 ` Jan Beulich
2014-09-26 13:14 ` Konrad Rzeszutek Wilk
2014-09-25 10:19 ` [PATCH v16 09/10] xsm: add CMT related xsm policies Chao Peng
2014-09-25 10:19 ` [PATCH v16 10/10] tools: CMDs and APIs for Cache Monitoring Technology Chao Peng
2014-09-25 21:14 ` Konrad Rzeszutek Wilk
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=20140925201218.GB24583@laptop.dumpdata.com \
--to=konrad.wilk@oracle.com \
--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 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).