From patchwork Sat Jul 9 04:20:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corneliu ZUZU X-Patchwork-Id: 9221989 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B345760467 for ; Sat, 9 Jul 2016 04:23:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A249F28533 for ; Sat, 9 Jul 2016 04:23:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 946A3286C0; Sat, 9 Jul 2016 04:23:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CD76F28533 for ; Sat, 9 Jul 2016 04:23:02 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bLjlC-0002pK-Qc; Sat, 09 Jul 2016 04:20:58 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bLjlB-0002p3-Eq for xen-devel@lists.xen.org; Sat, 09 Jul 2016 04:20:57 +0000 Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id 89/FD-31810-8AB70875; Sat, 09 Jul 2016 04:20:56 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrBIsWRWlGSWpSXmKPExsUSfTxjoe6K6oZ wg+9nWSyWfFzM4sDocXT3b6YAxijWzLyk/IoE1oy2/tCC86YVM6dzNzB2a3cxcnIICbhLbDqw mamLkQvIXsMosXryTzYI5ySjRO/6i8wQVW4Sp28tYoFIrGOU2PNqCViCTUBb4tyhe0wgtoiAt MS1z5cZQWxmgUVMEg/f8YLYwgKpEj+WLACLswioSjx//Jy1i5GDg1fAReLWUQcQU0JATmLBhX SQCk4BV4lzb1+zQqx1kbixbxLYdAmBHImVz2axQ5RLSfxvVQK5RkJgKYvE75Mt7BA1MhKPJt5 km8AotICRYRWjRnFqUVlqka6hsV5SUWZ6RkluYmaOrqGBsV5uanFxYnpqTmJSsV5yfu4mRmAI MgDBDsZt2z0PMUpyMCmJ8l6wbQgX4kvKT6nMSCzOiC8qzUktPsQow8GhJMHLAgxpIcGi1PTUi rTMHGA0wKQlOHiURHilQdK8xQWJucWZ6RCpU4yKUuK8C6qAEgIgiYzSPLg2WAReYpSVEuZlBD pEiKcgtSg3swRV/hWjOAejkjDvQ5ApPJl5JXDTXwEtZgJabBBQD7K4JBEhJdXAqHZezUvopva JbZ0h/hrWq5o25sw5wPc0yavfy+D34vCJd94FNguJzV4wN/C81GY16eueETOk9heldCydvr91 9SO3gvfxQi4z+NZJdm58P7N409qH7nsjKtZ9kjBq36zNoNBUpLGfe3r1ArN/ymudHQsCN7tWv tI6dPBOaW5YudX5CfdVHI4uUWIpzkg01GIuKk4EAKujFWu7AgAA X-Env-Sender: czuzu@bitdefender.com X-Msg-Ref: server-2.tower-31.messagelabs.com!1468038055!49597176!1 X-Originating-IP: [91.199.104.161] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 37618 invoked from network); 9 Jul 2016 04:20:56 -0000 Received: from mx01.bbu.dsd.mx.bitdefender.com (HELO mx01.bbu.dsd.mx.bitdefender.com) (91.199.104.161) by server-2.tower-31.messagelabs.com with DHE-RSA-AES128-GCM-SHA256 encrypted SMTP; 9 Jul 2016 04:20:56 -0000 Received: (qmail 12093 invoked from network); 9 Jul 2016 07:20:55 +0300 Received: from unknown (HELO mx-sr.buh.bitdefender.com) (10.17.80.103) by mx01.bbu.dsd.mx.bitdefender.com with AES256-GCM-SHA384 encrypted SMTP; 9 Jul 2016 07:20:55 +0300 Received: from smtp03.buh.bitdefender.org (unknown [10.17.80.77]) by mx-sr.buh.bitdefender.com (Postfix) with ESMTP id 14F997FC01 for ; Sat, 9 Jul 2016 07:20:55 +0300 (EEST) Received: (qmail 4544 invoked from network); 9 Jul 2016 07:20:55 +0300 Received: from 188-24-34-246.rdsnet.ro (HELO localhost.localdomain) (czuzu@bitdefender.com@188.24.34.246) by smtp03.buh.bitdefender.org with SMTP; 9 Jul 2016 07:20:55 +0300 From: Corneliu ZUZU To: xen-devel@lists.xen.org Date: Sat, 9 Jul 2016 07:20:11 +0300 Message-Id: <1468038011-6935-1-git-send-email-czuzu@bitdefender.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1468037509-6428-1-git-send-email-czuzu@bitdefender.com> References: <1468037509-6428-1-git-send-email-czuzu@bitdefender.com> X-BitDefender-Scanner: Clean, Agent: BitDefender qmail 3.1.6 on smtp03.buh.bitdefender.org, sigver: 7.66242 X-BitDefender-Spam: No (0) X-BitDefender-SpamStamp: Build: [Engines: 2.15.6.911, Dats: 425852, Stamp: 3], Multi: [Enabled, t: (0.000012, 0.007238)], BW: [Enabled, t: (0.000007,0.000001)], RBL DNSBL: [Disabled], APM: [Enabled, Score: 500, t: (0.004912), Flags: 85D2ED72; NN_NO_CONTENT_TYPE; NN_LEGIT_SUMM_400_WORDS; NN_NO_LINK_NMD; NN_LEGIT_BITDEFENDER; NN_LEGIT_S_SQARE_BRACKETS; NN_LEGIT_MAILING_LIST_TO], SGN: [Enabled, t: (0.010981)], URL: [Enabled, t: (0.000005)], RTDA: [Enabled, t: (0.015731), Hit: No, Details: v2.3.10; Id: 2m1ghic.1aml0sh1c.u9hq], total: 0(775) X-BitDefender-CF-Stamp: none Cc: Tamas K Lengyel , Razvan Cojocaru , Andrew Cooper , Julien Grall , Paul Durrant , Stefano Stabellini , Jan Beulich Subject: [Xen-devel] [PATCH 11/16] x86/monitor: fix: treat -monitor- properly, as a subsys of the vm-event subsys X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP As it can be seen looking @ the vm_event_per_domain structure, there are 3 defined vm-event subsystems: share, paging and monitor. In a number of places in the codebase, the monitor vm-events subsystem is mistakenly confounded with the vm-event subsystem as a whole: i.e. it is wrongfully checked if v->arch.vm_event is allocated to determine if the monitor subsystem is initialized. To fix that, add an 'initialised' bit in d->monitor which will determine if the monitor subsystem is initialised, create an inline stub monitor_domain_initialised() and use that instead where it applies. Signed-off-by: Corneliu ZUZU --- xen/arch/x86/hvm/emulate.c | 3 ++- xen/arch/x86/hvm/hvm.c | 10 +++++----- xen/arch/x86/monitor.c | 3 +++ xen/include/asm-arm/monitor.h | 3 ++- xen/include/asm-x86/monitor.h | 9 ++++----- xen/include/xen/monitor.h | 11 +++++++---- xen/include/xen/sched.h | 1 + 7 files changed, 24 insertions(+), 16 deletions(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 855af4d..a0094e9 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,7 @@ static int set_context_data(void *buffer, unsigned int size) { struct vcpu *curr = current; - if ( curr->arch.vm_event ) + if ( unlikely(monitor_domain_initialised(curr->domain)) ) { unsigned int safe_size = min(size, curr->arch.vm_event->emul_read_data.size); diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 79ba185..46fed33 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -471,7 +471,7 @@ void hvm_do_resume(struct vcpu *v) if ( !handle_hvm_io_completion(v) ) return; - if ( unlikely(v->arch.vm_event) ) + if ( unlikely(monitor_domain_initialised(v->domain)) ) { if ( unlikely(v->arch.vm_event->emulate_flags) ) { @@ -2176,7 +2176,7 @@ int hvm_set_cr0(unsigned long value, bool_t may_defer) if ( may_defer && unlikely(v->domain->arch.monitor.write_ctrlreg_enabled & monitor_ctrlreg_bitmask(VM_EVENT_X86_CR0)) ) { - ASSERT(v->arch.vm_event); + ASSERT(monitor_domain_initialised(v->domain)); if ( hvm_monitor_crX(CR0, value, old_value) ) { @@ -2281,7 +2281,7 @@ int hvm_set_cr3(unsigned long value, bool_t may_defer) if ( may_defer && unlikely(v->domain->arch.monitor.write_ctrlreg_enabled & monitor_ctrlreg_bitmask(VM_EVENT_X86_CR3)) ) { - ASSERT(v->arch.vm_event); + ASSERT(monitor_domain_initialised(v->domain)); if ( hvm_monitor_crX(CR3, value, old) ) { @@ -2364,7 +2364,7 @@ int hvm_set_cr4(unsigned long value, bool_t may_defer) if ( may_defer && unlikely(v->domain->arch.monitor.write_ctrlreg_enabled & monitor_ctrlreg_bitmask(VM_EVENT_X86_CR4)) ) { - ASSERT(v->arch.vm_event); + ASSERT(monitor_domain_initialised(v->domain)); if ( hvm_monitor_crX(CR4, value, old_cr) ) { @@ -3748,7 +3748,7 @@ int hvm_msr_write_intercept(unsigned int msr, uint64_t msr_content, if ( may_defer && unlikely(monitored_msr(v->domain, msr)) ) { - ASSERT(v->arch.vm_event); + ASSERT(monitor_domain_initialised(v->domain)); /* * The actual write will occur in monitor_ctrlreg_write_data(), if diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c index aeee435..4a29cad 100644 --- a/xen/arch/x86/monitor.c +++ b/xen/arch/x86/monitor.c @@ -62,6 +62,8 @@ int monitor_init_domain(struct domain *d) return -ENOMEM; } + d->monitor.initialised = 1; + return 0; } @@ -78,6 +80,7 @@ void monitor_cleanup_domain(struct domain *d) memset(&d->arch.monitor, 0, sizeof(d->arch.monitor)); memset(&d->monitor, 0, sizeof(d->monitor)); + d->monitor.initialised = 0; } void monitor_ctrlreg_write_resume(struct vcpu *v, vm_event_response_t *rsp) diff --git a/xen/include/asm-arm/monitor.h b/xen/include/asm-arm/monitor.h index 9a9734a..7ef30f1 100644 --- a/xen/include/asm-arm/monitor.h +++ b/xen/include/asm-arm/monitor.h @@ -48,13 +48,14 @@ int arch_monitor_domctl_event(struct domain *d, static inline int monitor_init_domain(struct domain *d) { - /* No arch-specific domain initialization on ARM. */ + d->monitor.initialised = 1; return 0; } static inline void monitor_cleanup_domain(struct domain *d) { memset(&d->monitor, 0, sizeof(d->monitor)); + d->monitor.initialised = 0; } static inline diff --git a/xen/include/asm-x86/monitor.h b/xen/include/asm-x86/monitor.h index 3ae24dd..4014f8d 100644 --- a/xen/include/asm-x86/monitor.h +++ b/xen/include/asm-x86/monitor.h @@ -22,6 +22,7 @@ #ifndef __ASM_X86_MONITOR_H__ #define __ASM_X86_MONITOR_H__ +#include #include #define monitor_ctrlreg_bitmask(ctrlreg_index) (1U << (ctrlreg_index)) @@ -41,11 +42,9 @@ int arch_monitor_domctl_op(struct domain *d, struct xen_domctl_monitor_op *mop) { case XEN_DOMCTL_MONITOR_OP_EMULATE_EACH_REP: domain_pause(d); - /* - * Enabling mem_access_emulate_each_rep without a vm_event subscriber - * is meaningless. - */ - if ( d->max_vcpus && d->vcpu[0] && d->vcpu[0]->arch.vm_event ) + + /* Meaningless without a monitor vm-events subscriber. */ + if ( likely(monitor_domain_initialised(d)) ) d->arch.mem_access_emulate_each_rep = !!mop->event; else rc = -EINVAL; diff --git a/xen/include/xen/monitor.h b/xen/include/xen/monitor.h index 2171d04..605caf0 100644 --- a/xen/include/xen/monitor.h +++ b/xen/include/xen/monitor.h @@ -22,12 +22,15 @@ #ifndef __XEN_MONITOR_H__ #define __XEN_MONITOR_H__ -#include - -struct domain; -struct xen_domctl_monitor_op; +#include int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *op); + +static inline bool_t monitor_domain_initialised(const struct domain *d) +{ + return d->monitor.initialised; +} + void monitor_guest_request(void); int monitor_traps(struct vcpu *v, bool_t sync, vm_event_request_t *req); diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 46c82e7..e6bd13f 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -472,6 +472,7 @@ struct domain struct { unsigned int guest_request_enabled : 1; unsigned int guest_request_sync : 1; + unsigned int initialised : 1; } monitor; };