From patchwork Thu Nov 7 06:22:54 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pingfan Liu X-Patchwork-Id: 289196 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 27F152C00DE for ; Thu, 7 Nov 2013 17:22:24 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750896Ab3KGGWX (ORCPT ); Thu, 7 Nov 2013 01:22:23 -0500 Received: from mail-qa0-f47.google.com ([209.85.216.47]:56378 "EHLO mail-qa0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750766Ab3KGGWW (ORCPT ); Thu, 7 Nov 2013 01:22:22 -0500 Received: by mail-qa0-f47.google.com with SMTP id w8so115741qac.20 for ; Wed, 06 Nov 2013 22:22:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=ID51VgRLPwuptAI5vbtEhqkF5XGNe29MUyNn15tk9r0=; b=N7wEYJucrV8UUrBXHFuPdJuxX/YJkbKZtXFiMaK/OsPAjxo5rujf6fCSes38W1uxTK 0kjHzKSdW1v5con7SA+Czxu83NfDcYHYG5R78gCejmfsZo2at6DnA4JXJII3wYZZfz/u ZGFbogVBkWBBv0ddrs0s9ij7dKzzlED4rszt5z/R1iNC5QsGMJAHmo0LI8f3Q1YneZP0 BFzZqfgGUwMQtlUw/dYApaagjeHJ/4o7sTN6gzPFyn0KXU4hjfeb8UVDByKR+ZdqsjxB 1wFPt9yymrrhh3F7jYwQsn+uoABvdUNlt0ptg/s2Evi/8OQ4toZOe3lKcWC5JIFKCB6a 9dvw== X-Received: by 10.236.227.170 with SMTP id d40mr165718yhq.115.1383805341630; Wed, 06 Nov 2013 22:22:21 -0800 (PST) Received: from localhost ([202.108.130.138]) by mx.google.com with ESMTPSA id u66sm3815954yhd.24.2013.11.06.22.22.18 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 06 Nov 2013 22:22:21 -0800 (PST) From: Liu Ping Fan To: linuxppc-dev@lists.ozlabs.org, kvm-ppc@vger.kernel.org Cc: Benjamin Herrenschmidt , Paul Mackerras , Alexander Graf Subject: [PATCH v2 1/2] powerpc/kvm: fix rare but potential deadlock scene Date: Thu, 7 Nov 2013 14:22:54 +0800 Message-Id: <1383805375-14766-1-git-send-email-pingfank@linux.vnet.ibm.com> X-Mailer: git-send-email 1.8.1.4 Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org Since kvmppc_hv_find_lock_hpte() is called from both virtmode and realmode, so it can trigger the deadlock. Suppose the following scene: Two physical cpuM, cpuN, two VM instances A, B, each VM has a group of vcpus. If on cpuM, vcpu_A_1 holds bitlock X (HPTE_V_HVLOCK), then is switched out, and on cpuN, vcpu_A_2 try to lock X in realmode, then cpuN will be caught in realmode for a long time. What makes things even worse if the following happens, On cpuM, bitlockX is hold, on cpuN, Y is hold. vcpu_B_2 try to lock Y on cpuM in realmode vcpu_A_2 try to lock X on cpuN in realmode Oops! deadlock happens Signed-off-by: Liu Ping Fan --- arch/powerpc/kvm/book3s_64_mmu_hv.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 043eec8..dbc1478 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -474,10 +474,13 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, } /* Find the HPTE in the hash table */ + preempt_disable(); index = kvmppc_hv_find_lock_hpte(kvm, eaddr, slb_v, HPTE_V_VALID | HPTE_V_ABSENT); - if (index < 0) + if (index < 0) { + preempt_enable(); return -ENOENT; + } hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4)); v = hptep[0] & ~HPTE_V_HVLOCK; gr = kvm->arch.revmap[index].guest_rpte; @@ -485,6 +488,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, /* Unlock the HPTE */ asm volatile("lwsync" : : : "memory"); hptep[0] = v; + preempt_enable(); gpte->eaddr = eaddr; gpte->vpage = ((v & HPTE_V_AVPN) << 4) | ((eaddr >> 12) & 0xfff);