|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 5/7] xen: libxc: libxl: allow for attaching and detaching a CPU to CMT
Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>
---
tools/libxc/include/xenctrl.h | 2 ++
tools/libxc/xc_psr.c | 34 ++++++++++++++++++++++++++++++++++
tools/libxl/libxl.h | 2 ++
tools/libxl/libxl_psr.c | 30 ++++++++++++++++++++++++++++++
xen/arch/x86/sysctl.c | 28 ++++++++++++++++++++++++++++
xen/include/public/sysctl.h | 2 ++
6 files changed, 98 insertions(+)
diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index d038e40..7c17e3e 100644
--- a/tools/libxc/include/xenctrl.h
+++ b/tools/libxc/include/xenctrl.h
@@ -2707,6 +2707,8 @@ int xc_psr_cmt_get_cpu_rmid(xc_interface *xch, uint32_t
cpu,
int xc_psr_cmt_get_data(xc_interface *xch, uint32_t rmid, uint32_t cpu,
uint32_t psr_cmt_type, uint64_t *monitor_data,
uint64_t *tsc);
+int xc_psr_cmt_cpu_attach(xc_interface *xch, uint32_t cpu);
+int xc_psr_cmt_cpu_detach(xc_interface *xch, uint32_t cpu);
int xc_psr_cmt_enabled(xc_interface *xch);
#endif
diff --git a/tools/libxc/xc_psr.c b/tools/libxc/xc_psr.c
index 088cf66..3d1b1cb 100644
--- a/tools/libxc/xc_psr.c
+++ b/tools/libxc/xc_psr.c
@@ -177,6 +177,40 @@ int xc_psr_cmt_get_cpu_rmid(xc_interface *xch, uint32_t
cpu,
return 0;
}
+int xc_psr_cmt_cpu_attach(xc_interface *xch, uint32_t cpu)
+{
+ int rc;
+ DECLARE_SYSCTL;
+
+ sysctl.cmd = XEN_SYSCTL_psr_cmt_op;
+ sysctl.u.psr_cmt_op.cmd = XEN_SYSCTL_PSR_CMT_cpu_rmid_attach;
+ sysctl.u.psr_cmt_op.u.cpu_rmid.cpu = cpu;
+ sysctl.u.psr_cmt_op.flags = 0;
+
+ rc = xc_sysctl(xch, &sysctl);
+ if ( rc )
+ return -1;
+
+ return 0;
+}
+
+int xc_psr_cmt_cpu_detach(xc_interface *xch, uint32_t cpu)
+{
+ int rc;
+ DECLARE_SYSCTL;
+
+ sysctl.cmd = XEN_SYSCTL_psr_cmt_op;
+ sysctl.u.psr_cmt_op.cmd = XEN_SYSCTL_PSR_CMT_cpu_rmid_detach;
+ sysctl.u.psr_cmt_op.u.cpu_rmid.cpu = cpu;
+ sysctl.u.psr_cmt_op.flags = 0;
+
+ rc = xc_sysctl(xch, &sysctl);
+ if ( rc )
+ return -1;
+
+ return 0;
+}
+
int xc_psr_cmt_get_data(xc_interface *xch, uint32_t rmid, uint32_t cpu,
xc_psr_cmt_type type, uint64_t *monitor_data,
uint64_t *tsc)
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 23e266d..1c1d5f0 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1525,6 +1525,8 @@ int libxl_psr_cmt_cpu_attached(libxl_ctx *ctx, uint32_t
cpu);
int libxl_psr_cmt_get_cpu_cache_occupancy(libxl_ctx *ctx,
uint32_t cpu,
uint32_t *l3_cache_occupancy);
+int libxl_psr_cmt_cpu_attach(libxl_ctx *ctx, uint32_t cpu);
+int libxl_psr_cmt_cpu_detach(libxl_ctx *ctx, uint32_t cpu);
#endif
#ifdef LIBXL_HAVE_PSR_MBM
diff --git a/tools/libxl/libxl_psr.c b/tools/libxl/libxl_psr.c
index f5688a3..6b7a7ba 100644
--- a/tools/libxl/libxl_psr.c
+++ b/tools/libxl/libxl_psr.c
@@ -306,6 +306,36 @@ int libxl_psr_cmt_get_cpu_cache_occupancy(libxl_ctx *ctx,
return rc;
}
+int libxl_psr_cmt_cpu_attach(libxl_ctx *ctx, uint32_t cpu)
+{
+ GC_INIT(ctx);
+ int rc;
+
+ rc = xc_psr_cmt_cpu_attach(ctx->xch, cpu);
+ if (rc) {
+ libxl__psr_cmt_log_err_msg(gc, errno);
+ rc = ERROR_FAIL;
+ }
+
+ GC_FREE;
+ return rc;
+}
+
+int libxl_psr_cmt_cpu_detach(libxl_ctx *ctx, uint32_t cpu)
+{
+ GC_INIT(ctx);
+ int rc;
+
+ rc = xc_psr_cmt_cpu_detach(ctx->xch, cpu);
+ if (rc) {
+ libxl__psr_cmt_log_err_msg(gc, errno);
+ rc = ERROR_FAIL;
+ }
+
+ GC_FREE;
+ return rc;
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c
index fc9838c..93837e5 100644
--- a/xen/arch/x86/sysctl.c
+++ b/xen/arch/x86/sysctl.c
@@ -174,6 +174,34 @@ long arch_do_sysctl(
sysctl->u.psr_cmt_op.u.data = per_cpu(pcpu_rmid, cpu);
break;
}
+ case XEN_SYSCTL_PSR_CMT_cpu_rmid_attach:
+ {
+ unsigned int cpu = sysctl->u.psr_cmt_op.u.cpu_rmid.cpu;
+
+ if ( (cpu >= nr_cpu_ids) || !cpu_online(cpu) )
+ {
+ ret = -ENODEV;
+ break;
+ }
+ ret = psr_alloc_pcpu_rmid(cpu);
+ break;
+ }
+ case XEN_SYSCTL_PSR_CMT_cpu_rmid_detach:
+ {
+ unsigned int cpu = sysctl->u.psr_cmt_op.u.cpu_rmid.cpu;
+
+ if ( (cpu >= nr_cpu_ids) || !cpu_online(cpu) )
+ {
+ ret = -ENODEV;
+ break;
+ }
+
+ if ( per_cpu(pcpu_rmid, cpu) )
+ psr_free_pcpu_rmid(cpu);
+ else
+ return -ENOENT;
+ break;
+ }
default:
sysctl->u.psr_cmt_op.u.data = 0;
ret = -ENOSYS;
diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
index 11c26c6..0ae8758 100644
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -648,6 +648,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_sysctl_coverage_op_t);
#define XEN_SYSCTL_PSR_CMT_enabled 3
#define XEN_SYSCTL_PSR_CMT_get_l3_event_mask 4
#define XEN_SYSCTL_PSR_CMT_get_cpu_rmid 5
+#define XEN_SYSCTL_PSR_CMT_cpu_rmid_attach 6
+#define XEN_SYSCTL_PSR_CMT_cpu_rmid_detach 7
struct xen_sysctl_psr_cmt_op {
uint32_t cmd; /* IN: XEN_SYSCTL_PSR_CMT_* */
uint32_t flags; /* padding variable, may be extended for future use */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |