Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp5931931yba; Wed, 1 May 2019 02:49:24 -0700 (PDT) X-Google-Smtp-Source: APXvYqxm7geayVsgW5n1d5IILPz5Q9B03jowNbH7CvSWsaeqdAr13d19KSOxn4UiNlb2Mjp6MaRq X-Received: by 2002:a63:fb01:: with SMTP id o1mr62397540pgh.135.1556704164034; Wed, 01 May 2019 02:49:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556704164; cv=none; d=google.com; s=arc-20160816; b=eNNn+Iz7hk8P7pFLCObDiYSemaBx/OUjEnlHD/qloCgnO60PGMzw5iDa3A0oEhhH9D 8FIkKjLIvIFodrFfaeyi2Ls7bEHt+T6zS64SJ3uxqzfNNXB6xlwSs2czNxskifGl9x5h yENA+rWzN7DkD9MNynUo8hRTHeyda9XhAwGhlhnfR31/s+fblAcqjRWXcZwbRHSZyGRJ 7RySVCohPg71wOGDUMDga6joHqFLz6JRKsErBppuFo4l5nDjWl2C5adPk0vRGKnLyCDN KoZKDJcS+3sHdKGxgjLdhzETCrYvSHat0p6JIVjqqts5jLwem5I+u8erqIBWdSR3xzB3 P6Mw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=F0oYRNX+daEHbQbR+leU0/3fftUQOosr5FE2W9ZSnWg=; b=OjTvZmHoSIQBnHOmYrl425AichOhtwWLkZbFlcD2kVtggIGw0PHGv/yei+zj8WW8xN BVEeA5S1TkTqkbMRKvW/R4IrHQ3j6cyK+cBjlq2XlivmESRRM+QPa7jBuQzt/G5WjO7i NldVSoKINj5fGKqCyfXGgHZsXZM3YSG86c8Dr3nyJniW36+79ewOCN1C5inYvEpwuzqS 4nLrhZ+mNA35Kh/o/41quJkEL8jtbW6XS2YiaZ9TnfzeF8mVWuj0xOjnbGaYQd8qVuT6 WnJ6PDIrLITIKmsDrOU4avXqomTtUtluyfQFbdsv1fOhr6+Ro0rJ4zFHR7r6KHweKHuj 42bA== 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 l3si2173698pgh.108.2019.05.01.02.49.08; Wed, 01 May 2019 02:49:24 -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 S1726295AbfEAJsR (ORCPT + 99 others); Wed, 1 May 2019 05:48:17 -0400 Received: from szxga07-in.huawei.com ([45.249.212.35]:55028 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726193AbfEAJsR (ORCPT ); Wed, 1 May 2019 05:48:17 -0400 Received: from DGGEMS412-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id CCCB721BE0C0F1547E36; Wed, 1 May 2019 17:48:14 +0800 (CST) Received: from HGHY2Y004646261.china.huawei.com (10.184.12.158) by DGGEMS412-HUB.china.huawei.com (10.3.19.212) with Microsoft SMTP Server id 14.3.439.0; Wed, 1 May 2019 17:48:08 +0800 From: Zenghui Yu To: , , , CC: , , , , , , , , , , Zenghui Yu Subject: [PATCH 2/5] KVM: arm/arm64: Re-factor building the stage2 page table entries Date: Wed, 1 May 2019 09:44:24 +0000 Message-ID: <1556703867-22396-3-git-send-email-yuzenghui@huawei.com> X-Mailer: git-send-email 2.6.4.windows.1 In-Reply-To: <1556703867-22396-1-git-send-email-yuzenghui@huawei.com> References: <1556703867-22396-1-git-send-email-yuzenghui@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.184.12.158] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As we're going to support creating CONT_{PTE,PMD}_SIZE huge mappings in user_mem_abort(), the logic to check vma_pagesize and build page table entries will become longer, and looks almost the same (but actually they dont). Refactor this part to make it a bit cleaner. Add contiguous as a parameter of stage2_build_{pmd,pte}, to indicate if we're creating contiguous huge mappings. Signed-off-by: Zenghui Yu --- virt/kvm/arm/mmu.c | 81 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 24 deletions(-) diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c index 27c9583..cf8b035 100644 --- a/virt/kvm/arm/mmu.c +++ b/virt/kvm/arm/mmu.c @@ -1616,6 +1616,56 @@ static void kvm_send_hwpoison_signal(unsigned long address, send_sig_mceerr(BUS_MCEERR_AR, (void __user *)address, lsb, current); } +static pud_t stage2_build_pud(kvm_pfn_t pfn, pgprot_t mem_type, bool writable, + bool needs_exec) +{ + pud_t new_pud = kvm_pfn_pud(pfn, mem_type); + + new_pud = kvm_pud_mkhuge(new_pud); + if (writable) + new_pud = kvm_s2pud_mkwrite(new_pud); + + if (needs_exec) + new_pud = kvm_s2pud_mkexec(new_pud); + + return new_pud; +} + +static pmd_t stage2_build_pmd(kvm_pfn_t pfn, pgprot_t mem_type, bool writable, + bool needs_exec, bool contiguous) +{ + pmd_t new_pmd = kvm_pfn_pmd(pfn, mem_type); + + new_pmd = kvm_pmd_mkhuge(new_pmd); + if (writable) + new_pmd = kvm_s2pmd_mkwrite(new_pmd); + + if (needs_exec) + new_pmd = kvm_s2pmd_mkexec(new_pmd); + + if (contiguous) + new_pmd = kvm_s2pmd_mkcont(new_pmd); + + return new_pmd; +} + +static pte_t stage2_build_pte(kvm_pfn_t pfn, pgprot_t mem_type, bool writable, + bool needs_exec, bool contiguous) +{ + pte_t new_pte = kvm_pfn_pte(pfn, mem_type); + + if (writable) + new_pte = kvm_s2pte_mkwrite(new_pte); + + if (needs_exec) + new_pte = kvm_s2pte_mkexec(new_pte); + + if (contiguous) + new_pte = kvm_s2pte_mkcont(new_pte); + + return new_pte; +} + static bool fault_supports_stage2_huge_mapping(struct kvm_memory_slot *memslot, unsigned long hva, unsigned long map_size) @@ -1807,38 +1857,21 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, (fault_status == FSC_PERM && stage2_is_exec(kvm, fault_ipa)); if (vma_pagesize == PUD_SIZE) { - pud_t new_pud = kvm_pfn_pud(pfn, mem_type); - - new_pud = kvm_pud_mkhuge(new_pud); - if (writable) - new_pud = kvm_s2pud_mkwrite(new_pud); - - if (needs_exec) - new_pud = kvm_s2pud_mkexec(new_pud); + pud_t new_pud = stage2_build_pud(pfn, mem_type, writable, + needs_exec); ret = stage2_set_pud_huge(kvm, memcache, fault_ipa, &new_pud); } else if (vma_pagesize == PMD_SIZE) { - pmd_t new_pmd = kvm_pfn_pmd(pfn, mem_type); - - new_pmd = kvm_pmd_mkhuge(new_pmd); - - if (writable) - new_pmd = kvm_s2pmd_mkwrite(new_pmd); - - if (needs_exec) - new_pmd = kvm_s2pmd_mkexec(new_pmd); + pmd_t new_pmd = stage2_build_pmd(pfn, mem_type, writable, + needs_exec, false); ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd); } else { - pte_t new_pte = kvm_pfn_pte(pfn, mem_type); + pte_t new_pte = stage2_build_pte(pfn, mem_type, writable, + needs_exec, false); - if (writable) { - new_pte = kvm_s2pte_mkwrite(new_pte); + if (writable) mark_page_dirty(kvm, gfn); - } - - if (needs_exec) - new_pte = kvm_s2pte_mkexec(new_pte); ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, flags); } -- 1.8.3.1