Received: by 10.213.65.68 with SMTP id h4csp152342imn; Wed, 28 Mar 2018 00:27:37 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/C1cdP9tKDFAPY7Elev19lILFBRYYyzH+FmtXBrJXQ5HybXnvFOUNLlVUOQhcFFxpuH+01 X-Received: by 10.99.107.72 with SMTP id g69mr1739061pgc.337.1522222057746; Wed, 28 Mar 2018 00:27:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522222057; cv=none; d=google.com; s=arc-20160816; b=IsaIMg8g5qWLBP5btpFikc05lpZH01mgxLUPYaVkdG5r60hCgLAZCLEIGpyAme8HHM x+MBGcuKH/GORfcHx+kxlxRc47yMXCejnq3QsLj8/O4O1y7g1IDi6z3mfvKWb3svW+hu xtF6pd00TUQj4CpmK0VMei35IpMD3ydbdqYPgyRCaa3016XAqDmFAhqC51TqawFMG1B7 ztljoX3U19m1U1+Ly1P3GPTRMrIqsYaQpNmKV1TS7P4Hhsajo/Dy4W1D6QxSzBslHUki dYqDsYzTzsCeMEKBAbO+tuXS7xhluowFmHaOLPCnpYnY5OVDXzxfU/c8cbAaoz7nUJ/f Jtqg== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dmarc-filter :dkim-signature:dkim-signature:arc-authentication-results; bh=kc4Mg7cFL08kN7wL67ohQiMKdJLsH6tumkURH4eykPU=; b=T5Vju59QgGcvgSIetHEM85RAHM5+zAan4WEDHR9wsVVvd/uiGOCzBW6XFfdsxD9GKn HlGpwB4VS/FCp5QYrVC6KL5FLL0kHgXy2dCdIon7zN1eWnFuYx8FXDFzno51M3mUtGGe 8PTMU66mSBVPqgkcciwTflUOhlg5GuqyZU1vjaiEtiX1NZr8ELY+yYNdoWlh9dit1cz4 ksPjdG8yJruxlrqQu+lU/Jc9EBKLqVFsgWVO5OXSi74jM0X5LoVk5HGGzGYi6f362UEU lX1Rbk0LEhOjKmW1PqId/8NIJBna1GH5/kafXIVZdDciQgjrZbG8T7Dndvj3cbM2Bz39 xEXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=Rr5htpRk; dkim=pass header.i=@codeaurora.org header.s=default header.b=lEO9zHg7; 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 e1-v6si3155282pls.368.2018.03.28.00.27.23; Wed, 28 Mar 2018 00:27:37 -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; dkim=pass header.i=@codeaurora.org header.s=default header.b=Rr5htpRk; dkim=pass header.i=@codeaurora.org header.s=default header.b=lEO9zHg7; 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 S1751182AbeC1G7k (ORCPT + 99 others); Wed, 28 Mar 2018 02:59:40 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:55612 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750733AbeC1G7h (ORCPT ); Wed, 28 Mar 2018 02:59:37 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 5F93D60C54; Wed, 28 Mar 2018 06:59:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1522220377; bh=gTIoAForX0OUxYQNuNhPBPkiU1Wqx5UH/oU8gTKN0Hs=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Rr5htpRkQ/DlPPTg0tOFFKauQnWZFGdaKHfKVOTSMVxbIZ0P8GAIqYio+lECKQQ9z bmtHyl/bFbRwVOdrHB/6A3Z6zX7UsxtrkVRpkcDF33Q19XwY2MS+z7YeI1SCDcbORZ OU1fYg9wlKXXrpAQWF9vx39LqRHa0My7I7fcEpgc= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from [10.204.79.109] (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: cpandya@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 3013260588; Wed, 28 Mar 2018 06:59:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1522220376; bh=gTIoAForX0OUxYQNuNhPBPkiU1Wqx5UH/oU8gTKN0Hs=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=lEO9zHg7q1ljtmDqHWMrEEEw+VPHgFB3o2yTByFWc4lgBZfTfkqI3MBDGMvCAWbpE sgjJLxt3v9l06qv9bjtEJwfmQiDdtoW82G9Amzxo1rojS6hwkSDjGAgrk05pDV2mwl HP539zwH85F3UgXoSgU8diyvvocCHmRDExIuLeLg= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 3013260588 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=cpandya@codeaurora.org Subject: Re: [PATCH v5 3/4] arm64: Implement page table free interfaces To: Will Deacon Cc: catalin.marinas@arm.com, mark.rutland@arm.com, toshi.kani@hpe.com, arnd@arndb.de, ard.biesheuvel@linaro.org, marc.zyngier@arm.com, james.morse@arm.com, kristina.martsenko@arm.com, takahiro.akashi@linaro.org, gregkh@linuxfoundation.org, tglx@linutronix.de, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, akpm@linux-foundation.org References: <1522157100-16879-1-git-send-email-cpandya@codeaurora.org> <1522157100-16879-4-git-send-email-cpandya@codeaurora.org> <20180327180048.GJ18435@arm.com> From: Chintan Pandya Message-ID: <3a9610af-c35d-2624-87a6-71f893740fa4@codeaurora.org> Date: Wed, 28 Mar 2018 12:29:25 +0530 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180327180048.GJ18435@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 3/27/2018 11:30 PM, Will Deacon wrote: > Hi Chintan, Hi Will, > > On Tue, Mar 27, 2018 at 06:54:59PM +0530, Chintan Pandya wrote: >> Implement pud_free_pmd_page() and pmd_free_pte_page(). >> >> Implementation requires, >> 1) Freeing of the un-used next level page tables >> 2) Clearing off the current pud/pmd entry >> 3) Invalidate TLB which could have previously >> valid but not stale entry >> >> Signed-off-by: Chintan Pandya >> --- >> V4->V5: >> - Using __flush_tlb_kernel_pgtable instead of >> flush_tlb_kernel_range >> >> >> arch/arm64/mm/mmu.c | 33 +++++++++++++++++++++++++++++++-- >> 1 file changed, 31 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c >> index da98828..3552c7a 100644 >> --- a/arch/arm64/mm/mmu.c >> +++ b/arch/arm64/mm/mmu.c >> @@ -45,6 +45,7 @@ >> #include >> #include >> #include >> +#include >> >> #define NO_BLOCK_MAPPINGS BIT(0) >> #define NO_CONT_MAPPINGS BIT(1) >> @@ -973,12 +974,40 @@ int pmd_clear_huge(pmd_t *pmdp) >> return 1; >> } >> >> +static int __pmd_free_pte_page(pmd_t *pmd, unsigned long addr, bool tlb_inv) >> +{ >> + pmd_t *table; >> + >> + if (pmd_val(*pmd)) { > > Please can you follow what I did in 20a004e7b017 ("arm64: mm: Use > READ_ONCE/WRITE_ONCE when accessing page tables") and: > > 1. Use consistent naming, so pmd_t * pmdp. > 2. Use READ_ONCE to dereference the entry once into a local. > > Similarly for the pud code below. Sure. I'll fix this in v6. > >> + table = __va(pmd_val(*pmd)); >> + pmd_clear(pmd); >> + if (tlb_inv) >> + __flush_tlb_kernel_pgtable(addr); >> + >> + free_page((unsigned long) table); > > Hmm. Surely it's only safe to call free_page if !tlb_inv in situations when > the page table is already disconnected at a higher level? That doesn't > appear to be the case with the function below, which still has the pud > installed. What am I missing? > Point ! Without the invalidation, free'ing a page is not safe. Better, I do __flush_tlb_kernel_pgtable() every time. This might not be as costly as flush_tlb_kernel_range(). >> + } >> + return 1; >> +} >> + >> int pud_free_pmd_page(pud_t *pud, unsigned long addr) >> { >> - return pud_none(*pud); >> + pmd_t *table; >> + int i; >> + >> + if (pud_val(*pud)) { >> + table = __va(pud_val(*pud)); >> + for (i = 0; i < PTRS_PER_PMD; i++) >> + __pmd_free_pte_page(&table[i], addr + (i * PMD_SIZE), >> + false); >> + >> + pud_clear(pud); >> + flush_tlb_kernel_range(addr, addr + PUD_SIZE); > > Why aren't you using __flush_tlb_kernel_pgtable here? > Now that I will call __flush_tlb_kernel_pgtable() for every PMD, I can use __flush_tlb_kernel_pgtable() here as well. Previously, the thought was, while invalidating PUD by VA would not work always because PUD may have next level of valid mapping still present in the table (valid next PMD but invalid next-to-next PTE). In this case doing just __flush_tlb_kernel_pgtable() for PUD might not be enough. We need to invalidate subsequent tables as well which I was skipping for optimization. So, I used flush_tlb_kernel_range(). I will upload v6. > Will > Chintan -- Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project