Received: by 2002:a25:683:0:0:0:0:0 with SMTP id 125csp2005377ybg; Fri, 5 Jun 2020 03:10:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJws2h3htd1GPAiu88P3A43I0G8a0akW2p2ekfoKm0ByCMRHTY/HIavUqQe+Jj0EyMCYLsIR X-Received: by 2002:aa7:d041:: with SMTP id n1mr1920311edo.196.1591351827976; Fri, 05 Jun 2020 03:10:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1591351827; cv=none; d=google.com; s=arc-20160816; b=VV+FFaQYJ1+3cptEr8e+SlshKI/xm1BqvZK6ic7PGYOAonCLOLH0PamhSUuVwmoqzz 0xNgsgk3btphMoKKJATGB0PocCFB2PlLugUQ9ApMHH/yjrnmZf6FM/w2fzJsgowMk1hE GYwFBoJINlHjC3zVKvHI1fmaSPY9b5v30S9NYKL7M8NFYB79bZ6sX0tKPCRkkC1PFX6b Dn7NvBWwqYy3NjgenEvfx8fv/D4CPqpRcyofi2IVQmdGQxLbAcNa0lO+qRSmw7k+Kk7H yyCElsEx1JqnSEOPghCGzth8H+mpyOVhYN23VsIuCQqkyRBIJVVmTiJknEZwNQ+2sybC h8kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=jt8b+xAXY2mOFXIcSuL55pyM/tT8JODRLxlzSJEw/zE=; b=hsFBExDGBWTSYvXqbqyRkVLECOlBnVqNkkbzKgzgA0YXybIMpQlC7dX8ENvRBl1fyH Nw2WNC4cUvHNZScIQESeIel1uPh3lMAHNEqsB0G50bnBPVMcgW2ORil7umd4OxhYY4W4 Q1s2KVU8eQ4/+WnIRZWXBQDAYoh9nafkqXllVyW+usid2xBdiU5/1JkLR8CyGfLm/GXj csF9FiT8KLuQ2NnUBToyCqb3a7vk1hSBcFFEaoTizuepMgv1BMF9co9U46pPajJ2ppWr bxqON1qNS6i6E3a3L9Th52DUXqJEZ6jIfryPTgwaO91eKb1EGnn6rqSPj/TkwjLO/B63 dsJA== 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 z6si3401001ejb.147.2020.06.05.03.10.05; Fri, 05 Jun 2020 03:10:27 -0700 (PDT) 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 S1726069AbgFEKIU (ORCPT + 99 others); Fri, 5 Jun 2020 06:08:20 -0400 Received: from foss.arm.com ([217.140.110.172]:53160 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725926AbgFEKIT (ORCPT ); Fri, 5 Jun 2020 06:08:19 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3C5CC2B; Fri, 5 Jun 2020 03:08:18 -0700 (PDT) Received: from gaia (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B9B0C3F52E; Fri, 5 Jun 2020 03:08:15 -0700 (PDT) Date: Fri, 5 Jun 2020 11:08:13 +0100 From: Catalin Marinas To: Joerg Roedel Cc: x86@kernel.org, hpa@zytor.com, Dave Hansen , Andy Lutomirski , Peter Zijlstra , rjw@rjwysocki.net, Arnd Bergmann , Andrew Morton , Steven Rostedt , Vlastimil Babka , Michal Hocko , Matthew Wilcox , Joerg Roedel , linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, Will Deacon Subject: Re: [PATCH v3 1/7] mm: Add functions to track page directory modifications Message-ID: <20200605100813.GA31371@gaia> References: <20200515140023.25469-1-joro@8bytes.org> <20200515140023.25469-2-joro@8bytes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200515140023.25469-2-joro@8bytes.org> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Joerg, On Fri, May 15, 2020 at 04:00:17PM +0200, Joerg Roedel wrote: > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 5a323422d783..022fe682af9e 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -2078,13 +2078,54 @@ static inline pud_t *pud_alloc(struct mm_struct *mm, p4d_t *p4d, > return (unlikely(p4d_none(*p4d)) && __pud_alloc(mm, p4d, address)) ? > NULL : pud_offset(p4d, address); > } > + > +static inline p4d_t *p4d_alloc_track(struct mm_struct *mm, pgd_t *pgd, > + unsigned long address, > + pgtbl_mod_mask *mod_mask) > + > +{ > + if (unlikely(pgd_none(*pgd))) { > + if (__p4d_alloc(mm, pgd, address)) > + return NULL; > + *mod_mask |= PGTBL_PGD_MODIFIED; > + } > + > + return p4d_offset(pgd, address); > +} > + > #endif /* !__ARCH_HAS_5LEVEL_HACK */ > > +static inline pud_t *pud_alloc_track(struct mm_struct *mm, p4d_t *p4d, > + unsigned long address, > + pgtbl_mod_mask *mod_mask) > +{ > + if (unlikely(p4d_none(*p4d))) { > + if (__pud_alloc(mm, p4d, address)) > + return NULL; > + *mod_mask |= PGTBL_P4D_MODIFIED; > + } > + > + return pud_offset(p4d, address); > +} This patch causes a kernel panic on arm64 (and possibly powerpc, I haven't tried). arm64 still uses the 5level-fixup.h and pud_alloc() checks for the empty p4d with pgd_none() instead of p4d_none(). The patch below fixes it: -----------------------8<----------------------------------- From 8fb5f4c1e0983bb501c8ec71f9bb9dd344b80e87 Mon Sep 17 00:00:00 2001 From: Catalin Marinas Date: Fri, 5 Jun 2020 10:56:03 +0100 Subject: [PATCH] mm: Use pgd_none() in pud_alloc_track() with __ARCH_HAS_5LEVEL_HACK Commit d8626138009b ("mm: add functions to track page directory modifications") introduced the pud_alloc_track() function checking for an empty p4d using p4d_none(). However, when __ARCH_HAS_5LEVEL_HACK is defined, the pud_alloc() counterpart checks for an empty p4d using pgd_none(). Since p4d_none() is always 0 in this case, no pud would be allocated and the kernel panics during boot on arm64 (at least). Until all architectures are moved away from the 5level-fixup.h, define a pud_alloc_track() that matches the __ARCH_HAS_5LEVEL_HACK pud_alloc(). Fixes: d8626138009b ("mm: add functions to track page directory modifications") Signed-off-by: Catalin Marinas Cc: Joerg Roedel Cc: Andrew Morton --- include/linux/mm.h | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index fda41eb7f1c8..9d3761a1fad5 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2106,8 +2106,6 @@ static inline p4d_t *p4d_alloc_track(struct mm_struct *mm, pgd_t *pgd, return p4d_offset(pgd, address); } -#endif /* !__ARCH_HAS_5LEVEL_HACK */ - static inline pud_t *pud_alloc_track(struct mm_struct *mm, p4d_t *p4d, unsigned long address, pgtbl_mod_mask *mod_mask) @@ -2121,6 +2119,23 @@ static inline pud_t *pud_alloc_track(struct mm_struct *mm, p4d_t *p4d, return pud_offset(p4d, address); } +#else /* __ARCH_HAS_5LEVEL_HACK */ + +static inline pud_t *pud_alloc_track(struct mm_struct *mm, p4d_t *p4d, + unsigned long address, + pgtbl_mod_mask *mod_mask) +{ + if (unlikely(pgd_none(*p4d))) { + if (__pud_alloc(mm, p4d, address)) + return NULL; + *mod_mask |= PGTBL_P4D_MODIFIED; + } + + return pud_offset(p4d, address); +} + +#endif /* !__ARCH_HAS_5LEVEL_HACK */ + static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address) { return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))?