[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/8] x86: dynamically attach/detach CQM service for a guest
From: Dongxiao Xu <dongxiao.xu@xxxxxxxxx> Add hypervisor side support for dynamically attach and detach CQM services for a certain guest. Signed-off-by: Jiongxi Li <jiongxi.li@xxxxxxxxx> Signed-off-by: Dongxiao Xu <dongxiao.xu@xxxxxxxxx> --- xen/arch/x86/domctl.c | 66 +++++++++++++++++++++++++++++++++++++++++++ xen/include/public/domctl.h | 15 ++++++++++ 2 files changed, 81 insertions(+) diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index f7e4586..df6a373 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -35,6 +35,7 @@ #include <asm/mem_sharing.h> #include <asm/xstate.h> #include <asm/debugger.h> +#include <asm/pqos.h> static int gdbsx_guest_mem_io( domid_t domid, struct xen_domctl_gdbsx_memio *iop) @@ -1223,6 +1224,71 @@ long arch_do_domctl( } break; + case XEN_DOMCTL_attach_pqos: + { + struct domain *d; + + if ( (d = rcu_lock_domain_by_id(domctl->domain)) == NULL ) + { + ret = -EBUSY; + break; + } + + if ( domctl->u.qos_res.flags & XEN_DOMCTL_ADF_pqos_cqm ) + { + if ( !system_support_cqm() ) + ret = -ENODEV; + else if ( d->arch.pqos_cqm_rmid > 0 ) + ret = -EINVAL; + else + { + ret = 0; + d->arch.pqos_cqm_rmid = alloc_cqm_resource(d->domain_id); + if ( d->arch.pqos_cqm_rmid <= 0 ) + { + /* set to default value */ + d->arch.pqos_cqm_rmid = 0; + ret = -ENODEV; + } + } + } + else + ret = -EINVAL; + + rcu_unlock_domain(d); + } + break; + + case XEN_DOMCTL_detach_pqos: + { + struct domain *d; + + if ( (d = rcu_lock_domain_by_id(domctl->domain)) == NULL ) + { + ret = -EBUSY; + break; + } + + if ( domctl->u.qos_res.flags & XEN_DOMCTL_ADF_pqos_cqm ) + { + if ( !system_support_cqm() ) + ret = -ENODEV; + else if ( d->arch.pqos_cqm_rmid > 0 ) + { + free_cqm_resource(d->domain_id); + d->arch.pqos_cqm_rmid = 0; + ret = 0; + } + else + ret = -EINVAL; + } + else + ret = -EINVAL; + + rcu_unlock_domain(d); + } + break; + default: ret = iommu_do_domctl(domctl, d, u_domctl); break; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 47a850a..4fe21db 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -872,6 +872,17 @@ struct xen_domctl_set_max_evtchn { typedef struct xen_domctl_set_max_evtchn xen_domctl_set_max_evtchn_t; DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_max_evtchn_t); +/* XEN_DOMCTL_attach_pqos */ +/* XEN_DOMCTL_detach_pqos */ +struct xen_domctl_qos_resource { + /* Attach or detach flag for cqm */ +#define _XEN_DOMCTL_ADF_pqos_cqm 0 +#define XEN_DOMCTL_ADF_pqos_cqm (1U<<_XEN_DOMCTL_ADF_pqos_cqm) + uint32_t flags; +}; +typedef struct xen_domctl_qos_resource xen_domctl_qos_resource_t; +DEFINE_XEN_GUEST_HANDLE(xen_domctl_qos_resource_t); + struct xen_domctl { uint32_t cmd; #define XEN_DOMCTL_createdomain 1 @@ -941,6 +952,9 @@ struct xen_domctl { #define XEN_DOMCTL_setnodeaffinity 68 #define XEN_DOMCTL_getnodeaffinity 69 #define XEN_DOMCTL_set_max_evtchn 70 +#define XEN_DOMCTL_attach_pqos 71 +#define XEN_DOMCTL_detach_pqos 72 +#define XEN_DOMCTL_list_pqos 73 #define XEN_DOMCTL_gdbsx_guestmemio 1000 #define XEN_DOMCTL_gdbsx_pausevcpu 1001 #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 @@ -1001,6 +1015,7 @@ struct xen_domctl { struct xen_domctl_set_broken_page_p2m set_broken_page_p2m; struct xen_domctl_gdbsx_pauseunp_vcpu gdbsx_pauseunp_vcpu; struct xen_domctl_gdbsx_domstatus gdbsx_domstatus; + struct xen_domctl_qos_resource qos_res; uint8_t pad[128]; } u; }; -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |