From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 792BCC77B7F for ; Tue, 16 May 2023 17:26:10 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DC860900004; Tue, 16 May 2023 13:26:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D2A21900002; Tue, 16 May 2023 13:26:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BCB0D900004; Tue, 16 May 2023 13:26:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A8449900002 for ; Tue, 16 May 2023 13:26:09 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 783ADA0266 for ; Tue, 16 May 2023 17:26:09 +0000 (UTC) X-FDA: 80796796458.16.E12E058 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf11.hostedemail.com (Postfix) with ESMTP id 8A34E40013 for ; Tue, 16 May 2023 17:26:07 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="V+LbGn4/"; spf=pass (imf11.hostedemail.com: domain of ardb@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=ardb@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684257967; a=rsa-sha256; cv=none; b=EYcr+Lt5KRXWDYgQm6zdoS1Ek+Al4v8GeVGLBF4pi7ijDnL4OudujAPcm9ItiNIRkK1d0w aYWPj+MDtL+fZYb1zgfzMJK6cE4qqJoowSEWyfCZi6jZYHVEuj9+1O9kHeYkMO1Zw/l5Tv mR0lFkTOCiGt0nDgF2x4I8TKRpadirs= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="V+LbGn4/"; spf=pass (imf11.hostedemail.com: domain of ardb@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=ardb@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684257967; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=hwHxfvCxX5F/VG8M54VBDBVbYDWakpjZYA6JGPzDyAg=; b=76Ncz6zgjvShmcoZzaAtcKSGpgZAiL4UU2HEChNDiddW0tIux4C0xL+6g4Cbwwg5NnByhU tIiwMD0CliJFHBpxl4OMmYOaSPfZiP/JJSo9qFmeEjbTiBYmt1lm6FIjNFfUBT+IVo7cgP i5x/4rXxkm2AWxAAUb5NP16MLo1t+pU= Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 424A363D2D for ; Tue, 16 May 2023 17:26:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 05815C433AA for ; Tue, 16 May 2023 17:26:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1684257965; bh=vhh5+rlNKvpvY+IhdH8zTHvseXPWY4NQ5GWC/3H1Ha8=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=V+LbGn4//M8ZY7FQfVgEWR/RrWpvjJHCyUQ8N1CSkblyO3OHUzL7ySMjqXkT54ZtS nA2RhSFMmQc74B3l7jwJkrRjF3IHnA+OGSpBebntP+cnZn8Ad4opWArFDnyEhXxfxE EAAo2GuS6VskfmVrV44sH7wOixCVhcaQhUo1/Qtdke3Yzpf+g+cRaby/IrmpJkuvCu oGH4Axji6wJSujuY59rV66LGZT5HZgHig7PLcXD7NChUkkv+oVNTQ6iOFb0qf++QlP x/Zoel3jg9bfnPxvMn2iklpWIeSH8HpnmHJdD19GPzWHWauPksoEeKl0jzz0nCmOZK 2uCpdgPBH0gOw== Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-4f2510b2b98so12488217e87.3 for ; Tue, 16 May 2023 10:26:04 -0700 (PDT) X-Gm-Message-State: AC+VfDw2QX89ZkUZRNaAbn1VmlNkZfYU0o/qcRH6y9xrsI0njCjietfM GXYcmYndKJdsJEAaO9m39dddjVmggTWOZNAnZ50= X-Google-Smtp-Source: ACHHUZ68392EzdrHBxMjGqK9AsHaMDbtCxkMHH0Nv2HSFYBZ6ovtUSvAqldIOG0F59AqXA8iH4TPr7YpO19SRqXCsuA= X-Received: by 2002:a19:7008:0:b0:4f2:7a54:346e with SMTP id h8-20020a197008000000b004f27a54346emr4509573lfc.44.1684257962958; Tue, 16 May 2023 10:26:02 -0700 (PDT) MIME-Version: 1.0 References: <20230513220418.19357-6-kirill.shutemov@linux.intel.com> <20230516120646.31195-1-kirill.shutemov@linux.intel.com> In-Reply-To: <20230516120646.31195-1-kirill.shutemov@linux.intel.com> From: Ard Biesheuvel Date: Tue, 16 May 2023 19:25:51 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCHv11.1 5/9] efi: Add unaccepted memory support To: "Kirill A. Shutemov" Cc: aarcange@redhat.com, ak@linux.intel.com, akpm@linux-foundation.org, bp@alien8.de, dave.hansen@intel.com, david@redhat.com, dfaggioli@suse.com, jroedel@suse.de, khalid.elmously@canonical.com, linux-coco@lists.linux.dev, linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, luto@kernel.org, marcelo.cerri@canonical.com, mgorman@techsingularity.net, mingo@redhat.com, pbonzini@redhat.com, peterx@redhat.com, peterz@infradead.org, philip.cox@canonical.com, rientjes@google.com, rppt@kernel.org, sathyanarayanan.kuppuswamy@linux.intel.com, seanjc@google.com, tglx@linutronix.de, thomas.lendacky@amd.com, tim.gardner@canonical.com, vbabka@suse.cz, x86@kernel.org Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Stat-Signature: 769yxc6a1tzb1gyamngkztxjc18q77hp X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 8A34E40013 X-HE-Tag: 1684257967-515292 X-HE-Meta: U2FsdGVkX19sxR+fulXDghtv8j17Kp83B+FnBfHet8Jxr5jN6c876m4/WYw8FbQhm+QgXwXmTEh9pFY00qo9m4tzJnHiO/XeDkNogQ8gzMoCTMKue1KKhAU2eLxkwSTv1YfPRQDEyMkOKdKZ4TE1+jgcNUMLnaToV6ap1zhZt+JGiU6AzuGrn5Sp0CxNabJ6ldcRZTvRI8grFNUJ+53SiV/ozF+mOyqxGTb2Up0SK4ZdF/xc8Ixg4ETi8ESzHODX4Pli9vRVSBjEZMncMSFVxg5h0wvmI9Fis3cBmIEMhrFkEjb0x4IJHfRT/lLs8U/TXdkX7oVqoif4U7CKdoEskU/KiEDB1MWGdk+25aoJmCSYm8424n0d9VG/moR0GT7c5NYFcv+jkfc4IWTild+IQvGcKhqhgxL9pf6H3CB7jKcFSCr0/gQqgHFVj3Oef0frKRsVdi0wzQxfv/t1agiwzaHDNqkT9D3NSS40ErUPmD3JLV/CPmDMu8dEJscV4tgmHBUQaVce1mrGOmw5DaRsRhEKx2MjIFo/CO+ClFxysF/l0W1e1FfFqIa9rN00OQw8xlLBA36dh/us6VlKMOAWiABb35/VaWL/lEnm7ixCCYKhT/sFTTglHTPkmzv33+QZyxcVMeOgE2+mlosEPwydzz0W4xZSldt8234zveOeZxOCBfMe33F5hU7MGM7jcQ325/ydd69efEXNMYhs05PdyHkKXbdG9mTydTn0I+ENH4IW8u+Ow+9pM6hTS8K05og0SRQFfRBrClpYDayJz1ZG+rKGggjOBR9ZUs5XlYxa9SodpwstQxi/8I9fLdifJ2iBM6z/EE1uZwffjZ7C+szgeMSsgScU72Ex5zGyx6Rq7+X3kBNypR5jeYuYAaqLtvUoiYdCsGRMclOnztHBNrSzIcffVdmjzKLj4ifQzNHYrRvftkfK466sHl90yfOFQEEAW4mP0nmjFKcVI9rjuHP iUXqYMZr 6c22Xj1IDD/wWduGPE6usoT34F6v22Bv3CmnbyKSGc6PkaQ/uFVCo4V/tHmuI/hR5TLCRRlL2GmZ7ySnD2mZO78z4xl/m2W1QQOCJkOXSZcXxb3B1tYPXG2g+uUjUboDMVzsjW2sgaonVp7fBaShQ//JT+VMoKoKter1Fegweoa3lcy8Q13YtIObKFrO/+qm6GnAgW/K/I0YaxdZNdlUw4ovh9O9fClTVurSkS0QjMFGxlvobuSJyEQftQte4wTj5FH4T2vINZ+glyyEpvlMuhCnUaGY/LhWi5a71n46gPFynpWaU992mhREiWNlQGwkyKEdBjYa8jF3L4EWOn353z0PEKyuWmB3xUM1zTf0IzCu0C8bhpFtBkh7kXjqn+9O7NFkwznh8VlMWH8Fm9v4teue9Kw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Tue, 16 May 2023 at 14:07, Kirill A. Shutemov wrote: > > efi_config_parse_tables() reserves memory that holds unaccepted memory > configuration table so it won't be reused by page allocator. > > Core-mm requires few helpers to support unaccepted memory: > > - accept_memory() checks the range of addresses against the bitmap and > accept memory if needed. > > - range_contains_unaccepted_memory() checks if anything within the > range requires acceptance. > > Architectural code has to provide efi_get_unaccepted_table() that > returns pointer to the unaccepted memory configuration table. > > arch_accept_memory() handles arch-specific part of memory acceptance. > > Signed-off-by: Kirill A. Shutemov > Reviewed-by: Ard Biesheuvel > v11.1: > - Add missing memblock_reserve() for the unaccepted memory > configuration table. > > --- > drivers/firmware/efi/Makefile | 1 + > drivers/firmware/efi/efi.c | 25 ++++++ > drivers/firmware/efi/unaccepted_memory.c | 103 +++++++++++++++++++++++ > include/linux/efi.h | 1 + > 4 files changed, 130 insertions(+) > create mode 100644 drivers/firmware/efi/unaccepted_memory.c > > diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile > index b51f2a4c821e..e489fefd23da 100644 > --- a/drivers/firmware/efi/Makefile > +++ b/drivers/firmware/efi/Makefile > @@ -41,3 +41,4 @@ obj-$(CONFIG_EFI_CAPSULE_LOADER) += capsule-loader.o > obj-$(CONFIG_EFI_EARLYCON) += earlycon.o > obj-$(CONFIG_UEFI_CPER_ARM) += cper-arm.o > obj-$(CONFIG_UEFI_CPER_X86) += cper-x86.o > +obj-$(CONFIG_UNACCEPTED_MEMORY) += unaccepted_memory.o > diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c > index 7dce06e419c5..d817e7afd266 100644 > --- a/drivers/firmware/efi/efi.c > +++ b/drivers/firmware/efi/efi.c > @@ -50,6 +50,9 @@ struct efi __read_mostly efi = { > #ifdef CONFIG_EFI_COCO_SECRET > .coco_secret = EFI_INVALID_TABLE_ADDR, > #endif > +#ifdef CONFIG_UNACCEPTED_MEMORY > + .unaccepted = EFI_INVALID_TABLE_ADDR, > +#endif > }; > EXPORT_SYMBOL(efi); > > @@ -605,6 +608,9 @@ static const efi_config_table_type_t common_tables[] __initconst = { > #ifdef CONFIG_EFI_COCO_SECRET > {LINUX_EFI_COCO_SECRET_AREA_GUID, &efi.coco_secret, "CocoSecret" }, > #endif > +#ifdef CONFIG_UNACCEPTED_MEMORY > + {LINUX_EFI_UNACCEPTED_MEM_TABLE_GUID, &efi.unaccepted, "Unaccepted" }, > +#endif > #ifdef CONFIG_EFI_GENERIC_STUB > {LINUX_EFI_SCREEN_INFO_TABLE_GUID, &screen_info_table }, > #endif > @@ -759,6 +765,25 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables, > } > } > > + if (IS_ENABLED(CONFIG_UNACCEPTED_MEMORY) && > + efi.unaccepted != EFI_INVALID_TABLE_ADDR) { > + struct efi_unaccepted_memory *unaccepted; > + > + unaccepted = early_memremap(efi.unaccepted, sizeof(*unaccepted)); > + if (unaccepted) { > + unsigned long size; > + > + if (unaccepted->version == 1) { > + size = sizeof(*unaccepted) + unaccepted->size; > + memblock_reserve(efi.unaccepted, size); > + } else { > + efi.unaccepted = EFI_INVALID_TABLE_ADDR; > + } > + > + early_memunmap(unaccepted, sizeof(*unaccepted)); > + } > + } > + > return 0; > } > > diff --git a/drivers/firmware/efi/unaccepted_memory.c b/drivers/firmware/efi/unaccepted_memory.c > new file mode 100644 > index 000000000000..bb91c41f76fb > --- /dev/null > +++ b/drivers/firmware/efi/unaccepted_memory.c > @@ -0,0 +1,103 @@ > +// SPDX-License-Identifier: GPL-2.0-only > + > +#include > +#include > +#include > +#include > + > +/* Protects unaccepted memory bitmap */ > +static DEFINE_SPINLOCK(unaccepted_memory_lock); > + > +void accept_memory(phys_addr_t start, phys_addr_t end) > +{ > + struct efi_unaccepted_memory *unaccepted; > + unsigned long range_start, range_end; > + unsigned long flags; > + u64 unit_size; > + > + if (efi.unaccepted == EFI_INVALID_TABLE_ADDR) > + return; > + > + unaccepted = efi_get_unaccepted_table(); > + if (!unaccepted) > + return; > + > + unit_size = unaccepted->unit_size; > + > + /* > + * Only care for the part of the range that is represented > + * in the bitmap. > + */ > + if (start < unaccepted->phys_base) > + start = unaccepted->phys_base; > + if (end < unaccepted->phys_base) > + return; > + > + /* Translate to offsets from the beginning of the bitmap */ > + start -= unaccepted->phys_base; > + end -= unaccepted->phys_base; > + > + /* Make sure not to overrun the bitmap */ > + if (end > unaccepted->size * unit_size * BITS_PER_BYTE) > + end = unaccepted->size * unit_size * BITS_PER_BYTE; > + > + range_start = start / unit_size; > + > + spin_lock_irqsave(&unaccepted_memory_lock, flags); > + for_each_set_bitrange_from(range_start, range_end, unaccepted->bitmap, > + DIV_ROUND_UP(end, unit_size)) { > + unsigned long phys_start, phys_end; > + unsigned long len = range_end - range_start; > + > + phys_start = range_start * unit_size + unaccepted->phys_base; > + phys_end = range_end * unit_size + unaccepted->phys_base; > + > + arch_accept_memory(phys_start, phys_end); > + bitmap_clear(unaccepted->bitmap, range_start, len); > + } > + spin_unlock_irqrestore(&unaccepted_memory_lock, flags); > +} > + > +bool range_contains_unaccepted_memory(phys_addr_t start, phys_addr_t end) > +{ > + struct efi_unaccepted_memory *unaccepted; > + unsigned long flags; > + bool ret = false; > + u64 unit_size; > + > + unaccepted = efi_get_unaccepted_table(); > + if (!unaccepted) > + return false; > + > + unit_size = unaccepted->unit_size; > + > + /* > + * Only care for the part of the range that is represented > + * in the bitmap. > + */ > + if (start < unaccepted->phys_base) > + start = unaccepted->phys_base; > + if (end < unaccepted->phys_base) > + return false; > + > + /* Translate to offsets from the beginning of the bitmap */ > + start -= unaccepted->phys_base; > + end -= unaccepted->phys_base; > + > + /* Make sure not to overrun the bitmap */ > + if (end > unaccepted->size * unit_size * BITS_PER_BYTE) > + end = unaccepted->size * unit_size * BITS_PER_BYTE; > + > + spin_lock_irqsave(&unaccepted_memory_lock, flags); > + while (start < end) { > + if (test_bit(start / unit_size, unaccepted->bitmap)) { > + ret = true; > + break; > + } > + > + start += unit_size; > + } > + spin_unlock_irqrestore(&unaccepted_memory_lock, flags); > + > + return ret; > +} > diff --git a/include/linux/efi.h b/include/linux/efi.h > index 29cc622910da..9864f9c00da2 100644 > --- a/include/linux/efi.h > +++ b/include/linux/efi.h > @@ -646,6 +646,7 @@ extern struct efi { > unsigned long tpm_final_log; /* TPM2 Final Events Log table */ > unsigned long mokvar_table; /* MOK variable config table */ > unsigned long coco_secret; /* Confidential computing secret table */ > + unsigned long unaccepted; /* Unaccepted memory table */ > > efi_get_time_t *get_time; > efi_set_time_t *set_time; > -- > 2.39.3 >