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

Re: [Xen-devel] [PATCH v13 for-xen-4.5 09/21] x86/VPMU: Add public xenpmu.h



>>> On 03.10.14 at 23:40, <boris.ostrovsky@xxxxxxxxxx> wrote:
> @@ -222,6 +215,7 @@ static int is_core2_vpmu_msr(u32 msr_index, int *type, 
> int *index)
>      }
>  }
>  
> +#define msraddr_to_bitpos(x) (((x)&0xffff) + ((x)>>31)*0x2000)

I understand this just gets moved here, but did it not occur to you
that this is bogus? It should really be

#define msraddr_to_bitpos(x) (((x)&0x1fff) + ((x)>>31)*0x2000)

and asserting that the zapped bits have the expected value would
certainly be beneficial too.

> @@ -367,12 +368,20 @@ static int core2_vpmu_alloc_resource(struct vcpu *v)
>          goto out_err;
>      vmx_write_guest_msr(MSR_CORE_PERF_GLOBAL_CTRL, 0);
>  
> -    core2_vpmu_cxt = xzalloc_bytes(sizeof(struct core2_vpmu_context) +
> -                    (arch_pmc_cnt-1)*sizeof(struct arch_msr_pair));
> -    if ( !core2_vpmu_cxt )
> +    core2_vpmu_cxt = xzalloc_bytes(sizeof(struct xen_pmu_intel_ctxt) +
> +                                   sizeof(uint64_t) * fixed_pmc_cnt +
> +                                   sizeof(struct xen_pmu_cntr_pair) *

I asked you before to use sizeof(<expression>) in favor of
sizeof(<type>) wherever possible. I.e. I can see why you do so
for the latter two, but for the first one I can't.

> @@ -418,7 +430,8 @@ static int core2_vpmu_do_wrmsr(unsigned int msr, uint64_t 
> msr_content,
>      int type = -1, index = -1;
>      struct vcpu *v = current;
>      struct vpmu_struct *vpmu = vcpu_vpmu(v);
> -    struct core2_vpmu_context *core2_vpmu_cxt = NULL;
> +    struct xen_pmu_intel_ctxt *core2_vpmu_cxt = NULL;

If you have to touch this line anyway, please at once drop the
pointless initializer (also elsewhere).

> --- a/xen/include/public/arch-x86/xen-x86_32.h
> +++ b/xen/include/public/arch-x86/xen-x86_32.h
> @@ -136,6 +136,16 @@ struct cpu_user_regs {
>  typedef struct cpu_user_regs cpu_user_regs_t;
>  DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
>  
> +struct xen_pmu_regs {
> +    uint32_t eip;
> +    uint32_t esp;
> +    uint32_t eflags;
> +    uint16_t cs;
> +    uint16_t ss;
> +};

I still don't see why this and ...

> --- a/xen/include/public/arch-x86/xen-x86_64.h
> +++ b/xen/include/public/arch-x86/xen-x86_64.h
> @@ -174,6 +174,16 @@ struct cpu_user_regs {
>  typedef struct cpu_user_regs cpu_user_regs_t;
>  DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
>  
> +struct xen_pmu_regs {
> +    __DECL_REG(ip);
> +    __DECL_REG(sp);
> +    __DECL_REG(flags);
> +    uint16_t cs;
> +    uint16_t ss;
> +};

aren't folded and aren't placed in the PMU-specific header.

Furthermore I'm sure you realized (the latest when adding back
the eflags field for VM86 mode recognition) that to the consumer of
this data things are still ambiguous: You can't tell protected from
real mode, yet HVM guests definitely use that mode.

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®.