[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v11 1/9] x86: add generic MSR access hypercall



> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
> Sent: Monday, June 23, 2014 2:45 PM
> To: Xu, Dongxiao
> Cc: andrew.cooper3@xxxxxxxxxx; Ian.Campbell@xxxxxxxxxx;
> George.Dunlap@xxxxxxxxxxxxx; Ian.Jackson@xxxxxxxxxxxxx;
> stefano.stabellini@xxxxxxxxxxxxx; xen-devel@xxxxxxxxxxxxx;
> konrad.wilk@xxxxxxxxxx; dgdegra@xxxxxxxxxxxxx; keir@xxxxxxx
> Subject: RE: [PATCH v11 1/9] x86: add generic MSR access hypercall
> 
> >>> On 23.06.14 at 08:27, <dongxiao.xu@xxxxxxxxx> wrote:
> >>  -----Original Message-----
> >> From: Jan Beulich [mailto:JBeulich@xxxxxxxx]
> >> Sent: Friday, June 20, 2014 11:01 PM
> >> To: Xu, Dongxiao
> >> Cc: andrew.cooper3@xxxxxxxxxx; Ian.Campbell@xxxxxxxxxx;
> >> George.Dunlap@xxxxxxxxxxxxx; Ian.Jackson@xxxxxxxxxxxxx;
> >> stefano.stabellini@xxxxxxxxxxxxx; xen-devel@xxxxxxxxxxxxx;
> >> konrad.wilk@xxxxxxxxxx; dgdegra@xxxxxxxxxxxxx; keir@xxxxxxx
> >> Subject: Re: [PATCH v11 1/9] x86: add generic MSR access hypercall
> >>
> >> >>> On 20.06.14 at 16:31, <dongxiao.xu@xxxxxxxxx> wrote:
> >> > Add a generic MSR access hypercall for tool stack or other components to
> >> > read or write certain system MSRs.
> >>
> >> If you want this to be usable by components other than the tool stack
> >> then this can't be a sysctl (would e.g. need to be a platform-op then).
> >
> > Per my understanding, the platform-op related hypercalls are used by Dom0
> > kernel.
> > While in this CQM scenario, we want libvirt/libxl/libxc to call such
> > hypercall to access the MSR, however I didn't see any usage of platform_op 
> > in
> > libxl/libxc side.
> >
> > Could you explain a bit more for it?
> 
> Platform ops are for use by Dom0, yes, but note the explicit omission
> of "kernel" in my reply. The fact that libxc currently doesn't use any
> doesn't mean it mustn't do so. The only question here that matter is
> what audience we see for the new functionality: If this is to be a
> purely tools interface, then a sysctl is fine. If the kernel is intended to
> also be able to use it (as I suggested), something other than a sysctl
> needs to be used (and I was merely _hinting_ at platform-op).

I got such concept in the file descriptor, and that's why I was thinking of 
platform-op is for dom0-kernel only...
Looking through all the current hypercalls, sysctl and platform-op are the most 
appropriate ones.

According to your word, if that's is not the limitation for Dom0 kernel only, I 
am okay to change it to platform-op wise.
BTW, do we need to modify the file header for platform_hypercall.c/h?

/******************************************************************************
 * platform_hypercall.c
 *
 * Hardware platform operations. Intended for use by domain-0 kernel.
 *
 * Copyright (c) 2002-2006, K Fraser
 */

> 
> >> > --- a/xen/arch/x86/sysctl.c
> >> > +++ b/xen/arch/x86/sysctl.c
> >> > @@ -66,10 +66,27 @@ void arch_do_physinfo(xen_sysctl_physinfo_t *pi)
> >> >          pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm_directio;
> >> >  }
> >> >
> >> > +static void msr_access_helper(void *data)
> >> > +{
> >> > +    struct msr_access_info *info = data;
> >> > +    xen_sysctl_msr_data_t *msr_data;
> >> > +    unsigned int i;
> >> > +
> >> > +    for ( i = 0; i < info->nr_ops; i++ )
> >> > +    {
> >> > +        msr_data = &info->msr_data[i];
> >> > +        if ( msr_data->cmd == XEN_SYSCTL_MSR_read )
> >> > +            rdmsrl(msr_data->msr, msr_data->val);
> >> > +        else if ( msr_data->cmd == XEN_SYSCTL_MSR_write )
> >> > +            wrmsrl(msr_data->msr, msr_data->val);
> >> > +    }
> >>
> >> Missing preemption check.
> >
> > Do you mean hypercall_preemption_check() here? Or the preemption
> between the
> > MSR accesses?
> 
> Not sure what distinction you make between the two (or what the
> second question is supposed to refer to). The list of operations can
> be arbitrarily long, and individual operations may also take arbitrary
> time (especially if this later gets extended to I/O port accesses,
> which may incur SMM invocation). Hence preemption checks between
> operations are needed (except in well-defined cases where the
> caller may request such check to be skipped).

Okay.

> 
> >> Anyway, together with the comments on the interface itself (further
> >> down) I think you'd be much better off basing this on
> >> continue_hypercall_on_cpu().
> >
> > continue_hypercall_on_cpu() function schedules a tasklet to run the specific
> > function on certain CPU.
> > However in our CQM case, the libxl/libxc functions want to get the result
> > immediately when the function returns, so that's why I didn't use
> > continue_hypercall_on_cpu().
> 
> The use of a tasklet doesn't mean the result would only be available in
> a deferred manner: The tasklet runs _before_ control transfers back
> to the caller.

Okay.

> 
> >> > --- a/xen/include/public/sysctl.h
> >> > +++ b/xen/include/public/sysctl.h
> >> > @@ -636,6 +636,29 @@ struct xen_sysctl_coverage_op {
> >> >  typedef struct xen_sysctl_coverage_op xen_sysctl_coverage_op_t;
> >> >  DEFINE_XEN_GUEST_HANDLE(xen_sysctl_coverage_op_t);
> >> >
> >> > +#define XEN_SYSCTL_MSR_read                0
> >> > +#define XEN_SYSCTL_MSR_write               1
> >> > +
> >> > +struct xen_sysctl_msr_data {
> >> > +    uint32_t cmd;       /* XEN_SYSCTL_MSR_* */
> >> > +    uint32_t msr;
> >> > +    uint64_t val;
> >> > +};
> >> > +typedef struct xen_sysctl_msr_data xen_sysctl_msr_data_t;
> >> > +DEFINE_XEN_GUEST_HANDLE(xen_sysctl_msr_data_t);
> >> > +struct xen_sysctl_msr_op {
> >> > +    uint32_t nr_ops;
> >>
> >> Jusr "nr" would suffice.
> >
> > Okay.
> >
> >>
> >> > +    uint32_t cpu;
> >>
> >> This is rather limiting - you should be able to specify a CPU for
> >> each operation. That way you'll have another 32-bit field available
> >> for flags: You indicated earlier on that you'd want certain
> >> operations (like a write followed by a read) pairable without
> >> potentially getting preempted in between. The field then freed up
> >> here should then be reserved for use as flags field too (i.e. you'd
> >> need to check that it's zero).
> >
> > Do you mean the following case?
> >
> > Op1: CPU0, write MSR 0x100. Flag: 1 (indicating paring)
> > Op2: CPU1, read MSR 0x200. Flag: 0.
> > Op3: CPU0, read MSR 0x101. Flag: 1 (paring the above op1)
> 
> No - CPU changes alway imply preemption between individual
> sub-ops.

Okay. Let's change the example a bit.

Op1: CPU0, write MSR 0x100.
Op2: CPU0, read MSR 0x101.
Op3: CPU1, read MSR 0x200.

Can we just follow the above example, if the two operations are "continuous" 
towards a target CPU, then we will pack them together via a single IPI?
Or do we really need the flag to indicate no-preemption there?

Thanks,
Dongxiao

> 
> > To avoid the preempt between certain operations, my previous solution is to
> > pack all the operations towards a certain CPU via a single IPI. When the
> > target CPU receives the IPI, it will execute the operations one by one
> > (suppose during the execution for loop, no preemption will happen).
> > Now if we specify a CPU for each operation, can we pack the operations
> > according to the target CPU, and finally issue one IPI per-target-CPU to 
> > avoid
> > preemption? That will get rid of such flag usage.
> 
> No, I don't think re-ordering operations can be permitted here.
> 
> Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.