From: Olaf Hering Date: Tue, 8 Nov 2011 19:35:42 +0000 (+0000) Subject: mem_event: check capabilities only once X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=2b7ee729c5f89b24c107cca5b082453a855cdbf2;p=xen.git mem_event: check capabilities only once It is not required to check the system capabilities during every domctl. Rearrange the code to check them only once. Signed-off-by: Olaf Hering Committed-by: Keir Fraser --- diff --git a/xen/arch/x86/mm/mem_event.c b/xen/arch/x86/mm/mem_event.c index 2a3b5f596b..ae3429767c 100644 --- a/xen/arch/x86/mm/mem_event.c +++ b/xen/arch/x86/mm/mem_event.c @@ -253,32 +253,35 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, case XEN_DOMCTL_MEM_EVENT_OP_PAGING: { struct mem_event_domain *med = &d->mem_paging; - struct p2m_domain *p2m = p2m_get_hostp2m(d); - rc = -ENODEV; - /* Only HAP is supported */ - if ( !hap_enabled(d) ) - break; - - /* Currently only EPT is supported */ - if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) - break; - - rc = -EXDEV; - /* Disallow paging in a PoD guest */ - if ( p2m->pod.entry_count ) - break; + rc = -EINVAL; switch( mec->op ) { case XEN_DOMCTL_MEM_EVENT_OP_PAGING_ENABLE: { + struct p2m_domain *p2m = p2m_get_hostp2m(d); + rc = -ENODEV; + /* Only HAP is supported */ + if ( !hap_enabled(d) ) + break; + + /* Currently only EPT is supported */ + if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) + break; + + rc = -EXDEV; + /* Disallow paging in a PoD guest */ + if ( p2m->pod.entry_count ) + break; + rc = mem_event_enable(d, mec, med); } break; case XEN_DOMCTL_MEM_EVENT_OP_PAGING_DISABLE: { - rc = mem_event_disable(med); + if ( med->ring_page ) + rc = mem_event_disable(med); } break; @@ -295,26 +298,29 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec, case XEN_DOMCTL_MEM_EVENT_OP_ACCESS: { struct mem_event_domain *med = &d->mem_access; - rc = -ENODEV; - /* Only HAP is supported */ - if ( !hap_enabled(d) ) - break; - - /* Currently only EPT is supported */ - if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) - break; + rc = -EINVAL; switch( mec->op ) { case XEN_DOMCTL_MEM_EVENT_OP_ACCESS_ENABLE: { + rc = -ENODEV; + /* Only HAP is supported */ + if ( !hap_enabled(d) ) + break; + + /* Currently only EPT is supported */ + if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ) + break; + rc = mem_event_enable(d, mec, med); } break; case XEN_DOMCTL_MEM_EVENT_OP_ACCESS_DISABLE: { - rc = mem_event_disable(&d->mem_access); + if ( med->ring_page ) + rc = mem_event_disable(&d->mem_access); } break;