Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp3645348pxu; Mon, 30 Nov 2020 07:28:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJwNngUQNpd9jGErHYClT5UWWAGJAgbB0Oy4x9xV1KCdVGSt0bmVsopB0WmT7HeFKaC1qG93 X-Received: by 2002:a50:fd8d:: with SMTP id o13mr22753855edt.248.1606750095597; Mon, 30 Nov 2020 07:28:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606750095; cv=none; d=google.com; s=arc-20160816; b=PO7AnUKAp6ZnZFOTdwc5U2r2Vn76qNszsUzi+F2sUvvuDlRnwyHrLq6d65vQxhqjKA wCVVkhPOP0+10P6YwDLqf1OZ4y7zJuuxQ6TTNGkBWq9YzNLt4x+6B73ati8HGGsN8Tmw JfOQ43cwR57rIVo+2c1UjdvKINX+bPs7viwlKrw5Z31MhWT265HwHaGZgSoPZxxZ7Nvu RiaYszpXKzK3We50/+ykyUd3elvIiEhI9FoXgulumiXaSXhMw7yhC5NAJftWP9yr/N6k oEEP16rWvQq5BOiSmyt3h9K0Btv/xYKxHoQ+V7kpOg+yp4qjMUmjmHxeb7JQhplAliib Dqlw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-language:content-transfer-encoding :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=ag4v/ReeyFZcZR+oB1hTpt594xsuWApSBI23fNYS6Xo=; b=WCI7oIfUgO0OTN7MOuvaNSRM+Zh58YRuCwLce/w3SN3E+29oGfNtW0C3Au8nXntYob FPcLlPwXcjx/h6jWyzN4Vm3S8pnUN13KnfEPlFej7rQk0MgumO0Qyyw7eD+Wjh+8zXMv /WiBcI5Fr8HhDIcgBEJ7oiyEd4HvDb/X6ip2aKcIBhc3hzhaar4K9WOsAxF4jHkn4UaA qZwJlNd57OsBRbH4RD0joumQUx+9MddoQSTdce1E6LyvZCBUPbl25zl+nQ7Kg2EVYSvV f9H0t4DQR5X3YlHZasV5DDCQbcU9VxcEbnCtxqN13Po6Tw0vGWOeqP47qzcS+bI+zZGI W6mw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g10si11614677edy.201.2020.11.30.07.27.49; Mon, 30 Nov 2020 07:28:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727076AbgK3PZU (ORCPT + 99 others); Mon, 30 Nov 2020 10:25:20 -0500 Received: from szxga02-in.huawei.com ([45.249.212.188]:2514 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726663AbgK3PZU (ORCPT ); Mon, 30 Nov 2020 10:25:20 -0500 Received: from dggeme714-chm.china.huawei.com (unknown [172.30.72.55]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4Cl8Cc3cd9zQmCs; Mon, 30 Nov 2020 23:24:12 +0800 (CST) Received: from [10.174.186.123] (10.174.186.123) by dggeme714-chm.china.huawei.com (10.1.199.110) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1913.5; Mon, 30 Nov 2020 23:24:33 +0800 Subject: Re: [RFC PATCH 2/3] KVM: arm64: Fix handling of merging tables into a block entry To: Will Deacon CC: , , Marc Zyngier , Catalin Marinas , James Morse , Julien Thierry , Suzuki K Poulose , Gavin Shan , Quentin Perret , , , , , , , References: <20201130121847.91808-1-wangyanan55@huawei.com> <20201130121847.91808-3-wangyanan55@huawei.com> <20201130133421.GB24837@willie-the-truck> From: "wangyanan (Y)" Message-ID: <67e9e393-1836-eca7-4235-6f4a19fed652@huawei.com> Date: Mon, 30 Nov 2020 23:24:19 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0 MIME-Version: 1.0 In-Reply-To: <20201130133421.GB24837@willie-the-truck> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Originating-IP: [10.174.186.123] X-ClientProxiedBy: dggeme714-chm.china.huawei.com (10.1.199.110) To dggeme714-chm.china.huawei.com (10.1.199.110) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2020/11/30 21:34, Will Deacon wrote: > On Mon, Nov 30, 2020 at 08:18:46PM +0800, Yanan Wang wrote: >> In dirty logging case(logging_active == True), we need to collapse a block >> entry into a table if necessary. After dirty logging is canceled, when merging >> tables back into a block entry, we should not only free the non-huge page >> tables but also unmap the non-huge mapping for the block. Without the unmap, >> inconsistent TLB entries for the pages in the the block will be created. >> >> We could also use unmap_stage2_range API to unmap the non-huge mapping, >> but this could potentially free the upper level page-table page which >> will be useful later. >> >> Signed-off-by: Yanan Wang >> --- >> arch/arm64/kvm/hyp/pgtable.c | 15 +++++++++++++-- >> 1 file changed, 13 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c >> index 696b6aa83faf..fec8dc9f2baa 100644 >> --- a/arch/arm64/kvm/hyp/pgtable.c >> +++ b/arch/arm64/kvm/hyp/pgtable.c >> @@ -500,6 +500,9 @@ static int stage2_map_walk_table_pre(u64 addr, u64 end, u32 level, >> return 0; >> } >> >> +static void stage2_flush_dcache(void *addr, u64 size); >> +static bool stage2_pte_cacheable(kvm_pte_t pte); >> + >> static int stage2_map_walk_leaf(u64 addr, u64 end, u32 level, kvm_pte_t *ptep, >> struct stage2_map_data *data) >> { >> @@ -507,9 +510,17 @@ static int stage2_map_walk_leaf(u64 addr, u64 end, u32 level, kvm_pte_t *ptep, >> struct page *page = virt_to_page(ptep); >> >> if (data->anchor) { >> - if (kvm_pte_valid(pte)) >> + if (kvm_pte_valid(pte)) { >> + kvm_set_invalid_pte(ptep); >> + kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, data->mmu, >> + addr, level); >> put_page(page); > This doesn't make sense to me: the page-table pages we're walking when the > anchor is set are not accessible to the hardware walker because we unhooked > the entire sub-table in stage2_map_walk_table_pre(), which has the necessary > TLB invalidation. > > Are you seeing a problem in practice here? Yes, I indeed find a problem in practice. When the migration was cancelled, a TLB conflic abort  was found in guest. This problem is fixed before rework of the page table code, you can have a look in the following two links: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3c3736cd32bf5197aed1410ae826d2d254a5b277 https://lists.cs.columbia.edu/pipermail/kvmarm/2019-March/035031.html >> + if (stage2_pte_cacheable(pte)) >> + stage2_flush_dcache(kvm_pte_follow(pte), >> + kvm_granule_size(level)); > I don't understand the need for the flush either, as we're just coalescing > existing entries into a larger block mapping. In my opinion, after unmapping, it is necessary to ensure the cache coherency, because it is unknown whether the future mapping memory attribute is changed or not (cacheable -> non_cacheable) theoretically. > Will > .