From patchwork Tue Apr 10 12:48:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 896697 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40L6vY5zFqz9s0n for ; Tue, 10 Apr 2018 23:09:29 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="EmHbJTQ0"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 40L6vY3pZBzF2D4 for ; Tue, 10 Apr 2018 23:09:29 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="EmHbJTQ0"; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:400e:c01::241; helo=mail-pl0-x241.google.com; envelope-from=npiggin@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="EmHbJTQ0"; dkim-atps=neutral Received: from mail-pl0-x241.google.com (mail-pl0-x241.google.com [IPv6:2607:f8b0:400e:c01::241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 40L6S66qcGzF1ys for ; Tue, 10 Apr 2018 22:49:10 +1000 (AEST) Received: by mail-pl0-x241.google.com with SMTP id v5-v6so7431425plo.4 for ; Tue, 10 Apr 2018 05:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kt6s5OIHB5AxXxWa6R0dBucBB3m+NQERaPJJzWIT/h0=; b=EmHbJTQ0K70bPMpDEGhrzgHGUvviU9H2z4J7Hu/pwIriIup809vIS+R+K3F7MrPbws +wYdcWh893qsNzNtUBZOiRfTFcj2fy7oJGF9c9iyR14t598G1RCTDiNu1q+GEdRkmO/B oYQlQKgsuIzCoWNB1bnRrwki9scwNwypCcjXiyndFrYLregYjIRf/wAVE+dmy8ccP2Mj zRay6VnROp9uX/JYL2gAkTSTcXvxtciYMA3O8YzN2Upk2hMLHMmx665aQS+nU4zuIE3m G3dtZsn8QlmbS5C+Wkdi4XrwlZ/PN/IpFUqnDIoDHURaExrkvVxBRp1/SmksgsxOsL2Q zewA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kt6s5OIHB5AxXxWa6R0dBucBB3m+NQERaPJJzWIT/h0=; b=Kf1pqfXR0OibErToXyVVAavUFYvptFG1OeY3rC9L0vM8HDV1/575gMRlhyScxWMwuo khHT4OkWNo5B/GglW2IN6QHFm6C0vOd0+XzibPaAVTegc7larRCKkaMznxzIsj65tzRi 4r1+p159kSxv433XB7pHlhfWmmkcqDbXWDenf1xkDzXTIKinvPtT7WldlwW9RFEy4aq6 jWOVT5EPaJ/flf38aiMFSNvKEzKkkIQWyL9EdcQhH8MekqdiKHEAOUjaIDr0sAUjsxgK CLdUnnc9fTNPZM9+/HDX87F4PNikE3ksBhIsxjEjt9OjbGKFlgeAWONIuxuNlGxyRHoN xDVA== X-Gm-Message-State: ALQs6tCG6sc+5UJJRo3xu2BBO+e6N9frpxqDMcGFrnPd6XZMa3GaAdCK l2Q6pxVuOON4sXpy2t5P0UUsMw== X-Google-Smtp-Source: AIpwx49wrQ9eN9dKMuAgkVIXquPFzubrbwUg4ll63AMY5/QTmmrtBLzp+ZtaeRi465iNFhE3ZRTKjw== X-Received: by 2002:a17:902:464:: with SMTP id 91-v6mr318126ple.126.1523364549426; Tue, 10 Apr 2018 05:49:09 -0700 (PDT) Received: from roar.au.ibm.com (59-102-70-78.tpgi.com.au. [59.102.70.78]) by smtp.gmail.com with ESMTPSA id j20sm6037529pfa.149.2018.04.10.05.49.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 10 Apr 2018 05:49:08 -0700 (PDT) From: Nicholas Piggin To: kvm-ppc@vger.kernel.org Subject: [RFC PATCH 5/5] KVM: PPC: Book3S HV: Radix do not clear partition scoped page table when page fault races with other vCPUs. Date: Tue, 10 Apr 2018 22:48:42 +1000 Message-Id: <20180410124842.30184-6-npiggin@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180410124842.30184-1-npiggin@gmail.com> References: <20180410124842.30184-1-npiggin@gmail.com> X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org, Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" KVM with an SMP radix guest can get into storms of page faults and tlbies due to the partition scopd page tables being invalidated and TLB flushed if they were found to race with another page fault that set them up. This tends to cause vCPUs to pile up if several hit common addresses, then page faults will get serialized on common locks, and then they each invalidate the previous entry and it's long enough before installing the new entry that will cause more CPUs to hit page faults and they will invalidate that new entry. There doesn't seem to be a need to invalidate in the case of an existing entry. This solves the tlbie storms. Signed-off-by: Nicholas Piggin --- arch/powerpc/kvm/book3s_64_mmu_radix.c | 39 +++++++++++++++----------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c index dab6b622011c..4af177d24f6c 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_radix.c +++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c @@ -243,6 +243,7 @@ static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa, pmd = pmd_offset(pud, gpa); if (pmd_is_leaf(*pmd)) { unsigned long lgpa = gpa & PMD_MASK; + pte_t old_pte = *pmdp_ptep(pmd); /* * If we raced with another CPU which has just put @@ -252,18 +253,17 @@ static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa, ret = -EAGAIN; goto out_unlock; } - /* Valid 2MB page here already, remove it */ - old = kvmppc_radix_update_pte(kvm, pmdp_ptep(pmd), - ~0UL, 0, lgpa, PMD_SHIFT); - kvmppc_radix_tlbie_page(kvm, lgpa, PMD_SHIFT); - if (old & _PAGE_DIRTY) { - unsigned long gfn = lgpa >> PAGE_SHIFT; - struct kvm_memory_slot *memslot; - memslot = gfn_to_memslot(kvm, gfn); - if (memslot && memslot->dirty_bitmap) - kvmppc_update_dirty_map(memslot, - gfn, PMD_SIZE); + WARN_ON_ONCE(pte_pfn(old_pte) != pte_pfn(pte)); + if (pte_val(old_pte) == pte_val(pte)) { + ret = -EAGAIN; + goto out_unlock; } + + /* Valid 2MB page here already, remove it */ + kvmppc_radix_update_pte(kvm, pmdp_ptep(pmd), + 0, pte_val(pte), lgpa, PMD_SHIFT); + ret = 0; + goto out_unlock; } else if (level == 1 && !pmd_none(*pmd)) { /* * There's a page table page here, but we wanted @@ -274,6 +274,8 @@ static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa, goto out_unlock; } if (level == 0) { + pte_t old_pte; + if (pmd_none(*pmd)) { if (!new_ptep) goto out_unlock; @@ -281,13 +283,16 @@ static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa, new_ptep = NULL; } ptep = pte_offset_kernel(pmd, gpa); - if (pte_present(*ptep)) { + old_pte = *ptep; + if (pte_present(old_pte)) { /* PTE was previously valid, so invalidate it */ - old = kvmppc_radix_update_pte(kvm, ptep, _PAGE_PRESENT, - 0, gpa, 0); - kvmppc_radix_tlbie_page(kvm, gpa, 0); - if (old & _PAGE_DIRTY) - mark_page_dirty(kvm, gpa >> PAGE_SHIFT); + WARN_ON_ONCE(pte_pfn(old_pte) != pte_pfn(pte)); + if (pte_val(old_pte) == pte_val(pte)) { + ret = -EAGAIN; + goto out_unlock; + } + kvmppc_radix_update_pte(kvm, ptep, 0, + pte_val(pte), gpa, 0); } kvmppc_radix_set_pte_at(kvm, gpa, ptep, pte); } else {