From patchwork Mon Jun 20 11:31:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 9187265 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 095586075F for ; Mon, 20 Jun 2016 11:33:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E420A26861 for ; Mon, 20 Jun 2016 11:33:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D751526992; Mon, 20 Jun 2016 11:33:22 +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 7A63A26861 for ; Mon, 20 Jun 2016 11:33:22 +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 1bExQH-0007Je-Bz; Mon, 20 Jun 2016 11:31:21 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bExQG-0007JS-3C for xen-devel@lists.xenproject.org; Mon, 20 Jun 2016 11:31:20 +0000 Received: from [85.158.143.35] by server-1.bemta-6.messagelabs.com id 8B/C5-09256-704D7675; Mon, 20 Jun 2016 11:31:19 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrMIsWRWlGSWpSXmKPExsXS6fjDS5ftSnq 4waQVRhbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8b7czsYC84pVXSeOcLSwDhVuouRk0NIIE+i p3sOI4jNK2An8aahE8yWEDCU2Dd/FRuIzSKgKvHl+CtWEJtNQF2i7dl2IJuDQ0TAQOLc0SQQk 1kgUGLrPLAKYQF7iauH9jOBhHkFBCX+7hAGCTMDDV/0qZ9pAiPXLITMLCQZCFtL4uGvWywQtr bEsoWvmWeBzZeWWP6PAyJsI/Hg6gw0JSC2u8SNNztZFjByrGJUL04tKkst0jXUSyrKTM8oyU3 MzNE1NDDTy00tLk5MT81JTCrWS87P3cQIDDwGINjBuPO50yFGSQ4mJVFem+L0cCG+pPyUyozE 4oz4otKc1OJDjDIcHEoSvK8vAeUEi1LTUyvSMnOAMQCTluDgURLhXQGS5i0uSMwtzkyHSJ1iV JQS530LkhAASWSU5sG1weLuEqOslDAvI9AhQjwFqUW5mSWo8q8YxTkYlYR5t4JM4cnMK4Gb/g poMRPQ4mX9YItLEhFSUg2M0doMGr9d5e/lT7789PfHNw4623/763HeYp3ilPeqmvXZKaWlfXY t9lxLl0g8v9i/oaJb7smyBW7vJmgtKP86KVJKO6qG/+aTqEvVSYuFy20+nO3fJb0q87zJoWVR u/90mu/KeREtKbGmNKHTdwvTMuett+dNsl+1tCxbcsd3tlsrUn4FBpeVKLEUZyQaajEXFScCA L11exO2AgAA X-Env-Sender: JBeulich@suse.com X-Msg-Ref: server-6.tower-21.messagelabs.com!1466422277!19771106!1 X-Originating-IP: [137.65.248.74] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 21433 invoked from network); 20 Jun 2016 11:31:18 -0000 Received: from prv-mh.provo.novell.com (HELO prv-mh.provo.novell.com) (137.65.248.74) by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 20 Jun 2016 11:31:18 -0000 Received: from INET-PRV-MTA by prv-mh.provo.novell.com with Novell_GroupWise; Mon, 20 Jun 2016 05:31:16 -0600 Message-Id: <5767F02202000078000F6A32@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.0 Date: Mon, 20 Jun 2016 05:31:14 -0600 From: "Jan Beulich" To: "xen-devel" Mime-Version: 1.0 Cc: Kevin Tian , Jun Nakajima Subject: [Xen-devel] [PATCH] VMX: use non-atomic bitops to manage MSR state 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: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP All host_msr_state accesses are solely on the owning CPU, and all guest_msr_state ones solely when the vCPU is current or being switched to. This, btw, is also in line with the use of find_first_set_bit() (which would be bogus if ->flags could get updated behind its back). Signed-off-by: Jan Beulich VMX: use non-atomic bitops to manage MSR state All host_msr_state accesses are solely on the owning CPU, and all guest_msr_state ones solely when the vCPU is current or being switched to. This, btw, is also in line with the use of find_first_set_bit() (which would be bogus if ->flags could get updated behind its back). Signed-off-by: Jan Beulich --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -339,9 +339,9 @@ void vmx_save_host_msrs(void) #define WRITE_MSR(address) do { \ guest_msr_state->msrs[VMX_INDEX_MSR_ ## address] = msr_content; \ - set_bit(VMX_INDEX_MSR_ ## address, &guest_msr_state->flags); \ + __set_bit(VMX_INDEX_MSR_ ## address, &guest_msr_state->flags); \ wrmsrl(MSR_ ## address, msr_content); \ - set_bit(VMX_INDEX_MSR_ ## address, &host_msr_state->flags); \ + __set_bit(VMX_INDEX_MSR_ ## address, &host_msr_state->flags); \ } while ( 0 ) static enum handler_return @@ -462,7 +462,7 @@ static void vmx_restore_host_msrs(void) { i = find_first_set_bit(host_msr_state->flags); wrmsrl(msr_index[i], host_msr_state->msrs[i]); - clear_bit(i, &host_msr_state->flags); + __clear_bit(i, &host_msr_state->flags); } } @@ -495,9 +495,9 @@ static void vmx_restore_guest_msrs(struc HVM_DBG_LOG(DBG_LEVEL_2, "restore guest's index %d msr %x with value %lx", i, msr_index[i], guest_msr_state->msrs[i]); - set_bit(i, &host_msr_state->flags); + __set_bit(i, &host_msr_state->flags); wrmsrl(msr_index[i], guest_msr_state->msrs[i]); - clear_bit(i, &guest_flags); + __clear_bit(i, &guest_flags); } if ( (v->arch.hvm_vcpu.guest_efer ^ read_efer()) & EFER_SCE ) Reviewed-by: Andrew Cooper Acked-by: Kevin Tian --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -339,9 +339,9 @@ void vmx_save_host_msrs(void) #define WRITE_MSR(address) do { \ guest_msr_state->msrs[VMX_INDEX_MSR_ ## address] = msr_content; \ - set_bit(VMX_INDEX_MSR_ ## address, &guest_msr_state->flags); \ + __set_bit(VMX_INDEX_MSR_ ## address, &guest_msr_state->flags); \ wrmsrl(MSR_ ## address, msr_content); \ - set_bit(VMX_INDEX_MSR_ ## address, &host_msr_state->flags); \ + __set_bit(VMX_INDEX_MSR_ ## address, &host_msr_state->flags); \ } while ( 0 ) static enum handler_return @@ -462,7 +462,7 @@ static void vmx_restore_host_msrs(void) { i = find_first_set_bit(host_msr_state->flags); wrmsrl(msr_index[i], host_msr_state->msrs[i]); - clear_bit(i, &host_msr_state->flags); + __clear_bit(i, &host_msr_state->flags); } } @@ -495,9 +495,9 @@ static void vmx_restore_guest_msrs(struc HVM_DBG_LOG(DBG_LEVEL_2, "restore guest's index %d msr %x with value %lx", i, msr_index[i], guest_msr_state->msrs[i]); - set_bit(i, &host_msr_state->flags); + __set_bit(i, &host_msr_state->flags); wrmsrl(msr_index[i], guest_msr_state->msrs[i]); - clear_bit(i, &guest_flags); + __clear_bit(i, &guest_flags); } if ( (v->arch.hvm_vcpu.guest_efer ^ read_efer()) & EFER_SCE )