Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp6456878imd; Wed, 31 Oct 2018 12:01:18 -0700 (PDT) X-Google-Smtp-Source: AJdET5fgZN/gdthlqDtvXO6QscL7zsVSzsl1mOOeTCTMVUArrBLQ9RQZWHgZGlNHBIdMGWAr5z7j X-Received: by 2002:a63:b16:: with SMTP id 22mr4257843pgl.306.1541012478699; Wed, 31 Oct 2018 12:01:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541012478; cv=none; d=google.com; s=arc-20160816; b=YhzLEyxIPml2cO9qh9rhcyXcCHqd+W0NtNREZH4dQgn9t/3FKhPfzLNn7IuHvbeA0u LvfiLIh0idnDjrd9XSlQZOhJhp+alWKd9onC77eLyH1WLVUgG8TALdCTloD+fhQu/6he 8mrh0KjqRHiMw79TDGu84quyWeoB5Ikm3EnkULvSeZVPLEle5KIRBJ4qaezWEKQJhha2 5DRcml0HKavurlG2EhjM4WX+V13bFOPBtq6xtMr4ToV5hIzNhneDZzwpuM31FZw22mwS iyYVgn0M3FCpje0seNDHbsfjM4Zi0DOAbXBHcPtaL6oLTsnggMFnji3pS1zYxgB25w3h vx0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=YAt5x7/13a1b2fCZchEzB+5ghzacenT32S1QCZUJxNI=; b=yAoFwG/FxBi5OKBwHqWT8norukl4k7Nlbyo9raV7+FVwbplVT+Y3dLD6ViFMVGVJ0r 4vesvFE5SD6eBhEzvGJLhYVFtOegUq9tDgUuIi+52lfYYhlUuUCMMMtUHNmfVhHal0g2 Up8W1IazKbVVr4E7mjFDtxip8XyYz3tCs4kMaRS9oibStZf0Htc06DuhIrNqArAglqCO p+mlG/JhWCLbem0dpzXmMcG7vqFx2YUP0F+MfZBPYHa6H+N/iMQ1YEZx4IG+UANyE731 f59+lDNe1w5HMT8nkynNtDsxGGxZCLAZvL9kbOj8KX9BuVr8iANh+7Q+1zF1LAzuR83Q 1SPg== 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 z11-v6si27954448pgf.66.2018.10.31.12.01.03; Wed, 31 Oct 2018 12:01:18 -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 S1730007AbeKAC5P (ORCPT + 99 others); Wed, 31 Oct 2018 22:57:15 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:44754 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729974AbeKAC5P (ORCPT ); Wed, 31 Oct 2018 22:57:15 -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 B92F71596; Wed, 31 Oct 2018 10:58:11 -0700 (PDT) Received: from localhost (e105922-lin.cambridge.arm.com [10.1.197.25]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 39ACD3F6A8; Wed, 31 Oct 2018 10:58:11 -0700 (PDT) From: Punit Agrawal To: kvmarm@lists.cs.columbia.edu Cc: Punit Agrawal , marc.zyngier@arm.com, will.deacon@arm.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, suzuki.poulose@arm.com, punitagrawal@gmail.com, Christoffer Dall Subject: [PATCH v9 1/8] KVM: arm/arm64: Share common code in user_mem_abort() Date: Wed, 31 Oct 2018 17:57:38 +0000 Message-Id: <20181031175745.18650-2-punit.agrawal@arm.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181031175745.18650-1-punit.agrawal@arm.com> References: <20181031175745.18650-1-punit.agrawal@arm.com> MIME-Version: 1.0 X-ARM-No-Footer: FoSSMail Content-Transfer-Encoding: 8bit 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 Reviewed-by: Suzuki K Poulose Cc: Christoffer Dall Cc: Marc Zyngier --- virt/kvm/arm/mmu.c | 49 ++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 5eca48bdb1a6..59595207c5e1 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1475,7 +1475,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, unsigned long fault_status) { int ret; - bool write_fault, exec_fault, writable, hugetlb = false, force_pte = false; + bool write_fault, exec_fault, writable, force_pte = false; unsigned long mmu_seq; gfn_t gfn = fault_ipa >> PAGE_SHIFT; struct kvm *kvm = vcpu->kvm; @@ -1484,7 +1484,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); @@ -1504,10 +1504,16 @@ 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) { - hugetlb = true; + vma_pagesize = vma_kernel_pagesize(vma); + if (vma_pagesize == PMD_SIZE && !logging_active) { gfn = (fault_ipa & PMD_MASK) >> PAGE_SHIFT; } else { + /* + * Fallback to PTE if it's not one of the Stage 2 + * supported hugepage sizes + */ + vma_pagesize = PAGE_SIZE; + /* * Pages belonging to memslots that don't have the same * alignment for userspace and IPA cannot be mapped using @@ -1573,23 +1579,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) - hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa); + if (vma_pagesize == PAGE_SIZE && !force_pte) { + /* + * Only PMD_SIZE transparent hugepages(THP) are + * currently supported. This code will need to be + * updated to support other THP sizes. + */ + if (transparent_hugepage_adjust(&pfn, &fault_ipa)) + vma_pagesize = PMD_SIZE; + } + + if (writable) + kvm_set_pfn_dirty(pfn); - if (hugetlb) { + if (fault_status != FSC_PERM) + clean_dcache_guest_page(pfn, vma_pagesize); + + if (exec_fault) + invalidate_icache_guest_page(pfn, vma_pagesize); + + if (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)) @@ -1602,16 +1618,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.19.1