Re: [Xen-devel] [PATCH v9 6/7] tools/libxc: add support of injecting MC# to specified CPUs

2017-07-13 Thread Haozhong Zhang
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

2017-07-12 Thread Konrad Rzeszutek Wilk
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

2017-07-11 Thread Haozhong Zhang
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);
+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