Received: by 10.192.165.148 with SMTP id m20csp360709imm; Fri, 20 Apr 2018 07:58:14 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/ZT4KZANFpPzgNFh1y/NaUz4RA3XyFPzWLVuF/Pv5BwqdeKLTTPPMqdjpcjmyhrqaF1atL X-Received: by 10.99.9.66 with SMTP id 63mr8963725pgj.103.1524236293963; Fri, 20 Apr 2018 07:58:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524236293; cv=none; d=google.com; s=arc-20160816; b=mo6Ax9PTbew77IoKXde5WWsTaXj0/ImbLqBmRQuka5mTc+KI0FsK2YhA4OqQt4vuHM 7vh4tjbjMcJHeSBI1bNf5CmOKaQAkeSuW0EzJP+zT6cLm6NrL75wvlO8qh7G7B+z5MQK d1jA4ybweRuRL3DIdRwQ0xrWq0RCnBYnzzwtAN8DE1wvmF5KaDD4d0pMo+ZZQQvSloHL DroC7ctHK5txrW3LEjJO/9mCLhasnbfbH41tJyuMaTql+yzaIv5iIba5TZ3s4EPUN7Hs Xljdp6dGGrNCYZcvQQPmq1hl/6nevQJLovjALXjBtCvNXhsFnZ3J+oSH7j9/t2Z886NA 8faA== 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=4lFjrFij5UAJquhC2og5kkwNODRP6vbEkUvsqSEOY/0=; b=DF1EzIrp2EXOyskA9ZN6OIRERSIEp0UIwc8rpy4woXHZRyU0aeUCvUgYvnksA2LUQS wCHBjG+FcGOEbLi4FVHt1Wxze+srnIqlElYXais+mkEuFped7+e0m0IyaDjStFf+XTom 26OFMQs2FNTfN9OJ94WA/cWqGf39deCtVw1itIKLh7R9UHpWCA8f11w+NpbaQrrYesFa PxrNTjcmpWsMe9a8Eo9VC9J+sjbZrVdsE6UPI3BcB15wHWwmYQiFTC7SfjM6iEXUivgq LOAHnJhPihMBBCtUlr6uBeysMKdSC31NfJf+jGdNEEwQKZqXtgORz/1FoYs8pXyvE8r/ zeIA== 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 x6si4903350pgv.430.2018.04.20.07.57.59; Fri, 20 Apr 2018 07:58:13 -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 S1755420AbeDTOzS (ORCPT + 99 others); Fri, 20 Apr 2018 10:55:18 -0400 Received: from foss.arm.com ([217.140.101.70]:50120 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755224AbeDTOzR (ORCPT ); Fri, 20 Apr 2018 10:55: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 D0E8B80D; Fri, 20 Apr 2018 07:55:16 -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 759263F59D; Fri, 20 Apr 2018 07:55:16 -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 Subject: [PATCH 1/4] KVM: arm/arm64: Share common code in user_mem_abort() Date: Fri, 20 Apr 2018 15:54:06 +0100 Message-Id: <20180420145409.24485-2-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 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 | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 7f6a944db23d..db382c7c7cd7 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1428,7 +1428,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); @@ -1448,7 +1448,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 { @@ -1517,23 +1518,33 @@ 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 if other THP sizes are supported. + */ hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa); + 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) { 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)) @@ -1546,16 +1557,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.0