Re: [Xen-devel] [PATCH v9 6/7] tools/libxc: add support of injecting MC# to specified CPUs
On 07/12/17 09:25 -0400, Konrad Rzeszutek Wilk wrote: > On Wed, Jul 12, 2017 at 10:04:39AM +0800, Haozhong Zhang wrote: > > Though XEN_MC_inject_v2 allows injecting MC# to specified CPUs, the > > current xc_mca_op() does not use this feature and not provide an > > interface to callers. This commit add a new xc_mca_op_inject_v2() that > > receives a cpumap providing the set of target CPUs. > > > > Signed-off-by: Haozhong Zhang> > Acked-by: Wei Liu > > --- > > Cc: Ian Jackson > > Cc: Wei Liu > > --- > > tools/libxc/include/xenctrl.h | 2 ++ > > tools/libxc/xc_misc.c | 52 > > ++- > > 2 files changed, 53 insertions(+), 1 deletion(-) > > > > diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h > > index c51bb3b448..552a4fd47d 100644 > > --- a/tools/libxc/include/xenctrl.h > > +++ b/tools/libxc/include/xenctrl.h > > @@ -1809,6 +1809,8 @@ 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_inject_v2(xc_interface *xch, unsigned int flags, > > +xc_cpumap_t cpumap, unsigned int nr_cpus); > > #endif > > > > struct xc_px_val { > > diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c > > index 88084fde30..2303293c6c 100644 > > --- a/tools/libxc/xc_misc.c > > +++ b/tools/libxc/xc_misc.c > > @@ -341,7 +341,57 @@ int xc_mca_op(xc_interface *xch, struct xen_mc *mc) > > xc_hypercall_bounce_post(xch, mc); > > return ret; > > } > > -#endif > > + > > +int xc_mca_op_inject_v2(xc_interface *xch, unsigned int flags, > > +xc_cpumap_t cpumap, unsigned int nr_bits) > > +{ > > +int ret = -1; > > +struct xen_mc mc_buf, *mc = _buf; > > +struct xen_mc_inject_v2 *inject = >u.mc_inject_v2; > > + > > +DECLARE_HYPERCALL_BOUNCE(cpumap, 0, XC_HYPERCALL_BUFFER_BOUNCE_IN); > > +DECLARE_HYPERCALL_BOUNCE(mc, sizeof(*mc), > > XC_HYPERCALL_BUFFER_BOUNCE_BOTH); > > + > > +memset(mc, 0, sizeof(*mc)); > > + > > +if ( cpumap ) > > +{ > > +if ( !nr_bits ) > > +{ > > +errno = EINVAL; > > +goto out; > > +} > > + > > +HYPERCALL_BOUNCE_SET_SIZE(cpumap, (nr_bits + 7) / 8); > > bitmap_size ? nr_bits is of type unsigned int, while bitmap_size() requires a signed int argument, though the number of CPUs passed via nr_bits in practice can be represented by a signed int. Haozhong ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v9 6/7] tools/libxc: add support of injecting MC# to specified CPUs
On Wed, Jul 12, 2017 at 10:04:39AM +0800, Haozhong Zhang wrote: > Though XEN_MC_inject_v2 allows injecting MC# to specified CPUs, the > current xc_mca_op() does not use this feature and not provide an > interface to callers. This commit add a new xc_mca_op_inject_v2() that > receives a cpumap providing the set of target CPUs. > > Signed-off-by: Haozhong Zhang> Acked-by: Wei Liu > --- > Cc: Ian Jackson > Cc: Wei Liu > --- > tools/libxc/include/xenctrl.h | 2 ++ > tools/libxc/xc_misc.c | 52 > ++- > 2 files changed, 53 insertions(+), 1 deletion(-) > > diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h > index c51bb3b448..552a4fd47d 100644 > --- a/tools/libxc/include/xenctrl.h > +++ b/tools/libxc/include/xenctrl.h > @@ -1809,6 +1809,8 @@ 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_inject_v2(xc_interface *xch, unsigned int flags, > +xc_cpumap_t cpumap, unsigned int nr_cpus); > #endif > > struct xc_px_val { > diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c > index 88084fde30..2303293c6c 100644 > --- a/tools/libxc/xc_misc.c > +++ b/tools/libxc/xc_misc.c > @@ -341,7 +341,57 @@ int xc_mca_op(xc_interface *xch, struct xen_mc *mc) > xc_hypercall_bounce_post(xch, mc); > return ret; > } > -#endif > + > +int xc_mca_op_inject_v2(xc_interface *xch, unsigned int flags, > +xc_cpumap_t cpumap, unsigned int nr_bits) > +{ > +int ret = -1; > +struct xen_mc mc_buf, *mc = _buf; > +struct xen_mc_inject_v2 *inject = >u.mc_inject_v2; > + > +DECLARE_HYPERCALL_BOUNCE(cpumap, 0, XC_HYPERCALL_BUFFER_BOUNCE_IN); > +DECLARE_HYPERCALL_BOUNCE(mc, sizeof(*mc), > XC_HYPERCALL_BUFFER_BOUNCE_BOTH); > + > +memset(mc, 0, sizeof(*mc)); > + > +if ( cpumap ) > +{ > +if ( !nr_bits ) > +{ > +errno = EINVAL; > +goto out; > +} > + > +HYPERCALL_BOUNCE_SET_SIZE(cpumap, (nr_bits + 7) / 8); bitmap_size ? > +if ( xc_hypercall_bounce_pre(xch, cpumap) ) > +{ > +PERROR("Could not bounce cpumap memory buffer"); > +goto out; > +} > +set_xen_guest_handle(inject->cpumap.bitmap, cpumap); > +inject->cpumap.nr_bits = nr_bits; > +} > + > +inject->flags = flags; > +mc->cmd = XEN_MC_inject_v2; > +mc->interface_version = XEN_MCA_INTERFACE_VERSION; > + > +if ( xc_hypercall_bounce_pre(xch, mc) ) > +{ > +PERROR("Could not bounce xen_mc memory buffer"); > +goto out_free_cpumap; > +} > + > +ret = xencall1(xch->xcall, __HYPERVISOR_mca, > HYPERCALL_BUFFER_AS_ARG(mc)); > + > +xc_hypercall_bounce_post(xch, mc); > +out_free_cpumap: > +if ( cpumap ) > +xc_hypercall_bounce_post(xch, cpumap); > +out: > +return ret; > +} > +#endif /* __i386__ || __x86_64__ */ > > int xc_perfc_reset(xc_interface *xch) > { > -- > 2.11.0 > > > ___ > Xen-devel mailing list > Xen-devel@lists.xen.org > https://lists.xen.org/xen-devel ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
[Xen-devel] [PATCH v9 6/7] tools/libxc: add support of injecting MC# to specified CPUs
Though XEN_MC_inject_v2 allows injecting MC# to specified CPUs, the current xc_mca_op() does not use this feature and not provide an interface to callers. This commit add a new xc_mca_op_inject_v2() that receives a cpumap providing the set of target CPUs. Signed-off-by: Haozhong ZhangAcked-by: Wei Liu --- Cc: Ian Jackson Cc: Wei Liu --- tools/libxc/include/xenctrl.h | 2 ++ tools/libxc/xc_misc.c | 52 ++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index c51bb3b448..552a4fd47d 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1809,6 +1809,8 @@ 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_inject_v2(xc_interface *xch, unsigned int flags, +xc_cpumap_t cpumap, unsigned int nr_cpus); #endif struct xc_px_val { diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c index 88084fde30..2303293c6c 100644 --- a/tools/libxc/xc_misc.c +++ b/tools/libxc/xc_misc.c @@ -341,7 +341,57 @@ int xc_mca_op(xc_interface *xch, struct xen_mc *mc) xc_hypercall_bounce_post(xch, mc); return ret; } -#endif + +int xc_mca_op_inject_v2(xc_interface *xch, unsigned int flags, +xc_cpumap_t cpumap, unsigned int nr_bits) +{ +int ret = -1; +struct xen_mc mc_buf, *mc = _buf; +struct xen_mc_inject_v2 *inject = >u.mc_inject_v2; + +DECLARE_HYPERCALL_BOUNCE(cpumap, 0, XC_HYPERCALL_BUFFER_BOUNCE_IN); +DECLARE_HYPERCALL_BOUNCE(mc, sizeof(*mc), XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + +memset(mc, 0, sizeof(*mc)); + +if ( cpumap ) +{ +if ( !nr_bits ) +{ +errno = EINVAL; +goto out; +} + +HYPERCALL_BOUNCE_SET_SIZE(cpumap, (nr_bits + 7) / 8); +if ( xc_hypercall_bounce_pre(xch, cpumap) ) +{ +PERROR("Could not bounce cpumap memory buffer"); +goto out; +} +set_xen_guest_handle(inject->cpumap.bitmap, cpumap); +inject->cpumap.nr_bits = nr_bits; +} + +inject->flags = flags; +mc->cmd = XEN_MC_inject_v2; +mc->interface_version = XEN_MCA_INTERFACE_VERSION; + +if ( xc_hypercall_bounce_pre(xch, mc) ) +{ +PERROR("Could not bounce xen_mc memory buffer"); +goto out_free_cpumap; +} + +ret = xencall1(xch->xcall, __HYPERVISOR_mca, HYPERCALL_BUFFER_AS_ARG(mc)); + +xc_hypercall_bounce_post(xch, mc); +out_free_cpumap: +if ( cpumap ) +xc_hypercall_bounce_post(xch, cpumap); +out: +return ret; +} +#endif /* __i386__ || __x86_64__ */ int xc_perfc_reset(xc_interface *xch) { -- 2.11.0 ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel