From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH v2 4/8] x86: dynamically attach/detach CQM service for a guest Date: Thu, 21 Nov 2013 12:50:28 +0000 Message-ID: <528E0194.8000904@citrix.com> References: <1385018444-104477-1-git-send-email-dongxiao.xu@intel.com> <1385018444-104477-5-git-send-email-dongxiao.xu@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1385018444-104477-5-git-send-email-dongxiao.xu@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: dongxiao.xu@intel.com Cc: xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org On 21/11/13 07:20, dongxiao.xu@intel.com wrote: > From: Dongxiao Xu > > Add hypervisor side support for dynamically attach and detach CQM > services for a certain guest. > > Signed-off-by: Jiongxi Li > Signed-off-by: Dongxiao Xu > --- > xen/arch/x86/domctl.c | 40 ++++++++++++++++++++++++++++++++++++++++ > xen/include/public/domctl.h | 14 ++++++++++++++ > 2 files changed, 54 insertions(+) > > diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c > index f7e4586..5ef21f9 100644 > --- a/xen/arch/x86/domctl.c > +++ b/xen/arch/x86/domctl.c > @@ -35,6 +35,7 @@ > #include > #include > #include > +#include > > static int gdbsx_guest_mem_io( > domid_t domid, struct xen_domctl_gdbsx_memio *iop) > @@ -1223,6 +1224,45 @@ long arch_do_domctl( > } > break; > > + case XEN_DOMCTL_attach_pqos: > + { > + if ( domctl->u.qos_res.flags & XEN_DOMCTL_ADF_pqos_cqm ) > + { > + if ( !system_supports_cqm() ) > + ret = -ENODEV; > + else if ( d->arch.pqos_cqm_rmid > 0 ) > + ret = -EINVAL; EEXISTS perhaps? > + else > + { > + ret = alloc_cqm_rmid(d); > + if ( ret < 0 ) > + ret = -EBUSY; On reflection, EUSERS is probably more accurate here. > + } > + } > + else > + ret = -EINVAL; > + } > + break; > + > + case XEN_DOMCTL_detach_pqos: > + { > + if ( domctl->u.qos_res.flags & XEN_DOMCTL_ADF_pqos_cqm ) > + { > + if ( !system_supports_cqm() ) > + ret = -ENODEV; > + else if ( d->arch.pqos_cqm_rmid > 0 ) > + { > + free_cqm_rmid(d); > + ret = 0; > + } > + else > + ret = -EINVAL; > + } > + else > + ret = -EINVAL; > + } > + 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..f5d7062 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) Does the ADF help here? My personal opinion is that it makes the constants more confusing. ~Andrew > + 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,8 @@ 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_gdbsx_guestmemio 1000 > #define XEN_DOMCTL_gdbsx_pausevcpu 1001 > #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 > @@ -1001,6 +1014,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; > };