Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp2201562imm; Mon, 16 Jul 2018 04:10:33 -0700 (PDT) X-Google-Smtp-Source: AAOMgpf42Tp450cgdWbi+hx3K1Bq8Ot7gOtjG5lEBOVSzswZmDK0CkSf6hGXh3I6QfX4iI4ZhAQa X-Received: by 2002:a65:660a:: with SMTP id w10-v6mr14801990pgv.366.1531739433773; Mon, 16 Jul 2018 04:10:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531739433; cv=none; d=google.com; s=arc-20160816; b=IB8b7w5HQ65hxbEFyUnM3jykPwiXjMymKSRHTsrspMd40ZF+D3Jt0Xs9N5X0Tpo6E4 VD/ztWLC9VnH9M4eeUOCOcJthRG5Ar9xNxl27fGkEBA20JD7BIGKJrevv/AHyRyzpYBu 3EBmVnQ4qcHqWzxCN6/Fv1Ubzmq1wQXxvbV4Bm1zJSl2JhP6OcRw2gN/xmQ/6rECbT10 cBbpV+7LH1CosAqJWqJaphpgCbKP3BJiE4u+AbsM30kND8jmfk9w+jp0NPvnxZ7UYV92 7IFfhKYgqxcmg0Z2MdlVSaYPY/irkfMMD3cC9MjCY2iSIAQoIZcRt0sm4WYuNd+6eJIl lltg== 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=RepIn9yKay7MtUtw9vSGdoGXG5p4O3P7gmcNphfYC8g=; b=D096ncxigeEndFovahevL5T/+z+CS2RqbcVtF7VL+r2gavxSBY9yPPtegOS953PQHP n4meEE2rUUPOztcdRFFuC6qijoKTxWZ+CQ/puJkFjfEOVbTonkQZ/wLqf37/7WJP3RBl Mb7Q7borntkoDkAgu4PKK/GqwDnaCFLMZ90LBpFTRinZIWqQ288NPxI4PB9x9qljsWGK EQd0icmKsjdICj7/5qdBBax1y1sDk2ns1IJAqabTdfODelGh5IM1CEpFnVHeu8DBwwr5 sOwv+g3sY661S6BryfbNGUK5NzWK/BibHKU6tXkBInhviqeeL1HyWrfyhyahh/08fNh4 QC+A== 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 e9-v6si28732352pgu.636.2018.07.16.04.10.18; Mon, 16 Jul 2018 04:10:33 -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 S1730008AbeGPLgR (ORCPT + 99 others); Mon, 16 Jul 2018 07:36:17 -0400 Received: from foss.arm.com ([217.140.101.70]:57090 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729938AbeGPLgR (ORCPT ); Mon, 16 Jul 2018 07:36:17 -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 D1C4318A; Mon, 16 Jul 2018 04:09:22 -0700 (PDT) Received: from localhost (e105922-lin.cambridge.arm.com [10.1.206.33]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 531C33F589; Mon, 16 Jul 2018 04:09:22 -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, will.deacon@arm.com Subject: [PATCH v6 1/8] KVM: arm/arm64: Share common code in user_mem_abort() Date: Mon, 16 Jul 2018 12:08:50 +0100 Message-Id: <20180716110857.19310-2-punit.agrawal@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180716110857.19310-1-punit.agrawal@arm.com> References: <20180716110857.19310-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 The code for operations such as marking the pfn as dirty, and dcache/icache maintenance during stage 2 fault handling is duplicated between normal pages and PMD hugepages. Instead of creating another copy of the operations when we introduce PUD hugepages, let's share them across the different pagesizes. Signed-off-by: Punit Agrawal Cc: Christoffer Dall Cc: Marc Zyngier --- virt/kvm/arm/mmu.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 1d90d79706bd..1c8d407a92ce 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1431,7 +1431,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, kvm_pfn_t pfn; pgprot_t mem_type = PAGE_S2; bool logging_active = memslot_is_logging(memslot); - unsigned long flags = 0; + unsigned long vma_pagesize, flags = 0; write_fault = kvm_is_write_fault(vcpu); exec_fault = kvm_vcpu_trap_is_iabt(vcpu); @@ -1451,7 +1451,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, return -EFAULT; } - if (vma_kernel_pagesize(vma) == PMD_SIZE && !logging_active) { + vma_pagesize = vma_kernel_pagesize(vma); + if (vma_pagesize == PMD_SIZE && !logging_active) { hugetlb = true; gfn = (fault_ipa & PMD_MASK) >> PAGE_SHIFT; } else { @@ -1520,23 +1521,34 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, if (mmu_notifier_retry(kvm, mmu_seq)) goto out_unlock; - if (!hugetlb && !force_pte) + if (!hugetlb && !force_pte) { + /* + * Only PMD_SIZE transparent hugepages(THP) are + * currently supported. This code will need to be + * updated to support other THP sizes. + */ hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa); + if (hugetlb) + vma_pagesize = PMD_SIZE; + } + + if (writable) + kvm_set_pfn_dirty(pfn); + + if (fault_status != FSC_PERM) + clean_dcache_guest_page(pfn, vma_pagesize); + + if (exec_fault) + invalidate_icache_guest_page(pfn, vma_pagesize); - if (hugetlb) { + if (hugetlb && vma_pagesize == PMD_SIZE) { pmd_t new_pmd = pfn_pmd(pfn, mem_type); new_pmd = pmd_mkhuge(new_pmd); - if (writable) { + if (writable) new_pmd = kvm_s2pmd_mkwrite(new_pmd); - kvm_set_pfn_dirty(pfn); - } - - if (fault_status != FSC_PERM) - clean_dcache_guest_page(pfn, PMD_SIZE); if (exec_fault) { new_pmd = kvm_s2pmd_mkexec(new_pmd); - invalidate_icache_guest_page(pfn, PMD_SIZE); } else if (fault_status == FSC_PERM) { /* Preserve execute if XN was already cleared */ if (stage2_is_exec(kvm, fault_ipa)) @@ -1549,16 +1561,11 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, if (writable) { new_pte = kvm_s2pte_mkwrite(new_pte); - kvm_set_pfn_dirty(pfn); mark_page_dirty(kvm, gfn); } - if (fault_status != FSC_PERM) - clean_dcache_guest_page(pfn, PAGE_SIZE); - if (exec_fault) { new_pte = kvm_s2pte_mkexec(new_pte); - invalidate_icache_guest_page(pfn, PAGE_SIZE); } else if (fault_status == FSC_PERM) { /* Preserve execute if XN was already cleared */ if (stage2_is_exec(kvm, fault_ipa)) -- 2.17.1