Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3492073pxf; Mon, 29 Mar 2021 03:54:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx0XA0Iv3egbTM3aPuVc7fK9bhHfo9xOpkqsbNlHjaPwwOKHWINWIn4QfEDOPaJ3Q5mv5v/ X-Received: by 2002:a17:906:f88a:: with SMTP id lg10mr28561253ejb.39.1617015253895; Mon, 29 Mar 2021 03:54:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617015253; cv=none; d=google.com; s=arc-20160816; b=Aj7ZtkgKjpw6sXARU9nf6qZ6bcj1vszVh1PTfIAVQLI/FjpFLpGKDwHFn3EWRzppdG SAOaKSTP4/J09fam2HoFFG1RMbeyJYef80BwulgjZRgRQNNcq09Qhr6UTt641sr0R6Ac mp3+YYNoOnL3oo5BaCmfFswv3MwXHMWowldVDm+dbkipkJOJWhLsX7FFpwjXZmVu+CX8 meDx0DJC3MbxiG5avnxPXGbxEP3bz8qKaRJg2XUyBV7NhAs5mS4GeiOAfCXIIVZVXi+D 07/Q7EBcMceqqyqR9PPkqVrILEGWqzy98wP3hVpvtTPjMAGGNqA7jhQR7XsnTIWTey7U G2CQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=5mIgoag0Hf4VAF+uSl37yw8nWCjQxCnatJ2zQLdQHXc=; b=AqZFoaieppNr27PKWqfRSwS7d0lwBJLHfwuXszFNe/GYqn9QNa6+KSA9yyzEvaMCPu T/PdbcvY37apAbk+DMO+ZGBO9VUNazlbheWeW4QzF2ITftomoCL0OeNf0MXLl4EjVV5L 3OKA5Wowb30YfSIHTmXZthrzDEVYswcYW5xzTWRxAhDqd/VvCPV9mx1wt8/V/Ef0S9aL UEwA14Droez9ELVQ7g/8wi8EaP/GPU420Y3ymW6hvrZJDr6IUDkpb3iGOaL6rLpEswqA ncuLYBy95nD/2lgv7gG7Bv4906NEJTIXHgb9GqdBZ8+29WI51iyouwTX7xDRVzYElFSB Wexg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QMbr7i8n; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t3si12207121edq.578.2021.03.29.03.53.51; Mon, 29 Mar 2021 03:54:13 -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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QMbr7i8n; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233014AbhC2InS (ORCPT + 99 others); Mon, 29 Mar 2021 04:43:18 -0400 Received: from mail.kernel.org ([198.145.29.99]:40920 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233637AbhC2IZg (ORCPT ); Mon, 29 Mar 2021 04:25:36 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2104E61964; Mon, 29 Mar 2021 08:25:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1617006301; bh=XRTg73zs/e0zLhEgkqO05U36uGTaz5h2cV9VcugN0HY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QMbr7i8nvwoue0MvAsMCuPIYS2NpdMR86qJC7MPM7GieU5ly7s5+CzzAIma9771bW Z1kHktafMJRJsiMDufpWxl/c5JufIeBGWPTlh1F4w9l+F4FbwPVUmnsqouD+jp7jYi 6vrPxI74LnACr3LzBs8vf75zCHQDw0WJ1oT/EUWk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Pavel Tatashin , Tyler Hicks , Anshuman Khandual , Will Deacon , Sasha Levin Subject: [PATCH 5.10 192/221] arm64: mm: correct the inside linear map range during hotplug check Date: Mon, 29 Mar 2021 09:58:43 +0200 Message-Id: <20210329075635.533435595@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210329075629.172032742@linuxfoundation.org> References: <20210329075629.172032742@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pavel Tatashin [ Upstream commit ee7febce051945be28ad86d16a15886f878204de ] Memory hotplug may fail on systems with CONFIG_RANDOMIZE_BASE because the linear map range is not checked correctly. The start physical address that linear map covers can be actually at the end of the range because of randomization. Check that and if so reduce it to 0. This can be verified on QEMU with setting kaslr-seed to ~0ul: memstart_offset_seed = 0xffff START: __pa(_PAGE_OFFSET(vabits_actual)) = ffff9000c0000000 END: __pa(PAGE_END - 1) = 1000bfffffff Signed-off-by: Pavel Tatashin Fixes: 58284a901b42 ("arm64/mm: Validate hotplug range before creating linear mapping") Tested-by: Tyler Hicks Reviewed-by: Anshuman Khandual Link: https://lore.kernel.org/r/20210216150351.129018-2-pasha.tatashin@soleen.com Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- arch/arm64/mm/mmu.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 0635803463a5..10938dbe1f11 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1448,6 +1448,22 @@ static void __remove_pgd_mapping(pgd_t *pgdir, unsigned long start, u64 size) struct range arch_get_mappable_range(void) { struct range mhp_range; + u64 start_linear_pa = __pa(_PAGE_OFFSET(vabits_actual)); + u64 end_linear_pa = __pa(PAGE_END - 1); + + if (IS_ENABLED(CONFIG_RANDOMIZE_BASE)) { + /* + * Check for a wrap, it is possible because of randomized linear + * mapping the start physical address is actually bigger than + * the end physical address. In this case set start to zero + * because [0, end_linear_pa] range must still be able to cover + * all addressable physical addresses. + */ + if (start_linear_pa > end_linear_pa) + start_linear_pa = 0; + } + + WARN_ON(start_linear_pa > end_linear_pa); /* * Linear mapping region is the range [PAGE_OFFSET..(PAGE_END - 1)] @@ -1455,8 +1471,9 @@ struct range arch_get_mappable_range(void) * range which can be mapped inside this linear mapping range, must * also be derived from its end points. */ - mhp_range.start = __pa(_PAGE_OFFSET(vabits_actual)); - mhp_range.end = __pa(PAGE_END - 1); + mhp_range.start = start_linear_pa; + mhp_range.end = end_linear_pa; + return mhp_range; } -- 2.30.1