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

Re: [Xen-devel] [PATCH 19/19] tools/xen-mceinj: support injecting LMCE



On Fri, Feb 17, 2017 at 02:39:36PM +0800, Haozhong Zhang wrote:
> If option '-l' or '--lmce' is specified and the host supports LMCE,
> xen-mceinj will inject LMCE to CPU specified by '-c' (or CPU0 if '-c'
> is not present).
> 
> Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
> ---
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
>  tools/libxc/include/xenctrl.h           |  1 +
>  tools/libxc/xc_misc.c                   | 25 +++++++++++++++

I suggest you split out changes to libxc to a separate patch.

>  tools/tests/mce-test/tools/xen-mceinj.c | 57 
> +++++++++++++++++++++++++++++++--
>  3 files changed, 81 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
> index 85d7fe5..2598952 100644
> --- a/tools/libxc/include/xenctrl.h
> +++ b/tools/libxc/include/xenctrl.h
> @@ -1968,6 +1968,7 @@ int xc_cpuid_apply_policy(xc_interface *xch,
>  void xc_cpuid_to_str(const unsigned int *regs,
>                       char **strs); /* some strs[] may be NULL if ENOMEM */
>  int xc_mca_op(xc_interface *xch, struct xen_mc *mc);
> +int xc_mca_op_cpumap(xc_interface *xch, struct xen_mc *mc, xc_cpumap_t 
> cpumap);
>  #endif
>  
>  struct xc_px_val {
> diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
> index 0fc6c22..24f7fdf 100644
> --- a/tools/libxc/xc_misc.c
> +++ b/tools/libxc/xc_misc.c
> @@ -341,6 +341,31 @@ int xc_mca_op(xc_interface *xch, struct xen_mc *mc)
>      xc_hypercall_bounce_post(xch, mc);
>      return ret;
>  }
> +
> +int xc_mca_op_cpumap(xc_interface *xch, struct xen_mc *mc, xc_cpumap_t 
> cpumap)
> +{
> +    int ret;
> +    DECLARE_HYPERCALL_BOUNCE(cpumap, 0, XC_HYPERCALL_BUFFER_BOUNCE_IN);
> +
> +    if ( cpumap )
> +    {
> +        HYPERCALL_BOUNCE_SET_SIZE(cpumap,
> +                                  (mc->u.mc_inject_v2.cpumap.nr_bits + 7) / 
> 8);
> +        if ( xc_hypercall_bounce_pre(xch, cpumap) )
> +        {
> +            PERROR("Could not bouce cpumap memory buffer");
> +            return -1;
> +        }
> +        set_xen_guest_handle(mc->u.mc_inject_v2.cpumap.bitmap, cpumap);
> +    }
> +
> +    ret = xc_mca_op(xch, mc);
> +
> +    if ( cpumap )
> +        xc_hypercall_bounce_post(xch, cpumap);
> +
> +    return ret;
> +}

I kinda see why you did this: the bounce buffer infrastructure isn't
available to userspace program (by design). But this API isn't nice. 

This function replaces part of the struct. I suggest you construct a
xen_mc struct solely within this function, not doing part of it here and
the other part in another place (inject_lmce below).  Then you also need
to name it properly.

>  #endif
>  
>  int xc_perfc_reset(xc_interface *xch)
> diff --git a/tools/tests/mce-test/tools/xen-mceinj.c 
> b/tools/tests/mce-test/tools/xen-mceinj.c
> index 5f70a61..b2eb7d3 100644
> --- a/tools/tests/mce-test/tools/xen-mceinj.c
> +++ b/tools/tests/mce-test/tools/xen-mceinj.c
> @@ -56,6 +56,8 @@
>  #define MSR_IA32_MC0_MISC        0x00000403
>  #define MSR_IA32_MC0_CTL2        0x00000280
>  
> +#define MCG_STATUS_LMCE          0x8
> +
>  struct mce_info {
>      const char *description;
>      uint8_t mcg_stat;
> @@ -113,6 +115,7 @@ static struct mce_info mce_table[] = {
>  #define LOGFILE stdout
>  
>  int dump;
> +int lmce;
>  struct xen_mc_msrinject msr_inj;
>  
>  static void Lprintf(const char *fmt, ...)
> @@ -213,6 +216,42 @@ static int inject_mce(xc_interface *xc_handle, int 
> cpu_nr)
>      return xc_mca_op(xc_handle, &mc);
>  }
>  
> +static int inject_lmce(xc_interface *xc_handle, uint32_t cpu_nr)
> +{
> +    struct xen_mc mc;
> +    uint8_t *cpumap = NULL;
> +    size_t cpumap_size, line, shift;
> +    uint32_t nr_cpus;
> +    int ret;
> +
> +    nr_cpus = mca_cpuinfo(xc_handle);
> +    if ( !nr_cpus )
> +        err(xc_handle, "Failed to get mca_cpuinfo");

Why xc_handle in err()?

Wei.

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

 


Rackspace

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