From patchwork Fri Aug 10 11:13:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Punit Agrawal X-Patchwork-Id: 10562619 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 40AB014C0 for ; Fri, 10 Aug 2018 11:13:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3049E2B4CD for ; Fri, 10 Aug 2018 11:13:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 23E1E2B7C5; Fri, 10 Aug 2018 11:13:29 +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=-2.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id BA2A72B4CD for ; Fri, 10 Aug 2018 11:13:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=2NO2g3TFqO3OUVXJ000vmcwKp7subgXGVhBJU2z9BQU=; b=Ikw EC9m6AD8CHIO+qaRJACnEaoB923Oc+DZBuiIB46hP+RsrVcx7PjMWRo9tMqTiWgZeBKVBaaDvAGuQ LSKLpIzUH14JqfeOd+ZSQAZ4H0IjIKFAoZMFfkVwBOqLq4MIZ78o8Lo+BABTsbQP9YECzIsygPGpp Khxziu4/lsAECut3fSYJic/fxtW2Xdl5tDCcZJgWhjuMr+VjXhT3B8qgPgA0oPNKoFeeQa+Sqe931 MdDOsBs/gtuKAnG/ilEbxsJ+OeJCQeYuKGyVcnI+/q82xTO1juYEqcxbZzItleMjtNn0dE5UuBNka BAUJHgpBv9c7QUTVtW0uyQeITp/igxw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fo5MD-0004oQ-Ha; Fri, 10 Aug 2018 11:13:25 +0000 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70] helo=foss.arm.com) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fo5MA-0004mW-Kv for linux-arm-kernel@lists.infradead.org; Fri, 10 Aug 2018 11:13:23 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BBCE57A9; Fri, 10 Aug 2018 04:13:10 -0700 (PDT) Received: from localhost (e105922-lin.emea.arm.com [10.4.13.28]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5F5203F5D4; Fri, 10 Aug 2018 04:13:10 -0700 (PDT) From: Punit Agrawal To: kvmarm@lists.cs.columbia.edu Subject: [PATCH] KVM: arm/arm64: Skip updating page table entry if no change Date: Fri, 10 Aug 2018 12:13:00 +0100 Message-Id: <20180810111300.17144-1-punit.agrawal@arm.com> X-Mailer: git-send-email 2.18.0 X-ARM-No-Footer: FoSSMail X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180810_041322_686463_DBED069A X-CRM114-Status: GOOD ( 16.32 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Suzuki Poulose , Marc Zyngier , Punit Agrawal , linux-kernel@vger.kernel.org, Christoffer Dall , linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Contention on updating a page table entry by a large number of vcpus can lead to duplicate work when handling stage 2 page faults. As the page table update follows the break-before-make requirement of the architecture, it can lead to repeated refaults due to clearing the entry and flushing the tlbs. This problem is more likely when - * there are large number of vcpus * the mapping is large block mapping such as when using PMD hugepages (512MB) with 64k pages. Fix this by skipping the page table update if there is no change in the entry being updated. Signed-off-by: Punit Agrawal Cc: Marc Zyngier Cc: Christoffer Dall Cc: Suzuki Poulose Reviewed-by: Suzuki K Poulose Acked-by: Christoffer Dall --- Hi, This problem was reported by a user when testing PUD hugepages. During VM restore when all threads are running cpu intensive workload, the refauting was causing the VM to not make any forward progress. This patch fixes the problem for PMD and PTE page fault handling. Thanks, Punit Change-Id: I04c9aa8b9fbada47deb1a171c9959f400a0d2a21 --- virt/kvm/arm/mmu.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 1d90d79706bd..a66a5441ca2f 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1027,6 +1027,18 @@ static int stage2_set_pmd_huge(struct kvm *kvm, struct kvm_mmu_memory_cache VM_BUG_ON(pmd_present(*pmd) && pmd_pfn(*pmd) != pmd_pfn(*new_pmd)); old_pmd = *pmd; + /* + * Multiple vcpus faulting on the same PMD entry, can lead to + * them sequentially updating the PMD with the same + * value. Following the break-before-make (pmd_clear() + * followed by tlb_flush()) process can hinder forward + * progress due to refaults generated on missing translations. + * + * Skip updating the page table if the entry is unchanged. + */ + if (pmd_val(old_pmd) == pmd_val(*new_pmd)) + return 0; + if (pmd_present(old_pmd)) { pmd_clear(pmd); kvm_tlb_flush_vmid_ipa(kvm, addr); @@ -1101,6 +1113,10 @@ static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache, /* Create 2nd stage page table mapping - Level 3 */ old_pte = *pte; + /* Skip page table update if there is no change */ + if (pte_val(old_pte) == pte_val(*new_pte)) + return 0; + if (pte_present(old_pte)) { kvm_set_pte(pte, __pte(0)); kvm_tlb_flush_vmid_ipa(kvm, addr);