Received: by 10.192.165.148 with SMTP id m20csp359882imm; Fri, 20 Apr 2018 07:57:25 -0700 (PDT) X-Google-Smtp-Source: AIpwx48fAau4c88C+12kGjQvF0XFHknKvzuKRj45CjaFRr6LhhRtE6CrfgeJ9+ec+WjRobk1afGc X-Received: by 10.98.200.12 with SMTP id z12mr2108820pff.187.1524236245269; Fri, 20 Apr 2018 07:57:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524236245; cv=none; d=google.com; s=arc-20160816; b=keOM4n/zmZ7Wi/zlNfZsNvC8JuJ+kU4EhYJUyUKseYbF9gBfMsxeTdqrP0KcTIQZjz by7XytiqCrglDYzZ6/OkitfGixpiGnGh4Skf84QBym/p0tPzjs1p4Fg3y3+Q4M3zRg97 jmNs5vHYUKYhWYXa5fm2AZFy2EekS+BInMcbHlfhmPwFIAN2I0aenhFRuKvNCGN4d9Yp NAoetv/dbl1UxGGDKYQ4Cngf70vPwCHjRHcU4NANIQuwdeyODoEKnYf95GZKY/fg7Dn/ QYShp6OiIGLJJ1M34+CJ7mvFyLhILXN3vxRmzQMJyYWfuiJGUqo3yavINVvDOEelGt5H K8lQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=dvBB6AWpATFVqkEMGEZaf8wVRAGCij0U1lmLJvnQCps=; b=Sv3NAiFAn3cnL3tig7u3PqpTpQ2LICu+7069TQHmiu39DFZH/YSgohWNkT0fmUNbpw 0mGwuHMp1JkHzpYT+IU3LNJPlfj2tKDydZ4MknxxBFbJvZDvLnOJWfa/N9GURLpiODyk FeYz3Vl9oVNXTjgHvcBcmpJBO+WdWWB6yaUWHmuZJ6JpKZHyAEEM80exJTyUvm8GOJKe Vnh/HpsH6SEoKf9Zpfic2PYxImDk4VdT+dvHp+P9CkQtZL1MjQMp2KmlF9WfeOcKf/mc XMjoMg2PQNs4lS38w+9WiqrA40v41+HFrgUVrdz5pmiLq+unQZCXL94y8PTslmeSueAo +dSw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z61-v6si6006051plb.200.2018.04.20.07.57.11; Fri, 20 Apr 2018 07:57:25 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755522AbeDTOzi (ORCPT + 99 others); Fri, 20 Apr 2018 10:55:38 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:50146 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755302AbeDTOzg (ORCPT ); Fri, 20 Apr 2018 10:55:36 -0400 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 A8CB580D; Fri, 20 Apr 2018 07:55:36 -0700 (PDT) Received: from localhost (e105922-lin.cambridge.arm.com [10.1.207.29]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2AC1A3F59D; Fri, 20 Apr 2018 07:55:36 -0700 (PDT) From: Punit Agrawal To: kvmarm@lists.cs.columbia.edu Cc: Punit Agrawal , linux-arm-kernel@lists.infradead.org, marc.zyngier@arm.com, christoffer.dall@arm.com, linux-kernel@vger.kernel.org, suzuki.poulose@arm.com, Russell King , Catalin Marinas , Will Deacon Subject: [PATCH 3/4] KVM: arm64: Support dirty page tracking for PUD hugepages Date: Fri, 20 Apr 2018 15:54:08 +0100 Message-Id: <20180420145409.24485-4-punit.agrawal@arm.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180420145409.24485-1-punit.agrawal@arm.com> References: <20180420145409.24485-1-punit.agrawal@arm.com> X-ARM-No-Footer: FoSSMail Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In preparation for creating PUD hugepages at stage 2, add support for write protecting PUD hugepages when they are encountered. Write protecting guest tables is used to track dirty pages when migrating VMs. Also, provide trivial implementations of required kvm_s2pud_* helpers to allow sharing of code with arm32. Signed-off-by: Punit Agrawal Cc: Christoffer Dall Cc: Marc Zyngier Cc: Russell King Cc: Catalin Marinas Cc: Will Deacon --- arch/arm/include/asm/kvm_mmu.h | 16 ++++++++++++++++ arch/arm64/include/asm/kvm_mmu.h | 10 ++++++++++ virt/kvm/arm/mmu.c | 9 ++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index 5907a81ad5c1..224c22c0a69c 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h @@ -80,6 +80,22 @@ void kvm_clear_hyp_idmap(void); #define kvm_pmd_mkhuge(pmd) pmd_mkhuge(pmd) +/* + * The following kvm_*pud*() functionas are provided strictly to allow + * sharing code with arm64. They should never be called in practice. + */ +static inline void kvm_set_s2pud_readonly(pud_t *pud) +{ + BUG(); +} + +static inline bool kvm_s2pud_readonly(pud_t *pud) +{ + BUG(); + return false; +} + + static inline void kvm_set_pmd(pmd_t *pmd, pmd_t new_pmd) { *pmd = new_pmd; diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index d962508ce4b3..f440cf216a23 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -240,6 +240,16 @@ static inline bool kvm_s2pmd_exec(pmd_t *pmdp) return !(READ_ONCE(pmd_val(*pmdp)) & PMD_S2_XN); } +static inline void kvm_set_s2pud_readonly(pud_t *pudp) +{ + kvm_set_s2pte_readonly((pte_t *)pudp); +} + +static inline bool kvm_s2pud_readonly(pud_t *pudp) +{ + return kvm_s2pte_readonly((pte_t *)pudp); +} + static inline bool kvm_page_empty(void *ptr) { struct page *ptr_page = virt_to_page(ptr); diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index f72ae7a6dea0..5f53909da90e 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1286,9 +1286,12 @@ static void stage2_wp_puds(pgd_t *pgd, phys_addr_t addr, phys_addr_t end) do { next = stage2_pud_addr_end(addr, end); if (!stage2_pud_none(*pud)) { - /* TODO:PUD not supported, revisit later if supported */ - BUG_ON(stage2_pud_huge(*pud)); - stage2_wp_pmds(pud, addr, next); + if (stage2_pud_huge(*pud)) { + if (!kvm_s2pud_readonly(pud)) + kvm_set_s2pud_readonly(pud); + } else { + stage2_wp_pmds(pud, addr, next); + } } } while (pud++, addr = next, addr != end); } -- 2.17.0