From patchwork Tue Mar 12 13:03:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589963 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2C29CC54E58 for ; Tue, 12 Mar 2024 13:04:06 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691810.1078208 (Exim 4.92) (envelope-from ) id 1rk1nN-0004kv-Cm; Tue, 12 Mar 2024 13:03:53 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691810.1078208; Tue, 12 Mar 2024 13:03:53 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nN-0004ko-9W; Tue, 12 Mar 2024 13:03:53 +0000 Received: by outflank-mailman (input) for mailman id 691810; Tue, 12 Mar 2024 13:03:52 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nL-0004Wa-Vl for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:03:51 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-sth1.inumbo.com (Halon) with ESMTP id f8611b0f-e070-11ee-afdd-a90da7624cb6; Tue, 12 Mar 2024 14:03:50 +0100 (CET) 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 225A01570; Tue, 12 Mar 2024 06:04:27 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 92F9D3F762; Tue, 12 Mar 2024 06:03:48 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: f8611b0f-e070-11ee-afdd-a90da7624cb6 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Penny Zheng , Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk , Penny Zheng Subject: [PATCH 01/11] xen/arm: remove stale addr_cells/size_cells in assign_shared_memory Date: Tue, 12 Mar 2024 13:03:21 +0000 Message-Id: <20240312130331.78418-2-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 From: Penny Zheng Function parameters {addr_cells,size_cells} are stale parameters in assign_shared_memory, so we shall remove them. Signed-off-by: Penny Zheng Signed-off-by: Luca Fancellu Reviewed-by: Michal Orzel --- v1: - This is this patch: https://patchwork.kernel.org/project/xen-devel/patch/20231206090623.1932275-2-Penny.Zheng@arm.com/ --- xen/arch/arm/static-shmem.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index 9097bc8b1511..cb268cd2edf1 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -90,7 +90,6 @@ static mfn_t __init acquire_shared_memory_bank(struct domain *d, } static int __init assign_shared_memory(struct domain *d, - uint32_t addr_cells, uint32_t size_cells, paddr_t pbase, paddr_t psize, paddr_t gbase) { @@ -252,7 +251,6 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo, * specified, so they should be assigned to dom_io. */ ret = assign_shared_memory(owner_dom_io ? dom_io : d, - addr_cells, size_cells, pbase, psize, gbase); if ( ret ) return ret; From patchwork Tue Mar 12 13:03:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589962 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0432AC54E5D for ; Tue, 12 Mar 2024 13:04:05 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691811.1078218 (Exim 4.92) (envelope-from ) id 1rk1nP-00050L-P7; Tue, 12 Mar 2024 13:03:55 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691811.1078218; Tue, 12 Mar 2024 13:03:55 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nP-00050E-LN; Tue, 12 Mar 2024 13:03:55 +0000 Received: by outflank-mailman (input) for mailman id 691811; Tue, 12 Mar 2024 13:03:54 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nN-0004WU-Un for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:03:53 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id f94e0066-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:03:52 +0100 (CET) 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 AD98115A1; Tue, 12 Mar 2024 06:04:28 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 27FC83F762; Tue, 12 Mar 2024 06:03:50 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: f94e0066-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Penny Zheng , Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk , Penny Zheng Subject: [PATCH 02/11] xen/arm: avoid repetitive checking in process_shm_node Date: Tue, 12 Mar 2024 13:03:22 +0000 Message-Id: <20240312130331.78418-3-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 From: Penny Zheng Putting overlap and overflow checking in the loop is causing repetitive operation, so this commit extracts both checking outside the loop. Signed-off-by: Penny Zheng Signed-off-by: Luca Fancellu Reviewed-by: Michal Orzel --- v1: - Rework of https://patchwork.kernel.org/project/xen-devel/patch/20231206090623.1932275-3-Penny.Zheng@arm.com/ - use strncmp to match the branch above - drop Michal R-by given the change --- xen/arch/arm/static-shmem.c | 39 +++++++++++++++---------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index cb268cd2edf1..40a0e860c79d 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -349,7 +349,7 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, { const struct fdt_property *prop, *prop_id, *prop_role; const __be32 *cell; - paddr_t paddr, gaddr, size; + paddr_t paddr, gaddr, size, end; struct meminfo *mem = &bootinfo.reserved_mem; unsigned int i; int len; @@ -422,6 +422,13 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, return -EINVAL; } + end = paddr + size; + if ( end <= paddr ) + { + printk("fdt: static shared memory region %s overflow\n", shm_id); + return -EINVAL; + } + for ( i = 0; i < mem->nr_banks; i++ ) { /* @@ -441,30 +448,13 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, return -EINVAL; } } + else if ( strncmp(shm_id, mem->bank[i].shm_id, MAX_SHM_ID_LENGTH) != 0 ) + continue; else { - paddr_t end = paddr + size; - paddr_t bank_end = mem->bank[i].start + mem->bank[i].size; - - if ( (end <= paddr) || (bank_end <= mem->bank[i].start) ) - { - printk("fdt: static shared memory region %s overflow\n", shm_id); - return -EINVAL; - } - - if ( check_reserved_regions_overlap(paddr, size) ) - return -EINVAL; - else - { - if ( strcmp(shm_id, mem->bank[i].shm_id) != 0 ) - continue; - else - { - printk("fdt: different shared memory region could not share the same shm ID %s\n", - shm_id); - return -EINVAL; - } - } + printk("fdt: different shared memory region could not share the same shm ID %s\n", + shm_id); + return -EINVAL; } } @@ -472,6 +462,9 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, { if ( i < NR_MEM_BANKS ) { + if ( check_reserved_regions_overlap(paddr, size) ) + return -EINVAL; + /* Static shared memory shall be reserved from any other use. */ safe_strcpy(mem->bank[mem->nr_banks].shm_id, shm_id); mem->bank[mem->nr_banks].start = paddr; From patchwork Tue Mar 12 13:03:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589968 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3C705C54E58 for ; Tue, 12 Mar 2024 13:04:09 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691812.1078228 (Exim 4.92) (envelope-from ) id 1rk1nS-0005Gw-1W; Tue, 12 Mar 2024 13:03:58 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691812.1078228; Tue, 12 Mar 2024 13:03:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nR-0005Gj-Te; Tue, 12 Mar 2024 13:03:57 +0000 Received: by outflank-mailman (input) for mailman id 691812; Tue, 12 Mar 2024 13:03:56 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nP-0004Wa-QK for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:03:56 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-sth1.inumbo.com (Halon) with ESMTP id fa494afa-e070-11ee-afdd-a90da7624cb6; Tue, 12 Mar 2024 14:03:53 +0100 (CET) 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 626761007; Tue, 12 Mar 2024 06:04:30 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B30EB3F762; Tue, 12 Mar 2024 06:03:51 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fa494afa-e070-11ee-afdd-a90da7624cb6 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk Subject: [PATCH 03/11] xen/arm: Introduce a generic way to access memory bank structures Date: Tue, 12 Mar 2024 13:03:23 +0000 Message-Id: <20240312130331.78418-4-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 Currently the 'stuct meminfo' is defining a static defined array of 'struct membank' of NR_MEM_BANKS elements, some feature like shared memory don't require such amount of memory allocation but might want to reuse existing code to manipulate this kind of structure that is just as 'struct meminfo' but less bulky. For this reason introduce a generic way to access this kind of structure using a new stucture 'struct membanks', which implements all the fields needed by a structure related to memory banks without the need to specify at build time the size of the 'struct membank' array. Modify 'struct meminfo' to implement the field related to the new introduced structure, given the change all usage of this structure are updated in this way: - code accessing bootinfo.{mem,reserved_mem,acpi} field now uses 3 new introduced static inline helpers to access the new field of 'struct meminfo' named 'common'. - code accessing 'struct kernel_info *' member 'mem' now use the new introduced macro 'kernel_info_get_mem(...)' to access the new field of 'struct meminfo' named 'common'. Constify pointers where needed. Suggested-by: Julien Grall Signed-off-by: Luca Fancellu --- xen/arch/arm/acpi/domain_build.c | 6 +- xen/arch/arm/arm32/mmu/mm.c | 44 +++++----- xen/arch/arm/arm64/mmu/mm.c | 2 +- xen/arch/arm/bootfdt.c | 27 +++--- xen/arch/arm/dom0less-build.c | 18 ++-- xen/arch/arm/domain_build.c | 106 +++++++++++++----------- xen/arch/arm/efi/efi-boot.h | 8 +- xen/arch/arm/efi/efi-dom0.c | 13 +-- xen/arch/arm/include/asm/domain_build.h | 2 +- xen/arch/arm/include/asm/kernel.h | 9 ++ xen/arch/arm/include/asm/setup.h | 40 ++++++++- xen/arch/arm/include/asm/static-shmem.h | 4 +- xen/arch/arm/kernel.c | 12 +-- xen/arch/arm/setup.c | 58 +++++++------ xen/arch/arm/static-memory.c | 27 +++--- xen/arch/arm/static-shmem.c | 34 ++++---- 16 files changed, 243 insertions(+), 167 deletions(-) diff --git a/xen/arch/arm/acpi/domain_build.c b/xen/arch/arm/acpi/domain_build.c index b58389ce9e9f..ed895dd8f926 100644 --- a/xen/arch/arm/acpi/domain_build.c +++ b/xen/arch/arm/acpi/domain_build.c @@ -444,14 +444,14 @@ static int __init acpi_create_fadt(struct domain *d, struct membank tbl_add[]) } static int __init estimate_acpi_efi_size(struct domain *d, - struct kernel_info *kinfo) + const struct kernel_info *kinfo) { size_t efi_size, acpi_size, madt_size; u64 addr; struct acpi_table_rsdp *rsdp_tbl; struct acpi_table_header *table; - efi_size = estimate_efi_size(kinfo->mem.nr_banks); + efi_size = estimate_efi_size(kernel_info_get_mem(kinfo)->nr_banks); acpi_size = ROUNDUP(sizeof(struct acpi_table_fadt), 8); acpi_size += ROUNDUP(sizeof(struct acpi_table_stao), 8); @@ -546,7 +546,7 @@ int __init prepare_acpi(struct domain *d, struct kernel_info *kinfo) acpi_map_other_tables(d); acpi_create_efi_system_table(d, tbl_add); - acpi_create_efi_mmap_table(d, &kinfo->mem, tbl_add); + acpi_create_efi_mmap_table(d, kernel_info_get_mem(kinfo), tbl_add); /* Map the EFI and ACPI tables to Dom0 */ rc = map_regions_p2mt(d, diff --git a/xen/arch/arm/arm32/mmu/mm.c b/xen/arch/arm/arm32/mmu/mm.c index cb441ca87c0d..e6bb5d934c16 100644 --- a/xen/arch/arm/arm32/mmu/mm.c +++ b/xen/arch/arm/arm32/mmu/mm.c @@ -41,6 +41,7 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, uint32_t size, paddr_t align, int first_mod) { + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); const struct bootmodules *mi = &bootinfo.modules; int i; int nr; @@ -99,15 +100,14 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, * possible kinds of bootmodules. * * When retrieving the corresponding reserved-memory addresses, we - * need to index the bootinfo.reserved_mem bank starting from 0, and - * only counting the reserved-memory modules. Hence, we need to use - * i - nr. + * need to index the reserved_mem bank starting from 0, and only counting + * the reserved-memory modules. Hence, we need to use i - nr. */ nr += mi->nr_mods; - for ( ; i - nr < bootinfo.reserved_mem.nr_banks; i++ ) + for ( ; i - nr < reserved_mem->nr_banks; i++ ) { - paddr_t r_s = bootinfo.reserved_mem.bank[i - nr].start; - paddr_t r_e = r_s + bootinfo.reserved_mem.bank[i - nr].size; + paddr_t r_s = reserved_mem->bank[i - nr].start; + paddr_t r_e = r_s + reserved_mem->bank[i - nr].size; if ( s < r_e && r_s < e ) { @@ -128,17 +128,18 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, */ static paddr_t __init fit_xenheap_in_static_heap(uint32_t size, paddr_t align) { + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); unsigned int i; paddr_t end = 0, aligned_start, aligned_end; paddr_t bank_start, bank_size, bank_end; - for ( i = 0 ; i < bootinfo.reserved_mem.nr_banks; i++ ) + for ( i = 0 ; i < reserved_mem->nr_banks; i++ ) { - if ( bootinfo.reserved_mem.bank[i].type != MEMBANK_STATIC_HEAP ) + if ( reserved_mem->bank[i].type != MEMBANK_STATIC_HEAP ) continue; - bank_start = bootinfo.reserved_mem.bank[i].start; - bank_size = bootinfo.reserved_mem.bank[i].size; + bank_start = reserved_mem->bank[i].start; + bank_size = reserved_mem->bank[i].size; bank_end = bank_start + bank_size; if ( bank_size < size ) @@ -161,13 +162,14 @@ static paddr_t __init fit_xenheap_in_static_heap(uint32_t size, paddr_t align) void __init setup_mm(void) { + const struct membanks *mem = bootinfo_get_mem(); paddr_t ram_start, ram_end, ram_size, e, bank_start, bank_end, bank_size; paddr_t static_heap_end = 0, static_heap_size = 0; unsigned long heap_pages, xenheap_pages, domheap_pages; unsigned int i; const uint32_t ctr = READ_CP32(CTR); - if ( !bootinfo.mem.nr_banks ) + if ( !mem->nr_banks ) panic("No memory bank\n"); /* We only supports instruction caches implementing the IVIPT extension. */ @@ -176,14 +178,14 @@ void __init setup_mm(void) init_pdx(); - ram_start = bootinfo.mem.bank[0].start; - ram_size = bootinfo.mem.bank[0].size; + ram_start = mem->bank[0].start; + ram_size = mem->bank[0].size; ram_end = ram_start + ram_size; - for ( i = 1; i < bootinfo.mem.nr_banks; i++ ) + for ( i = 1; i < mem->nr_banks; i++ ) { - bank_start = bootinfo.mem.bank[i].start; - bank_size = bootinfo.mem.bank[i].size; + bank_start = mem->bank[i].start; + bank_size = mem->bank[i].size; bank_end = bank_start + bank_size; ram_size = ram_size + bank_size; @@ -195,13 +197,15 @@ void __init setup_mm(void) if ( bootinfo.static_heap ) { - for ( i = 0 ; i < bootinfo.reserved_mem.nr_banks; i++ ) + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); + + for ( i = 0 ; i < reserved_mem->nr_banks; i++ ) { - if ( bootinfo.reserved_mem.bank[i].type != MEMBANK_STATIC_HEAP ) + if ( reserved_mem->bank[i].type != MEMBANK_STATIC_HEAP ) continue; - bank_start = bootinfo.reserved_mem.bank[i].start; - bank_size = bootinfo.reserved_mem.bank[i].size; + bank_start = reserved_mem->bank[i].start; + bank_size = reserved_mem->bank[i].size; bank_end = bank_start + bank_size; static_heap_size += bank_size; diff --git a/xen/arch/arm/arm64/mmu/mm.c b/xen/arch/arm/arm64/mmu/mm.c index d2651c948698..f8aaf4ac18be 100644 --- a/xen/arch/arm/arm64/mmu/mm.c +++ b/xen/arch/arm/arm64/mmu/mm.c @@ -194,7 +194,7 @@ static void __init setup_directmap_mappings(unsigned long base_mfn, void __init setup_mm(void) { - const struct meminfo *banks = &bootinfo.mem; + const struct membanks *banks = bootinfo_get_mem(); paddr_t ram_start = INVALID_PADDR; paddr_t ram_end = 0; paddr_t ram_size = 0; diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index 35dbdf3384cb..ecbc80d6a112 100644 --- a/xen/arch/arm/bootfdt.c +++ b/xen/arch/arm/bootfdt.c @@ -107,14 +107,14 @@ void __init device_tree_get_reg(const __be32 **cell, uint32_t address_cells, static int __init device_tree_get_meminfo(const void *fdt, int node, const char *prop_name, u32 address_cells, u32 size_cells, - void *data, enum membank_type type) + struct membanks *mem, + enum membank_type type) { const struct fdt_property *prop; unsigned int i, banks; const __be32 *cell; u32 reg_cells = address_cells + size_cells; paddr_t start, size; - struct meminfo *mem = data; if ( !device_tree_node_is_available(fdt, node) ) return 0; @@ -133,10 +133,10 @@ static int __init device_tree_get_meminfo(const void *fdt, int node, cell = (const __be32 *)prop->data; banks = fdt32_to_cpu(prop->len) / (reg_cells * sizeof (u32)); - for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ ) + for ( i = 0; i < banks && mem->nr_banks < mem->max_banks; i++ ) { device_tree_get_reg(&cell, address_cells, size_cells, &start, &size); - if ( mem == &bootinfo.reserved_mem && + if ( mem == bootinfo_get_reserved_mem() && check_reserved_regions_overlap(start, size) ) return -EINVAL; /* Some DT may describe empty bank, ignore them */ @@ -231,10 +231,10 @@ int __init device_tree_for_each_node(const void *fdt, int node, static int __init process_memory_node(const void *fdt, int node, const char *name, int depth, u32 address_cells, u32 size_cells, - void *data) + struct membanks *mem) { return device_tree_get_meminfo(fdt, node, "reg", address_cells, size_cells, - data, MEMBANK_DEFAULT); + mem, MEMBANK_DEFAULT); } static int __init process_reserved_memory_node(const void *fdt, int node, @@ -259,7 +259,7 @@ static int __init process_reserved_memory(const void *fdt, int node, { return device_tree_for_each_node(fdt, node, process_reserved_memory_node, - &bootinfo.reserved_mem); + bootinfo_get_reserved_mem()); } static void __init process_multiboot_node(const void *fdt, int node, @@ -358,7 +358,7 @@ static int __init process_chosen_node(const void *fdt, int node, rc = device_tree_get_meminfo(fdt, node, "xen,static-heap", address_cells, size_cells, - &bootinfo.reserved_mem, + bootinfo_get_reserved_mem(), MEMBANK_STATIC_HEAP); if ( rc ) return rc; @@ -420,7 +420,7 @@ static int __init process_domain_node(const void *fdt, int node, return 0; return device_tree_get_meminfo(fdt, node, "xen,static-mem", address_cells, - size_cells, &bootinfo.reserved_mem, + size_cells, bootinfo_get_reserved_mem(), MEMBANK_STATIC_DOMAIN); } @@ -438,7 +438,7 @@ static int __init early_scan_node(const void *fdt, if ( !efi_enabled(EFI_BOOT) && device_tree_node_matches(fdt, node, "memory") ) rc = process_memory_node(fdt, node, name, depth, - address_cells, size_cells, &bootinfo.mem); + address_cells, size_cells, bootinfo_get_mem()); else if ( depth == 1 && !dt_node_cmp(name, "reserved-memory") ) rc = process_reserved_memory(fdt, node, name, depth, address_cells, size_cells); @@ -459,8 +459,8 @@ static int __init early_scan_node(const void *fdt, static void __init early_print_info(void) { - struct meminfo *mi = &bootinfo.mem; - struct meminfo *mem_resv = &bootinfo.reserved_mem; + const struct membanks *mi = bootinfo_get_mem(); + const struct membanks *mem_resv = bootinfo_get_reserved_mem(); struct bootmodules *mods = &bootinfo.modules; struct bootcmdlines *cmds = &bootinfo.cmdlines; unsigned int i, j; @@ -537,6 +537,7 @@ static void __init swap_memory_node(void *_a, void *_b, size_t size) */ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr) { + struct membanks *mem = bootinfo_get_mem(); int ret; ret = fdt_check_header(fdt); @@ -554,7 +555,7 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr) * bank in memory first. There is no requirement that the DT will provide * the banks sorted in ascending order. So sort them through. */ - sort(bootinfo.mem.bank, bootinfo.mem.nr_banks, sizeof(struct membank), + sort(mem->bank, mem->nr_banks, sizeof(struct membank), cmp_memory_node, swap_memory_node); early_print_info(); diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c index fb63ec6fd111..0165da6f2986 100644 --- a/xen/arch/arm/dom0less-build.c +++ b/xen/arch/arm/dom0less-build.c @@ -50,6 +50,7 @@ bool __init is_dom0less_mode(void) static void __init allocate_memory(struct domain *d, struct kernel_info *kinfo) { + struct membanks *mem = kernel_info_get_mem(kinfo); unsigned int i; paddr_t bank_size; @@ -57,7 +58,7 @@ static void __init allocate_memory(struct domain *d, struct kernel_info *kinfo) /* Don't want format this as PRIpaddr (16 digit hex) */ (unsigned long)(kinfo->unassigned_mem >> 20), d); - kinfo->mem.nr_banks = 0; + mem->nr_banks = 0; bank_size = MIN(GUEST_RAM0_SIZE, kinfo->unassigned_mem); if ( !allocate_bank_memory(d, kinfo, gaddr_to_gfn(GUEST_RAM0_BASE), bank_size) ) @@ -71,15 +72,15 @@ static void __init allocate_memory(struct domain *d, struct kernel_info *kinfo) if ( kinfo->unassigned_mem ) goto fail; - for( i = 0; i < kinfo->mem.nr_banks; i++ ) + for( i = 0; i < mem->nr_banks; i++ ) { printk(XENLOG_INFO "%pd BANK[%d] %#"PRIpaddr"-%#"PRIpaddr" (%ldMB)\n", d, i, - kinfo->mem.bank[i].start, - kinfo->mem.bank[i].start + kinfo->mem.bank[i].size, + mem->bank[i].start, + mem->bank[i].start + mem->bank[i].size, /* Don't want format this as PRIpaddr (16 digit hex) */ - (unsigned long)(kinfo->mem.bank[i].size >> 20)); + (unsigned long)(mem->bank[i].size >> 20)); } return; @@ -641,12 +642,13 @@ static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo) if ( ret ) goto err; - ret = make_memory_node(d, kinfo->fdt, addrcells, sizecells, &kinfo->mem); + ret = make_memory_node(d, kinfo->fdt, addrcells, sizecells, + kernel_info_get_mem(kinfo)); if ( ret ) goto err; ret = make_resv_memory_node(d, kinfo->fdt, addrcells, sizecells, - &kinfo->shm_mem); + &kinfo->shm_mem.common); if ( ret ) goto err; @@ -741,7 +743,7 @@ static int __init alloc_xenstore_evtchn(struct domain *d) static int __init construct_domU(struct domain *d, const struct dt_device_node *node) { - struct kernel_info kinfo = {}; + struct kernel_info kinfo = KERNEL_INFO_INIT; const char *dom0less_enhanced; int rc; u64 mem; diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 085d88671ebc..62fcdfbdaff2 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -142,6 +142,7 @@ static bool __init insert_11_bank(struct domain *d, struct page_info *pg, unsigned int order) { + struct membanks *mem = kernel_info_get_mem(kinfo); unsigned int i; int res; mfn_t smfn; @@ -158,9 +159,9 @@ static bool __init insert_11_bank(struct domain *d, (unsigned long)(kinfo->unassigned_mem >> 20), order); - if ( kinfo->mem.nr_banks > 0 && + if ( mem->nr_banks > 0 && size < MB(128) && - start + size < kinfo->mem.bank[0].start ) + start + size < mem->bank[0].start ) { D11PRINT("Allocation below bank 0 is too small, not using\n"); goto fail; @@ -172,17 +173,17 @@ static bool __init insert_11_bank(struct domain *d, kinfo->unassigned_mem -= size; - if ( kinfo->mem.nr_banks == 0 ) + if ( mem->nr_banks == 0 ) { - kinfo->mem.bank[0].start = start; - kinfo->mem.bank[0].size = size; - kinfo->mem.nr_banks = 1; + mem->bank[0].start = start; + mem->bank[0].size = size; + mem->nr_banks = 1; return true; } - for( i = 0; i < kinfo->mem.nr_banks; i++ ) + for( i = 0; i < mem->nr_banks; i++ ) { - struct membank *bank = &kinfo->mem.bank[i]; + struct membank *bank = &mem->bank[i]; /* If possible merge new memory into the start of the bank */ if ( bank->start == start+size ) @@ -205,24 +206,24 @@ static bool __init insert_11_bank(struct domain *d, * could have inserted the memory into/before we would already * have done so, so this must be the right place. */ - if ( start + size < bank->start && kinfo->mem.nr_banks < NR_MEM_BANKS ) + if ( start + size < bank->start && mem->nr_banks < mem->max_banks ) { memmove(bank + 1, bank, - sizeof(*bank) * (kinfo->mem.nr_banks - i)); - kinfo->mem.nr_banks++; + sizeof(*bank) * (mem->nr_banks - i)); + mem->nr_banks++; bank->start = start; bank->size = size; return true; } } - if ( i == kinfo->mem.nr_banks && kinfo->mem.nr_banks < NR_MEM_BANKS ) + if ( i == mem->nr_banks && mem->nr_banks < mem->max_banks ) { - struct membank *bank = &kinfo->mem.bank[kinfo->mem.nr_banks]; + struct membank *bank = &mem->bank[mem->nr_banks]; bank->start = start; bank->size = size; - kinfo->mem.nr_banks++; + mem->nr_banks++; return true; } @@ -294,6 +295,7 @@ static void __init allocate_memory_11(struct domain *d, const unsigned int min_low_order = get_order_from_bytes(min_t(paddr_t, dom0_mem, MB(128))); const unsigned int min_order = get_order_from_bytes(MB(4)); + struct membanks *mem = kernel_info_get_mem(kinfo); struct page_info *pg; unsigned int order = get_allocation_size(kinfo->unassigned_mem); unsigned int i; @@ -312,7 +314,7 @@ static void __init allocate_memory_11(struct domain *d, /* Don't want format this as PRIpaddr (16 digit hex) */ (unsigned long)(kinfo->unassigned_mem >> 20)); - kinfo->mem.nr_banks = 0; + mem->nr_banks = 0; /* * First try and allocate the largest thing we can as low as @@ -350,7 +352,7 @@ static void __init allocate_memory_11(struct domain *d, * continue allocating from above the lowmem and fill in banks. */ order = get_allocation_size(kinfo->unassigned_mem); - while ( kinfo->unassigned_mem && kinfo->mem.nr_banks < NR_MEM_BANKS ) + while ( kinfo->unassigned_mem && mem->nr_banks < mem->max_banks ) { pg = alloc_domheap_pages(d, order, lowmem ? MEMF_bits(lowmem_bitsize) : 0); @@ -374,7 +376,7 @@ static void __init allocate_memory_11(struct domain *d, if ( !insert_11_bank(d, kinfo, pg, order) ) { - if ( kinfo->mem.nr_banks == NR_MEM_BANKS ) + if ( mem->nr_banks == mem->max_banks ) /* Nothing more we can do. */ break; @@ -404,14 +406,14 @@ static void __init allocate_memory_11(struct domain *d, panic("Failed to allocate requested dom0 memory. %ldMB unallocated\n", (unsigned long)kinfo->unassigned_mem >> 20); - for( i = 0; i < kinfo->mem.nr_banks; i++ ) + for( i = 0; i < mem->nr_banks; i++ ) { printk("BANK[%d] %#"PRIpaddr"-%#"PRIpaddr" (%ldMB)\n", i, - kinfo->mem.bank[i].start, - kinfo->mem.bank[i].start + kinfo->mem.bank[i].size, + mem->bank[i].start, + mem->bank[i].start + mem->bank[i].size, /* Don't want format this as PRIpaddr (16 digit hex) */ - (unsigned long)(kinfo->mem.bank[i].size >> 20)); + (unsigned long)(mem->bank[i].size >> 20)); } } @@ -419,6 +421,7 @@ static void __init allocate_memory_11(struct domain *d, bool __init allocate_bank_memory(struct domain *d, struct kernel_info *kinfo, gfn_t sgfn, paddr_t tot_size) { + struct membanks *mem = kernel_info_get_mem(kinfo); int res; struct page_info *pg; struct membank *bank; @@ -432,7 +435,7 @@ bool __init allocate_bank_memory(struct domain *d, struct kernel_info *kinfo, if ( tot_size == 0 ) return true; - bank = &kinfo->mem.bank[kinfo->mem.nr_banks]; + bank = &mem->bank[mem->nr_banks]; bank->start = gfn_to_gaddr(sgfn); bank->size = tot_size; @@ -472,7 +475,7 @@ bool __init allocate_bank_memory(struct domain *d, struct kernel_info *kinfo, tot_size -= (1ULL << (PAGE_SHIFT + order)); } - kinfo->mem.nr_banks++; + mem->nr_banks++; kinfo->unassigned_mem -= bank->size; return true; @@ -757,7 +760,7 @@ int __init domain_fdt_begin_node(void *fdt, const char *name, uint64_t unit) int __init make_memory_node(const struct domain *d, void *fdt, int addrcells, int sizecells, - struct meminfo *mem) + const struct membanks *mem) { unsigned int i; int res, reg_size = addrcells + sizecells; @@ -817,12 +820,12 @@ int __init make_memory_node(const struct domain *d, static int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn, void *data) { - struct meminfo *ext_regions = data; + struct membanks *ext_regions = data; paddr_t start, size; paddr_t s = pfn_to_paddr(s_gfn); paddr_t e = pfn_to_paddr(e_gfn); - if ( ext_regions->nr_banks >= ARRAY_SIZE(ext_regions->bank) ) + if ( ext_regions->nr_banks >= ext_regions->max_banks ) return 0; /* @@ -864,9 +867,11 @@ static int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn, * - grant table space */ static int __init find_unallocated_memory(const struct kernel_info *kinfo, - struct meminfo *ext_regions) + struct membanks *ext_regions) { - const struct meminfo *assign_mem = &kinfo->mem; + const struct membanks *kinfo_mem = kernel_info_get_mem(kinfo); + const struct membanks *mem = bootinfo_get_mem(); + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); struct rangeset *unalloc_mem; paddr_t start, end; unsigned int i; @@ -879,10 +884,10 @@ static int __init find_unallocated_memory(const struct kernel_info *kinfo, return -ENOMEM; /* Start with all available RAM */ - for ( i = 0; i < bootinfo.mem.nr_banks; i++ ) + for ( i = 0; i < mem->nr_banks; i++ ) { - start = bootinfo.mem.bank[i].start; - end = bootinfo.mem.bank[i].start + bootinfo.mem.bank[i].size; + start = mem->bank[i].start; + end = mem->bank[i].start + mem->bank[i].size; res = rangeset_add_range(unalloc_mem, PFN_DOWN(start), PFN_DOWN(end - 1)); if ( res ) @@ -894,10 +899,10 @@ static int __init find_unallocated_memory(const struct kernel_info *kinfo, } /* Remove RAM assigned to Dom0 */ - for ( i = 0; i < assign_mem->nr_banks; i++ ) + for ( i = 0; i < kinfo_mem->nr_banks; i++ ) { - start = assign_mem->bank[i].start; - end = assign_mem->bank[i].start + assign_mem->bank[i].size; + start = kinfo_mem->bank[i].start; + end = kinfo_mem->bank[i].start + kinfo_mem->bank[i].size; res = rangeset_remove_range(unalloc_mem, PFN_DOWN(start), PFN_DOWN(end - 1)); if ( res ) @@ -909,11 +914,10 @@ static int __init find_unallocated_memory(const struct kernel_info *kinfo, } /* Remove reserved-memory regions */ - for ( i = 0; i < bootinfo.reserved_mem.nr_banks; i++ ) + for ( i = 0; i < reserved_mem->nr_banks; i++ ) { - start = bootinfo.reserved_mem.bank[i].start; - end = bootinfo.reserved_mem.bank[i].start + - bootinfo.reserved_mem.bank[i].size; + start = reserved_mem->bank[i].start; + end = reserved_mem->bank[i].start + reserved_mem->bank[i].size; res = rangeset_remove_range(unalloc_mem, PFN_DOWN(start), PFN_DOWN(end - 1)); if ( res ) @@ -991,7 +995,7 @@ static int __init handle_pci_range(const struct dt_device_node *dev, * - PCI aperture */ static int __init find_memory_holes(const struct kernel_info *kinfo, - struct meminfo *ext_regions) + struct membanks *ext_regions) { struct dt_device_node *np; struct rangeset *mem_holes; @@ -1081,7 +1085,7 @@ out: } static int __init find_domU_holes(const struct kernel_info *kinfo, - struct meminfo *ext_regions) + struct membanks *ext_regions) { unsigned int i; uint64_t bankend; @@ -1093,7 +1097,9 @@ static int __init find_domU_holes(const struct kernel_info *kinfo, { struct membank *ext_bank = &(ext_regions->bank[ext_regions->nr_banks]); - ext_bank->start = ROUNDUP(bankbase[i] + kinfo->mem.bank[i].size, SZ_2M); + ext_bank->start = ROUNDUP(bankbase[i] + + kernel_info_get_mem(kinfo)->bank[i].size, + SZ_2M); bankend = ~0ULL >> (64 - p2m_ipa_bits); bankend = min(bankend, bankbase[i] + banksize[i] - 1); @@ -1121,7 +1127,7 @@ int __init make_hypervisor_node(struct domain *d, gic_interrupt_t intr; int res; void *fdt = kinfo->fdt; - struct meminfo *ext_regions = NULL; + struct membanks *ext_regions = NULL; unsigned int i, nr_ext_regions; dt_dprintk("Create hypervisor node\n"); @@ -1157,10 +1163,12 @@ int __init make_hypervisor_node(struct domain *d, } else { - ext_regions = xzalloc(struct meminfo); + ext_regions = (struct membanks *)xzalloc(struct meminfo); if ( !ext_regions ) return -ENOMEM; + ext_regions->max_banks = NR_MEM_BANKS; + if ( is_domain_direct_mapped(d) ) { if ( !is_iommu_enabled(d) ) @@ -1729,6 +1737,7 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, if ( node == dt_host ) { + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); int addrcells = dt_child_n_addr_cells(node); int sizecells = dt_child_n_size_cells(node); @@ -1754,7 +1763,8 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, if ( res ) return res; - res = make_memory_node(d, kinfo->fdt, addrcells, sizecells, &kinfo->mem); + res = make_memory_node(d, kinfo->fdt, addrcells, sizecells, + kernel_info_get_mem(kinfo)); if ( res ) return res; @@ -1762,16 +1772,16 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, * Create a second memory node to store the ranges covering * reserved-memory regions. */ - if ( bootinfo.reserved_mem.nr_banks > 0 ) + if ( reserved_mem->nr_banks > 0 ) { res = make_memory_node(d, kinfo->fdt, addrcells, sizecells, - &bootinfo.reserved_mem); + reserved_mem); if ( res ) return res; } res = make_resv_memory_node(d, kinfo->fdt, addrcells, sizecells, - &kinfo->shm_mem); + &kinfo->shm_mem.common); if ( res ) return res; } @@ -2040,7 +2050,7 @@ int __init construct_domain(struct domain *d, struct kernel_info *kinfo) static int __init construct_dom0(struct domain *d) { - struct kernel_info kinfo = {}; + struct kernel_info kinfo = KERNEL_INFO_INIT; int rc; /* Sanity! */ diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h index 0cb29f90a066..199f5260229d 100644 --- a/xen/arch/arm/efi/efi-boot.h +++ b/xen/arch/arm/efi/efi-boot.h @@ -157,14 +157,14 @@ static void __init *lookup_fdt_config_table(EFI_SYSTEM_TABLE *sys_table) return fdt; } -static bool __init meminfo_add_bank(struct meminfo *mem, +static bool __init meminfo_add_bank(struct membanks *mem, EFI_MEMORY_DESCRIPTOR *desc) { struct membank *bank; paddr_t start = desc->PhysicalStart; paddr_t size = desc->NumberOfPages * EFI_PAGE_SIZE; - if ( mem->nr_banks >= NR_MEM_BANKS ) + if ( mem->nr_banks >= mem->max_banks ) return false; #ifdef CONFIG_ACPI if ( check_reserved_regions_overlap(start, size) ) @@ -198,7 +198,7 @@ static EFI_STATUS __init efi_process_memory_map_bootinfo(EFI_MEMORY_DESCRIPTOR * (desc_ptr->Type == EfiBootServicesCode || desc_ptr->Type == EfiBootServicesData))) ) { - if ( !meminfo_add_bank(&bootinfo.mem, desc_ptr) ) + if ( !meminfo_add_bank(bootinfo_get_mem(), desc_ptr) ) { PrintStr(L"Warning: All " __stringify(NR_MEM_BANKS) " bootinfo mem banks exhausted.\r\n"); @@ -208,7 +208,7 @@ static EFI_STATUS __init efi_process_memory_map_bootinfo(EFI_MEMORY_DESCRIPTOR * #ifdef CONFIG_ACPI else if ( desc_ptr->Type == EfiACPIReclaimMemory ) { - if ( !meminfo_add_bank(&bootinfo.acpi, desc_ptr) ) + if ( !meminfo_add_bank(bootinfo_get_acpi(), desc_ptr) ) { PrintStr(L"Error: All " __stringify(NR_MEM_BANKS) " acpi meminfo mem banks exhausted.\r\n"); diff --git a/xen/arch/arm/efi/efi-dom0.c b/xen/arch/arm/efi/efi-dom0.c index aae0f979112a..baee8ab716cb 100644 --- a/xen/arch/arm/efi/efi-dom0.c +++ b/xen/arch/arm/efi/efi-dom0.c @@ -44,7 +44,7 @@ size_t __init estimate_efi_size(unsigned int mem_nr_banks) unsigned int acpi_mem_nr_banks = 0; if ( !acpi_disabled ) - acpi_mem_nr_banks = bootinfo.acpi.nr_banks; + acpi_mem_nr_banks = bootinfo_get_acpi()->nr_banks; size = ROUNDUP(est_size + ect_size + fw_vendor_size, 8); /* plus 1 for new created tables */ @@ -107,9 +107,10 @@ static void __init fill_efi_memory_descriptor(EFI_MEMORY_DESCRIPTOR *desc, } void __init acpi_create_efi_mmap_table(struct domain *d, - const struct meminfo *mem, + const struct membanks *mem, struct membank tbl_add[]) { + const struct membanks *acpi = bootinfo_get_acpi(); EFI_MEMORY_DESCRIPTOR *desc; unsigned int i; u8 *base_ptr; @@ -122,10 +123,10 @@ void __init acpi_create_efi_mmap_table(struct domain *d, fill_efi_memory_descriptor(desc, EfiConventionalMemory, mem->bank[i].start, mem->bank[i].size); - for ( i = 0; i < bootinfo.acpi.nr_banks; i++, desc++ ) + for ( i = 0; i < acpi->nr_banks; i++, desc++ ) fill_efi_memory_descriptor(desc, EfiACPIReclaimMemory, - bootinfo.acpi.bank[i].start, - bootinfo.acpi.bank[i].size); + acpi->bank[i].start, + acpi->bank[i].size); fill_efi_memory_descriptor(desc, EfiACPIReclaimMemory, d->arch.efi_acpi_gpa, d->arch.efi_acpi_len); @@ -133,7 +134,7 @@ void __init acpi_create_efi_mmap_table(struct domain *d, tbl_add[TBL_MMAP].start = d->arch.efi_acpi_gpa + acpi_get_table_offset(tbl_add, TBL_MMAP); tbl_add[TBL_MMAP].size = sizeof(EFI_MEMORY_DESCRIPTOR) - * (mem->nr_banks + bootinfo.acpi.nr_banks + 1); + * (mem->nr_banks + acpi->nr_banks + 1); } /* Create /hypervisor/uefi node for efi properties. */ diff --git a/xen/arch/arm/include/asm/domain_build.h b/xen/arch/arm/include/asm/domain_build.h index da9e6025f37c..a6f276cc4263 100644 --- a/xen/arch/arm/include/asm/domain_build.h +++ b/xen/arch/arm/include/asm/domain_build.h @@ -15,7 +15,7 @@ int make_cpus_node(const struct domain *d, void *fdt); int make_hypervisor_node(struct domain *d, const struct kernel_info *kinfo, int addrcells, int sizecells); int make_memory_node(const struct domain *d, void *fdt, int addrcells, - int sizecells, struct meminfo *mem); + int sizecells, const struct membanks *mem); int make_psci_node(void *fdt); int make_timer_node(const struct kernel_info *kinfo); void evtchn_allocate(struct domain *d); diff --git a/xen/arch/arm/include/asm/kernel.h b/xen/arch/arm/include/asm/kernel.h index 0a23e86c2d37..d28b843c01a9 100644 --- a/xen/arch/arm/include/asm/kernel.h +++ b/xen/arch/arm/include/asm/kernel.h @@ -78,6 +78,15 @@ struct kernel_info { }; }; +#define kernel_info_get_mem(kinfo) \ + (&(kinfo)->mem.common) + +#define KERNEL_INFO_INIT \ +{ \ + .mem.common.max_banks = NR_MEM_BANKS, \ + .shm_mem.common.max_banks = NR_MEM_BANKS, \ +} + /* * Probe the kernel to detemine its type and select a loader. * diff --git a/xen/arch/arm/include/asm/setup.h b/xen/arch/arm/include/asm/setup.h index d15a88d2e0d1..a3e1dc8fdb6c 100644 --- a/xen/arch/arm/include/asm/setup.h +++ b/xen/arch/arm/include/asm/setup.h @@ -56,8 +56,14 @@ struct membank { #endif }; -struct meminfo { +struct membanks { unsigned int nr_banks; + unsigned int max_banks; + struct membank bank[]; +}; + +struct meminfo { + struct membanks common; struct membank bank[NR_MEM_BANKS]; }; @@ -107,6 +113,19 @@ struct bootinfo { bool static_heap; }; +#ifdef CONFIG_ACPI +#define BOOTINFO_ACPI_INIT .acpi.common.max_banks = NR_MEM_BANKS, +#else +#define BOOTINFO_ACPI_INIT +#endif + +#define BOOTINFO_INIT \ +{ \ + .mem.common.max_banks = NR_MEM_BANKS, \ + .reserved_mem.common.max_banks = NR_MEM_BANKS, \ + BOOTINFO_ACPI_INIT \ +} + struct map_range_data { struct domain *d; @@ -122,6 +141,23 @@ extern struct bootinfo bootinfo; extern domid_t max_init_domid; +static inline struct membanks *bootinfo_get_mem(void) +{ + return &bootinfo.mem.common; +} + +static inline struct membanks *bootinfo_get_reserved_mem(void) +{ + return &bootinfo.reserved_mem.common; +} + +#ifdef CONFIG_ACPI +static inline struct membanks *bootinfo_get_acpi(void) +{ + return &bootinfo.acpi.common; +} +#endif + void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len); size_t estimate_efi_size(unsigned int mem_nr_banks); @@ -130,7 +166,7 @@ void acpi_create_efi_system_table(struct domain *d, struct membank tbl_add[]); void acpi_create_efi_mmap_table(struct domain *d, - const struct meminfo *mem, + const struct membanks *mem, struct membank tbl_add[]); int acpi_make_efi_nodes(void *fdt, struct membank tbl_add[]); diff --git a/xen/arch/arm/include/asm/static-shmem.h b/xen/arch/arm/include/asm/static-shmem.h index 1536ff18b895..cc6b414ed79b 100644 --- a/xen/arch/arm/include/asm/static-shmem.h +++ b/xen/arch/arm/include/asm/static-shmem.h @@ -8,7 +8,7 @@ #ifdef CONFIG_STATIC_SHM int make_resv_memory_node(const struct domain *d, void *fdt, int addrcells, - int sizecells, const struct meminfo *mem); + int sizecells, const struct membanks *mem); int process_shm(struct domain *d, struct kernel_info *kinfo, const struct dt_device_node *node); @@ -28,7 +28,7 @@ int process_shm_node(const void *fdt, int node, uint32_t address_cells, static inline int make_resv_memory_node(const struct domain *d, void *fdt, int addrcells, int sizecells, - const struct meminfo *mem) + const struct membanks *mem) { return 0; } diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c index bc3e5bd6f940..674388fa11a2 100644 --- a/xen/arch/arm/kernel.c +++ b/xen/arch/arm/kernel.c @@ -45,13 +45,14 @@ static void __init place_modules(struct kernel_info *info, { /* Align DTB and initrd size to 2Mb. Linux only requires 4 byte alignment */ const struct bootmodule *mod = info->initrd_bootmodule; + const struct membanks *mem = kernel_info_get_mem(info); const paddr_t initrd_len = ROUNDUP(mod ? mod->size : 0, MB(2)); const paddr_t dtb_len = ROUNDUP(fdt_totalsize(info->fdt), MB(2)); const paddr_t modsize = initrd_len + dtb_len; /* Convenient */ - const paddr_t rambase = info->mem.bank[0].start; - const paddr_t ramsize = info->mem.bank[0].size; + const paddr_t rambase = mem->bank[0].start; + const paddr_t ramsize = mem->bank[0].size; const paddr_t ramend = rambase + ramsize; const paddr_t kernsize = ROUNDUP(kernend, MB(2)) - kernbase; const paddr_t ram128mb = rambase + MB(128); @@ -96,11 +97,12 @@ static void __init place_modules(struct kernel_info *info, static paddr_t __init kernel_zimage_place(struct kernel_info *info) { + const struct membanks *mem = kernel_info_get_mem(info); paddr_t load_addr; #ifdef CONFIG_ARM_64 if ( (info->type == DOMAIN_64BIT) && (info->zimage.start == 0) ) - return info->mem.bank[0].start + info->zimage.text_offset; + return mem->bank[0].start + info->zimage.text_offset; #endif /* @@ -113,8 +115,8 @@ static paddr_t __init kernel_zimage_place(struct kernel_info *info) { paddr_t load_end; - load_end = info->mem.bank[0].start + info->mem.bank[0].size; - load_end = MIN(info->mem.bank[0].start + MB(128), load_end); + load_end = mem->bank[0].start + mem->bank[0].size; + load_end = MIN(mem->bank[0].start + MB(128), load_end); load_addr = load_end - info->zimage.len; /* Align to 2MB */ diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 424744ad5e1a..02bd27eb0c69 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -48,7 +48,7 @@ #include #include -struct bootinfo __initdata bootinfo; +struct bootinfo __initdata bootinfo = BOOTINFO_INIT; /* * Sanitized version of cpuinfo containing only features available on all @@ -207,6 +207,7 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e, void (*cb)(paddr_t ps, paddr_t pe), unsigned int first) { + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); unsigned int i, nr; int rc; @@ -240,14 +241,14 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e, * kinds. * * When retrieving the corresponding reserved-memory addresses - * below, we need to index the bootinfo.reserved_mem bank starting + * below, we need to index the reserved_mem->bank starting * from 0, and only counting the reserved-memory modules. Hence, * we need to use i - nr. */ - for ( ; i - nr < bootinfo.reserved_mem.nr_banks; i++ ) + for ( ; i - nr < reserved_mem->nr_banks; i++ ) { - paddr_t r_s = bootinfo.reserved_mem.bank[i - nr].start; - paddr_t r_e = r_s + bootinfo.reserved_mem.bank[i - nr].size; + paddr_t r_s = reserved_mem->bank[i - nr].start; + paddr_t r_e = r_s + reserved_mem->bank[i - nr].size; if ( s < r_e && r_s < e ) { @@ -264,18 +265,18 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e, * TODO: '*_end' could be 0 if the bank/region is at the end of the physical * address space. This is for now not handled as it requires more rework. */ -static bool __init meminfo_overlap_check(struct meminfo *meminfo, +static bool __init meminfo_overlap_check(const struct membanks *mem, paddr_t region_start, paddr_t region_size) { paddr_t bank_start = INVALID_PADDR, bank_end = 0; paddr_t region_end = region_start + region_size; - unsigned int i, bank_num = meminfo->nr_banks; + unsigned int i, bank_num = mem->nr_banks; for ( i = 0; i < bank_num; i++ ) { - bank_start = meminfo->bank[i].start; - bank_end = bank_start + meminfo->bank[i].size; + bank_start = mem->bank[i].start; + bank_end = bank_start + mem->bank[i].size; if ( region_end <= bank_start || region_start >= bank_end ) continue; @@ -339,8 +340,11 @@ void __init fw_unreserved_regions(paddr_t s, paddr_t e, bool __init check_reserved_regions_overlap(paddr_t region_start, paddr_t region_size) { - /* Check if input region is overlapping with bootinfo.reserved_mem banks */ - if ( meminfo_overlap_check(&bootinfo.reserved_mem, + /* + * Check if input region is overlapping with bootinfo_get_reserved_mem() + * banks + */ + if ( meminfo_overlap_check(bootinfo_get_reserved_mem(), region_start, region_size) ) return true; @@ -351,7 +355,7 @@ bool __init check_reserved_regions_overlap(paddr_t region_start, #ifdef CONFIG_ACPI /* Check if input region is overlapping with ACPI EfiACPIReclaimMemory */ - if ( meminfo_overlap_check(&bootinfo.acpi, region_start, region_size) ) + if ( meminfo_overlap_check(bootinfo_get_acpi(), region_start, region_size) ) return true; #endif @@ -580,6 +584,7 @@ static paddr_t __init next_module(paddr_t s, paddr_t *end) void __init init_pdx(void) { + const struct membanks *mem = bootinfo_get_mem(); paddr_t bank_start, bank_size, bank_end; /* @@ -592,18 +597,18 @@ void __init init_pdx(void) uint64_t mask = pdx_init_mask(0x0); int bank; - for ( bank = 0 ; bank < bootinfo.mem.nr_banks; bank++ ) + for ( bank = 0 ; bank < mem->nr_banks; bank++ ) { - bank_start = bootinfo.mem.bank[bank].start; - bank_size = bootinfo.mem.bank[bank].size; + bank_start = mem->bank[bank].start; + bank_size = mem->bank[bank].size; mask |= bank_start | pdx_region_mask(bank_start, bank_size); } - for ( bank = 0 ; bank < bootinfo.mem.nr_banks; bank++ ) + for ( bank = 0 ; bank < mem->nr_banks; bank++ ) { - bank_start = bootinfo.mem.bank[bank].start; - bank_size = bootinfo.mem.bank[bank].size; + bank_start = mem->bank[bank].start; + bank_size = mem->bank[bank].size; if (~mask & pdx_region_mask(bank_start, bank_size)) mask = 0; @@ -611,10 +616,10 @@ void __init init_pdx(void) pfn_pdx_hole_setup(mask >> PAGE_SHIFT); - for ( bank = 0 ; bank < bootinfo.mem.nr_banks; bank++ ) + for ( bank = 0 ; bank < mem->nr_banks; bank++ ) { - bank_start = bootinfo.mem.bank[bank].start; - bank_size = bootinfo.mem.bank[bank].size; + bank_start = mem->bank[bank].start; + bank_size = mem->bank[bank].size; bank_end = bank_start + bank_size; set_pdx_range(paddr_to_pfn(bank_start), @@ -636,18 +641,19 @@ void __init init_pdx(void) void __init populate_boot_allocator(void) { unsigned int i; - const struct meminfo *banks = &bootinfo.mem; + const struct membanks *banks = bootinfo_get_mem(); + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); paddr_t s, e; if ( bootinfo.static_heap ) { - for ( i = 0 ; i < bootinfo.reserved_mem.nr_banks; i++ ) + for ( i = 0 ; i < reserved_mem->nr_banks; i++ ) { - if ( bootinfo.reserved_mem.bank[i].type != MEMBANK_STATIC_HEAP ) + if ( reserved_mem->bank[i].type != MEMBANK_STATIC_HEAP ) continue; - s = bootinfo.reserved_mem.bank[i].start; - e = s + bootinfo.reserved_mem.bank[i].size; + s = reserved_mem->bank[i].start; + e = s + reserved_mem->bank[i].size; #ifdef CONFIG_ARM_32 /* Avoid the xenheap, note that the xenheap cannot across a bank */ if ( s <= mfn_to_maddr(directmap_mfn_start) && diff --git a/xen/arch/arm/static-memory.c b/xen/arch/arm/static-memory.c index cffbab7241b7..34bd12696a53 100644 --- a/xen/arch/arm/static-memory.c +++ b/xen/arch/arm/static-memory.c @@ -85,6 +85,7 @@ static int __init parse_static_mem_prop(const struct dt_device_node *node, void __init allocate_static_memory(struct domain *d, struct kernel_info *kinfo, const struct dt_device_node *node) { + struct membanks *mem = kernel_info_get_mem(kinfo); u32 addr_cells, size_cells, reg_cells; unsigned int nr_banks, gbank, bank = 0; const uint64_t rambase[] = GUEST_RAM_BANK_BASES; @@ -106,7 +107,7 @@ void __init allocate_static_memory(struct domain *d, struct kernel_info *kinfo, */ gbank = 0; gsize = ramsize[gbank]; - kinfo->mem.bank[gbank].start = rambase[gbank]; + mem->bank[gbank].start = rambase[gbank]; nr_banks = length / (reg_cells * sizeof (u32)); for ( ; bank < nr_banks; bank++ ) @@ -122,7 +123,7 @@ void __init allocate_static_memory(struct domain *d, struct kernel_info *kinfo, while ( 1 ) { /* Map as much as possible the static range to the guest bank */ - if ( !append_static_memory_to_bank(d, &kinfo->mem.bank[gbank], smfn, + if ( !append_static_memory_to_bank(d, &mem->bank[gbank], smfn, min(psize, gsize)) ) goto fail; @@ -153,14 +154,14 @@ void __init allocate_static_memory(struct domain *d, struct kernel_info *kinfo, /* Update to the next guest bank. */ gbank++; gsize = ramsize[gbank]; - kinfo->mem.bank[gbank].start = rambase[gbank]; + mem->bank[gbank].start = rambase[gbank]; } } tot_size += psize; } - kinfo->mem.nr_banks = ++gbank; + mem->nr_banks = ++gbank; kinfo->unassigned_mem -= tot_size; /* @@ -190,6 +191,7 @@ void __init allocate_static_memory(struct domain *d, struct kernel_info *kinfo, void __init assign_static_memory_11(struct domain *d, struct kernel_info *kinfo, const struct dt_device_node *node) { + struct membanks *mem = kernel_info_get_mem(kinfo); u32 addr_cells, size_cells, reg_cells; unsigned int nr_banks, bank = 0; const __be32 *cell; @@ -206,7 +208,7 @@ void __init assign_static_memory_11(struct domain *d, struct kernel_info *kinfo, reg_cells = addr_cells + size_cells; nr_banks = length / (reg_cells * sizeof(u32)); - if ( nr_banks > NR_MEM_BANKS ) + if ( nr_banks > mem->max_banks ) { printk(XENLOG_ERR "%pd: exceed max number of supported guest memory banks.\n", d); @@ -224,15 +226,15 @@ void __init assign_static_memory_11(struct domain *d, struct kernel_info *kinfo, d, bank, pbase, pbase + psize); /* One guest memory bank is matched with one physical memory bank. */ - kinfo->mem.bank[bank].start = pbase; - if ( !append_static_memory_to_bank(d, &kinfo->mem.bank[bank], + mem->bank[bank].start = pbase; + if ( !append_static_memory_to_bank(d, &mem->bank[bank], smfn, psize) ) goto fail; kinfo->unassigned_mem -= psize; } - kinfo->mem.nr_banks = nr_banks; + mem->nr_banks = nr_banks; /* * The property 'memory' should match the amount of memory given to @@ -257,14 +259,15 @@ void __init assign_static_memory_11(struct domain *d, struct kernel_info *kinfo, /* Static memory initialization */ void __init init_staticmem_pages(void) { + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); unsigned int bank; - for ( bank = 0 ; bank < bootinfo.reserved_mem.nr_banks; bank++ ) + for ( bank = 0 ; bank < reserved_mem->nr_banks; bank++ ) { - if ( bootinfo.reserved_mem.bank[bank].type == MEMBANK_STATIC_DOMAIN ) + if ( reserved_mem->bank[bank].type == MEMBANK_STATIC_DOMAIN ) { - mfn_t bank_start = _mfn(PFN_UP(bootinfo.reserved_mem.bank[bank].start)); - unsigned long bank_pages = PFN_DOWN(bootinfo.reserved_mem.bank[bank].size); + mfn_t bank_start = _mfn(PFN_UP(reserved_mem->bank[bank].start)); + unsigned long bank_pages = PFN_DOWN(reserved_mem->bank[bank].size); mfn_t bank_end = mfn_add(bank_start, bank_pages); if ( mfn_x(bank_end) <= mfn_x(bank_start) ) diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index 40a0e860c79d..fdc3bccde402 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -10,22 +10,23 @@ static int __init acquire_nr_borrower_domain(struct domain *d, paddr_t pbase, paddr_t psize, unsigned long *nr_borrowers) { + const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); unsigned int bank; /* Iterate reserved memory to find requested shm bank. */ - for ( bank = 0 ; bank < bootinfo.reserved_mem.nr_banks; bank++ ) + for ( bank = 0 ; bank < reserved_mem->nr_banks; bank++ ) { - paddr_t bank_start = bootinfo.reserved_mem.bank[bank].start; - paddr_t bank_size = bootinfo.reserved_mem.bank[bank].size; + paddr_t bank_start = reserved_mem->bank[bank].start; + paddr_t bank_size = reserved_mem->bank[bank].size; if ( (pbase == bank_start) && (psize == bank_size) ) break; } - if ( bank == bootinfo.reserved_mem.nr_banks ) + if ( bank == reserved_mem->nr_banks ) return -ENOENT; - *nr_borrowers = bootinfo.reserved_mem.bank[bank].nr_shm_borrowers; + *nr_borrowers = reserved_mem->bank[bank].nr_shm_borrowers; return 0; } @@ -157,17 +158,17 @@ static int __init assign_shared_memory(struct domain *d, return ret; } -static int __init append_shm_bank_to_domain(struct kernel_info *kinfo, +static int __init append_shm_bank_to_domain(struct membanks *shm_mem, paddr_t start, paddr_t size, const char *shm_id) { - if ( kinfo->shm_mem.nr_banks >= NR_MEM_BANKS ) + if ( shm_mem->nr_banks >= shm_mem->max_banks ) return -ENOMEM; - kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].start = start; - kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].size = size; - safe_strcpy(kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].shm_id, shm_id); - kinfo->shm_mem.nr_banks++; + shm_mem->bank[shm_mem->nr_banks].start = start; + shm_mem->bank[shm_mem->nr_banks].size = size; + safe_strcpy(shm_mem->bank[shm_mem->nr_banks].shm_id, shm_id); + shm_mem->nr_banks++; return 0; } @@ -269,7 +270,8 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo, * Record static shared memory region info for later setting * up shm-node in guest device tree. */ - ret = append_shm_bank_to_domain(kinfo, gbase, psize, shm_id); + ret = append_shm_bank_to_domain(&kinfo->shm_mem.common, gbase, psize, + shm_id); if ( ret ) return ret; } @@ -279,7 +281,7 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo, static int __init make_shm_memory_node(const struct domain *d, void *fdt, int addrcells, int sizecells, - const struct meminfo *mem) + const struct membanks *mem) { unsigned int i = 0; int res = 0; @@ -350,7 +352,7 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, const struct fdt_property *prop, *prop_id, *prop_role; const __be32 *cell; paddr_t paddr, gaddr, size, end; - struct meminfo *mem = &bootinfo.reserved_mem; + struct membanks *mem = bootinfo_get_reserved_mem(); unsigned int i; int len; bool owner = false; @@ -460,7 +462,7 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, if ( i == mem->nr_banks ) { - if ( i < NR_MEM_BANKS ) + if (i < mem->max_banks) { if ( check_reserved_regions_overlap(paddr, size) ) return -EINVAL; @@ -490,7 +492,7 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, int __init make_resv_memory_node(const struct domain *d, void *fdt, int addrcells, int sizecells, - const struct meminfo *mem) + const struct membanks *mem) { int res = 0; /* Placeholder for reserved-memory\0 */ From patchwork Tue Mar 12 13:03:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589964 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AD8C9C54E68 for ; Tue, 12 Mar 2024 13:04:06 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691813.1078232 (Exim 4.92) (envelope-from ) id 1rk1nS-0005JM-9Y; Tue, 12 Mar 2024 13:03:58 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691813.1078232; Tue, 12 Mar 2024 13:03:58 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nS-0005IX-5X; Tue, 12 Mar 2024 13:03:58 +0000 Received: by outflank-mailman (input) for mailman id 691813; Tue, 12 Mar 2024 13:03:56 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nQ-0004WU-MH for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:03:56 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id fafeec37-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:03:54 +0100 (CET) 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 AC53F1570; Tue, 12 Mar 2024 06:04:31 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 679BE3F762; Tue, 12 Mar 2024 06:03:53 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fafeec37-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk Subject: [PATCH 04/11] xen/arm: Conditional compilation of kernel_info.shm_mem member Date: Tue, 12 Mar 2024 13:03:24 +0000 Message-Id: <20240312130331.78418-5-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 The user of shm_mem member of the 'struct kernel_info' is only the code managing the static shared memory feature, which can be compiled out using CONFIG_STATIC_SHM, so in case the feature is not requested, that member won't be used and will waste memory space. To address this issue, protect the member with the Kconfig parameter and modify the signature of the only function using it to remove any reference to the member from outside the static-shmem module. Signed-off-by: Luca Fancellu Reviewed-by: Michal Orzel --- xen/arch/arm/dom0less-build.c | 3 +-- xen/arch/arm/domain_build.c | 3 +-- xen/arch/arm/include/asm/kernel.h | 10 +++++++++- xen/arch/arm/include/asm/static-shmem.h | 11 ++++++----- xen/arch/arm/static-shmem.c | 8 +++++--- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c index 0165da6f2986..fe2a771d4984 100644 --- a/xen/arch/arm/dom0less-build.c +++ b/xen/arch/arm/dom0less-build.c @@ -647,8 +647,7 @@ static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo) if ( ret ) goto err; - ret = make_resv_memory_node(d, kinfo->fdt, addrcells, sizecells, - &kinfo->shm_mem.common); + ret = make_resv_memory_node(d, kinfo, addrcells, sizecells); if ( ret ) goto err; diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 62fcdfbdaff2..b254f252e7cb 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -1780,8 +1780,7 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, return res; } - res = make_resv_memory_node(d, kinfo->fdt, addrcells, sizecells, - &kinfo->shm_mem.common); + res = make_resv_memory_node(d, kinfo, addrcells, sizecells); if ( res ) return res; } diff --git a/xen/arch/arm/include/asm/kernel.h b/xen/arch/arm/include/asm/kernel.h index d28b843c01a9..5785da985ccf 100644 --- a/xen/arch/arm/include/asm/kernel.h +++ b/xen/arch/arm/include/asm/kernel.h @@ -39,7 +39,9 @@ struct kernel_info { void *fdt; /* flat device tree */ paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */ struct meminfo mem; +#ifdef CONFIG_STATIC_SHM struct meminfo shm_mem; +#endif /* kernel entry point */ paddr_t entry; @@ -81,10 +83,16 @@ struct kernel_info { #define kernel_info_get_mem(kinfo) \ (&(kinfo)->mem.common) +#ifdef CONFIG_STATIC_SHM +#define KERNEL_INFO_SHM_MEM_INIT .shm_mem.common.max_banks = NR_MEM_BANKS, +#else +#define KERNEL_INFO_SHM_MEM_INIT +#endif + #define KERNEL_INFO_INIT \ { \ .mem.common.max_banks = NR_MEM_BANKS, \ - .shm_mem.common.max_banks = NR_MEM_BANKS, \ + KERNEL_INFO_SHM_MEM_INIT \ } /* diff --git a/xen/arch/arm/include/asm/static-shmem.h b/xen/arch/arm/include/asm/static-shmem.h index cc6b414ed79b..108cedb55a9f 100644 --- a/xen/arch/arm/include/asm/static-shmem.h +++ b/xen/arch/arm/include/asm/static-shmem.h @@ -7,8 +7,9 @@ #ifdef CONFIG_STATIC_SHM -int make_resv_memory_node(const struct domain *d, void *fdt, int addrcells, - int sizecells, const struct membanks *mem); +int make_resv_memory_node(const struct domain *d, + const struct kernel_info *kinfo, int addrcells, + int sizecells); int process_shm(struct domain *d, struct kernel_info *kinfo, const struct dt_device_node *node); @@ -26,9 +27,9 @@ int process_shm_node(const void *fdt, int node, uint32_t address_cells, #else /* !CONFIG_STATIC_SHM */ -static inline int make_resv_memory_node(const struct domain *d, void *fdt, - int addrcells, int sizecells, - const struct membanks *mem) +static inline int make_resv_memory_node(const struct domain *d, + const struct kernel_info *kinfo, + int addrcells, int sizecells) { return 0; } diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index fdc3bccde402..8b7da952be6e 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -490,13 +490,15 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, return 0; } -int __init make_resv_memory_node(const struct domain *d, void *fdt, - int addrcells, int sizecells, - const struct membanks *mem) +int __init make_resv_memory_node(const struct domain *d, + const struct kernel_info *kinfo, + int addrcells, int sizecells) { int res = 0; /* Placeholder for reserved-memory\0 */ const char resvbuf[16] = "reserved-memory"; + const struct membanks *mem = &kinfo->shm_mem.common; + void *fdt = kinfo->fdt; if ( mem->nr_banks == 0 ) /* No shared memory provided. */ From patchwork Tue Mar 12 13:03:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589966 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 95C9DC54E5D for ; Tue, 12 Mar 2024 13:04:08 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691814.1078248 (Exim 4.92) (envelope-from ) id 1rk1nT-0005mp-Om; Tue, 12 Mar 2024 13:03:59 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691814.1078248; Tue, 12 Mar 2024 13:03:59 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nT-0005me-K8; Tue, 12 Mar 2024 13:03:59 +0000 Received: by outflank-mailman (input) for mailman id 691814; Tue, 12 Mar 2024 13:03:57 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nR-0004WU-TL for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:03:57 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id fbd26df8-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:03:56 +0100 (CET) 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 01ADE15A1; Tue, 12 Mar 2024 06:04:33 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B16933F762; Tue, 12 Mar 2024 06:03:54 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fbd26df8-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk Subject: [PATCH 05/11] xen/arm: Introduce helper for static memory pages Date: Tue, 12 Mar 2024 13:03:25 +0000 Message-Id: <20240312130331.78418-6-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 Introduce a new helper function in the static-memory module that can be called to manage static memory banks, this is done to reuse the code when other modules would like to manage static memory banks that are not part of the reserved_mem structure. Signed-off-by: Luca Fancellu Reviewed-by: Michal Orzel --- xen/arch/arm/include/asm/static-memory.h | 12 ++++++++++++ xen/arch/arm/static-memory.c | 12 +----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/xen/arch/arm/include/asm/static-memory.h b/xen/arch/arm/include/asm/static-memory.h index 3e3efd70c38d..665d4df50eda 100644 --- a/xen/arch/arm/include/asm/static-memory.h +++ b/xen/arch/arm/include/asm/static-memory.h @@ -7,6 +7,18 @@ #ifdef CONFIG_STATIC_MEMORY +static inline void init_staticmem_bank(const struct membank *bank) +{ + mfn_t bank_start = _mfn(PFN_UP(bank->start)); + unsigned long bank_pages = PFN_DOWN(bank->size); + mfn_t bank_end = mfn_add(bank_start, bank_pages); + + if ( mfn_x(bank_end) <= mfn_x(bank_start) ) + return; + + unprepare_staticmem_pages(mfn_to_page(bank_start), bank_pages, false); +} + void allocate_static_memory(struct domain *d, struct kernel_info *kinfo, const struct dt_device_node *node); void assign_static_memory_11(struct domain *d, struct kernel_info *kinfo, diff --git a/xen/arch/arm/static-memory.c b/xen/arch/arm/static-memory.c index 34bd12696a53..d4585c5a0633 100644 --- a/xen/arch/arm/static-memory.c +++ b/xen/arch/arm/static-memory.c @@ -265,17 +265,7 @@ void __init init_staticmem_pages(void) for ( bank = 0 ; bank < reserved_mem->nr_banks; bank++ ) { if ( reserved_mem->bank[bank].type == MEMBANK_STATIC_DOMAIN ) - { - mfn_t bank_start = _mfn(PFN_UP(reserved_mem->bank[bank].start)); - unsigned long bank_pages = PFN_DOWN(reserved_mem->bank[bank].size); - mfn_t bank_end = mfn_add(bank_start, bank_pages); - - if ( mfn_x(bank_end) <= mfn_x(bank_start) ) - return; - - unprepare_staticmem_pages(mfn_to_page(bank_start), - bank_pages, false); - } + init_staticmem_bank(&reserved_mem->bank[bank]); } } From patchwork Tue Mar 12 13:03:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589969 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0357CC54E60 for ; Tue, 12 Mar 2024 13:04:13 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691815.1078258 (Exim 4.92) (envelope-from ) id 1rk1nU-00063g-Vp; Tue, 12 Mar 2024 13:04:00 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691815.1078258; Tue, 12 Mar 2024 13:04:00 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nU-00063V-Sv; Tue, 12 Mar 2024 13:04:00 +0000 Received: by outflank-mailman (input) for mailman id 691815; Tue, 12 Mar 2024 13:03:59 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nT-0004WU-6j for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:03:59 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id fc860517-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:03:57 +0100 (CET) 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 4B2821570; Tue, 12 Mar 2024 06:04:34 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 06C973F762; Tue, 12 Mar 2024 06:03:55 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fc860517-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk Subject: [PATCH 06/11] xen/arm: Avoid code duplication in find_unallocated_memory Date: Tue, 12 Mar 2024 13:03:26 +0000 Message-Id: <20240312130331.78418-7-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 The function find_unallocated_memory is using the same code to loop through 3 structure of the same type, in order to avoid code duplication, rework the code to have only one loop that goes through all the structures. Signed-off-by: Luca Fancellu --- xen/arch/arm/domain_build.c | 62 ++++++++++--------------------------- 1 file changed, 17 insertions(+), 45 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index b254f252e7cb..d0f2ac6060eb 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -869,12 +869,14 @@ static int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn, static int __init find_unallocated_memory(const struct kernel_info *kinfo, struct membanks *ext_regions) { - const struct membanks *kinfo_mem = kernel_info_get_mem(kinfo); - const struct membanks *mem = bootinfo_get_mem(); - const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); + const struct membanks *mem_banks[] = { + bootinfo_get_mem(), + kernel_info_get_mem(kinfo), + bootinfo_get_reserved_mem(), + }; struct rangeset *unalloc_mem; paddr_t start, end; - unsigned int i; + unsigned int i, j; int res; dt_dprintk("Find unallocated memory for extended regions\n"); @@ -883,50 +885,20 @@ static int __init find_unallocated_memory(const struct kernel_info *kinfo, if ( !unalloc_mem ) return -ENOMEM; - /* Start with all available RAM */ - for ( i = 0; i < mem->nr_banks; i++ ) - { - start = mem->bank[i].start; - end = mem->bank[i].start + mem->bank[i].size; - res = rangeset_add_range(unalloc_mem, PFN_DOWN(start), - PFN_DOWN(end - 1)); - if ( res ) - { - printk(XENLOG_ERR "Failed to add: %#"PRIpaddr"->%#"PRIpaddr"\n", - start, end); - goto out; - } - } - - /* Remove RAM assigned to Dom0 */ - for ( i = 0; i < kinfo_mem->nr_banks; i++ ) - { - start = kinfo_mem->bank[i].start; - end = kinfo_mem->bank[i].start + kinfo_mem->bank[i].size; - res = rangeset_remove_range(unalloc_mem, PFN_DOWN(start), - PFN_DOWN(end - 1)); - if ( res ) + for ( i = 0; i < ARRAY_SIZE(mem_banks); i++ ) + for ( j = 0; j < mem_banks[i]->nr_banks; j++ ) { - printk(XENLOG_ERR "Failed to remove: %#"PRIpaddr"->%#"PRIpaddr"\n", - start, end); - goto out; - } - } - - /* Remove reserved-memory regions */ - for ( i = 0; i < reserved_mem->nr_banks; i++ ) - { - start = reserved_mem->bank[i].start; - end = reserved_mem->bank[i].start + reserved_mem->bank[i].size; - res = rangeset_remove_range(unalloc_mem, PFN_DOWN(start), + start = mem_banks[i]->bank[j].start; + end = mem_banks[i]->bank[j].start + mem_banks[i]->bank[j].size; + res = rangeset_add_range(unalloc_mem, PFN_DOWN(start), PFN_DOWN(end - 1)); - if ( res ) - { - printk(XENLOG_ERR "Failed to remove: %#"PRIpaddr"->%#"PRIpaddr"\n", - start, end); - goto out; + if ( res ) + { + printk(XENLOG_ERR "Failed to add: %#"PRIpaddr"->%#"PRIpaddr"\n", + start, end); + goto out; + } } - } /* Remove grant table region */ if ( kinfo->gnttab_size ) From patchwork Tue Mar 12 13:03:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589967 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 60EC9C54E60 for ; Tue, 12 Mar 2024 13:04:10 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691816.1078267 (Exim 4.92) (envelope-from ) id 1rk1nW-0006Kk-A2; Tue, 12 Mar 2024 13:04:02 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691816.1078267; Tue, 12 Mar 2024 13:04:02 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nW-0006KC-4L; Tue, 12 Mar 2024 13:04:02 +0000 Received: by outflank-mailman (input) for mailman id 691816; Tue, 12 Mar 2024 13:04:00 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nU-0004WU-8K for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:04:00 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id fd46804e-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:03:58 +0100 (CET) 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 949DD1007; Tue, 12 Mar 2024 06:04:35 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5044E3F762; Tue, 12 Mar 2024 06:03:57 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fd46804e-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk Subject: [PATCH 07/11] xen/arm: Avoid code duplication in check_reserved_regions_overlap Date: Tue, 12 Mar 2024 13:03:27 +0000 Message-Id: <20240312130331.78418-8-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 The function check_reserved_regions_overlap is calling 'meminfo_overlap_check' on the same type of structure, this code can be written in a way to avoid code duplication, so rework the function to do that. Signed-off-by: Luca Fancellu --- xen/arch/arm/setup.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 02bd27eb0c69..cc719d508d63 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -340,25 +340,27 @@ void __init fw_unreserved_regions(paddr_t s, paddr_t e, bool __init check_reserved_regions_overlap(paddr_t region_start, paddr_t region_size) { + const struct membanks *mem_banks[] = { + bootinfo_get_reserved_mem(), +#ifdef CONFIG_ACPI + bootinfo_get_acpi(), +#endif + }; + unsigned int i; + /* - * Check if input region is overlapping with bootinfo_get_reserved_mem() - * banks + * Check if input region is overlapping with reserved memory banks or + * ACPI EfiACPIReclaimMemory (when ACPI feature is enabled) */ - if ( meminfo_overlap_check(bootinfo_get_reserved_mem(), - region_start, region_size) ) - return true; + for ( i = 0; i < ARRAY_SIZE(mem_banks); i++ ) + if ( meminfo_overlap_check(mem_banks[i], region_start, region_size) ) + return true; /* Check if input region is overlapping with bootmodules */ if ( bootmodules_overlap_check(&bootinfo.modules, region_start, region_size) ) return true; -#ifdef CONFIG_ACPI - /* Check if input region is overlapping with ACPI EfiACPIReclaimMemory */ - if ( meminfo_overlap_check(bootinfo_get_acpi(), region_start, region_size) ) - return true; -#endif - return false; } From patchwork Tue Mar 12 13:03:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589970 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EC89EC54E58 for ; Tue, 12 Mar 2024 13:04:13 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691817.1078277 (Exim 4.92) (envelope-from ) id 1rk1nX-0006cV-KY; Tue, 12 Mar 2024 13:04:03 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691817.1078277; Tue, 12 Mar 2024 13:04:03 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nX-0006cL-HQ; Tue, 12 Mar 2024 13:04:03 +0000 Received: by outflank-mailman (input) for mailman id 691817; Tue, 12 Mar 2024 13:04:02 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nW-0004WU-5c for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:04:02 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id fe100bcb-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:03:59 +0100 (CET) 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 DED511570; Tue, 12 Mar 2024 06:04:36 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9A77D3F762; Tue, 12 Mar 2024 06:03:58 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fe100bcb-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk Subject: [PATCH 08/11] xen/arm: Reduce struct membank size on static shared memory Date: Tue, 12 Mar 2024 13:03:28 +0000 Message-Id: <20240312130331.78418-9-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 Currently the memory footprint of the static shared memory feature is impacting all the struct meminfo instances with memory space that is not going to be used. To solve this issue, rework the static shared memory extra information linked to the memory bank to another structure, struct shmem_membank_extra, and exploit the struct membank padding to host a pointer to that structure in a union with the enum membank_type, with this trick the 'struct membank' has the same size with or without the static shared memory, given that the 'type' and 'shmem_extra' are never used at the same time. Afterwards, create a new structure 'struct shared_meminfo' which has the same interface of 'struct meminfo', but requires less banks and hosts the extra information for the static shared memory. The fields 'bank' and 'extra' of this structure are meant to be linked by the index (e.g. extra[idx] will have the information for the bank[idx], for i=0..NR_SHMEM_BANKS), the convinient pointer 'shmem_extra' of 'struct membank' is then linked to the related 'extra' bank to ease the fruition when a function has access only to the 'struct membanks common' of 'struct shared_meminfo'. The last part of this work is to move the allocation of the static shared memory banks from the 'reserved_mem' to a new 'shmem' member of the 'struct bootinfo'. Change also the 'shm_mem' member type to be 'struct shared_meminfo' in order to match the above changes and allow a memory space reduction also in 'struct kernel_info'. Signed-off-by: Luca Fancellu --- xen/arch/arm/arm32/mmu/mm.c | 24 +++++++++ xen/arch/arm/arm64/mmu/mm.c | 2 + xen/arch/arm/bootfdt.c | 1 + xen/arch/arm/domain_build.c | 4 ++ xen/arch/arm/include/asm/kernel.h | 4 +- xen/arch/arm/include/asm/setup.h | 41 +++++++++++++-- xen/arch/arm/include/asm/static-shmem.h | 8 +++ xen/arch/arm/setup.c | 25 ++++++++- xen/arch/arm/static-shmem.c | 69 ++++++++++++++++++------- 9 files changed, 154 insertions(+), 24 deletions(-) diff --git a/xen/arch/arm/arm32/mmu/mm.c b/xen/arch/arm/arm32/mmu/mm.c index e6bb5d934c16..45e42b307e20 100644 --- a/xen/arch/arm/arm32/mmu/mm.c +++ b/xen/arch/arm/arm32/mmu/mm.c @@ -7,6 +7,7 @@ #include #include #include +#include static unsigned long opt_xenheap_megabytes __initdata; integer_param("xenheap_megabytes", opt_xenheap_megabytes); @@ -42,6 +43,9 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, int first_mod) { const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); +#ifdef CONFIG_STATIC_SHM + const struct membanks *shmem = bootinfo_get_shmem(); +#endif const struct bootmodules *mi = &bootinfo.modules; int i; int nr; @@ -118,6 +122,25 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, return consider_modules(s, r_s, size, align, i + 1); } } + +#ifdef CONFIG_STATIC_SHM + nr += reserved_mem->nr_banks; + for ( ; i - nr < shmem->nr_banks; i++ ) + { + paddr_t r_s = shmem->bank[i - nr].start; + paddr_t r_e = r_s + shmem->bank[i - nr].size; + + if ( s < r_e && r_s < e ) + { + r_e = consider_modules(r_e, e, size, align, i + 1); + if ( r_e ) + return r_e; + + return consider_modules(s, r_s, size, align, i + 1); + } + } +#endif + return e; } @@ -294,6 +317,7 @@ void __init setup_mm(void) mfn_to_maddr(directmap_mfn_end)); init_staticmem_pages(); + init_sharedmem_pages(); } /* diff --git a/xen/arch/arm/arm64/mmu/mm.c b/xen/arch/arm/arm64/mmu/mm.c index f8aaf4ac18be..293acb67e09c 100644 --- a/xen/arch/arm/arm64/mmu/mm.c +++ b/xen/arch/arm/arm64/mmu/mm.c @@ -6,6 +6,7 @@ #include #include +#include /* Override macros from asm/page.h to make them work with mfn_t */ #undef virt_to_mfn @@ -236,6 +237,7 @@ void __init setup_mm(void) max_page = PFN_DOWN(ram_end); init_staticmem_pages(); + init_sharedmem_pages(); } /* diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index ecbc80d6a112..f2344863062e 100644 --- a/xen/arch/arm/bootfdt.c +++ b/xen/arch/arm/bootfdt.c @@ -499,6 +499,7 @@ static void __init early_print_info(void) mem_resv->bank[j].start, mem_resv->bank[j].start + mem_resv->bank[j].size - 1); } + early_print_info_shmem(); printk("\n"); for ( i = 0 ; i < cmds->nr_mods; i++ ) printk("CMDLINE[%"PRIpaddr"]:%s %s\n", cmds->cmdline[i].start, diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index d0f2ac6060eb..9fad9e8b2c40 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -864,6 +864,7 @@ static int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn, * regions we exclude every region assigned to Dom0 from the Host RAM: * - domain RAM * - reserved-memory + * - static shared memory * - grant table space */ static int __init find_unallocated_memory(const struct kernel_info *kinfo, @@ -873,6 +874,9 @@ static int __init find_unallocated_memory(const struct kernel_info *kinfo, bootinfo_get_mem(), kernel_info_get_mem(kinfo), bootinfo_get_reserved_mem(), +#ifdef CONFIG_STATIC_SHM + bootinfo_get_shmem(), +#endif }; struct rangeset *unalloc_mem; paddr_t start, end; diff --git a/xen/arch/arm/include/asm/kernel.h b/xen/arch/arm/include/asm/kernel.h index 5785da985ccf..937ffcefc73f 100644 --- a/xen/arch/arm/include/asm/kernel.h +++ b/xen/arch/arm/include/asm/kernel.h @@ -40,7 +40,7 @@ struct kernel_info { paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */ struct meminfo mem; #ifdef CONFIG_STATIC_SHM - struct meminfo shm_mem; + struct shared_meminfo shm_mem; #endif /* kernel entry point */ @@ -84,7 +84,7 @@ struct kernel_info { (&(kinfo)->mem.common) #ifdef CONFIG_STATIC_SHM -#define KERNEL_INFO_SHM_MEM_INIT .shm_mem.common.max_banks = NR_MEM_BANKS, +#define KERNEL_INFO_SHM_MEM_INIT .shm_mem.common.max_banks = NR_SHMEM_BANKS, #else #define KERNEL_INFO_SHM_MEM_INIT #endif diff --git a/xen/arch/arm/include/asm/setup.h b/xen/arch/arm/include/asm/setup.h index a3e1dc8fdb6c..07011bd776da 100644 --- a/xen/arch/arm/include/asm/setup.h +++ b/xen/arch/arm/include/asm/setup.h @@ -9,6 +9,7 @@ #define MAX_FDT_SIZE SZ_2M #define NR_MEM_BANKS 256 +#define NR_SHMEM_BANKS 32 #define MAX_MODULES 32 /* Current maximum useful modules */ @@ -46,14 +47,20 @@ enum membank_type { /* Indicates the maximum number of characters(\0 included) for shm_id */ #define MAX_SHM_ID_LENGTH 16 +struct shmem_membank_extra { + char shm_id[MAX_SHM_ID_LENGTH]; + unsigned int nr_shm_borrowers; +}; + struct membank { paddr_t start; paddr_t size; - enum membank_type type; + union { + enum membank_type type; #ifdef CONFIG_STATIC_SHM - char shm_id[MAX_SHM_ID_LENGTH]; - unsigned int nr_shm_borrowers; + struct shmem_membank_extra *shmem_extra; #endif + }; }; struct membanks { @@ -67,6 +74,12 @@ struct meminfo { struct membank bank[NR_MEM_BANKS]; }; +struct shared_meminfo { + struct membanks common; + struct membank bank[NR_SHMEM_BANKS]; + struct shmem_membank_extra extra[NR_SHMEM_BANKS]; +}; + /* * The domU flag is set for kernels and ramdisks of "xen,domain" nodes. * The purpose of the domU flag is to avoid getting confused in @@ -109,6 +122,9 @@ struct bootinfo { struct bootcmdlines cmdlines; #ifdef CONFIG_ACPI struct meminfo acpi; +#endif +#ifdef CONFIG_STATIC_SHM + struct shared_meminfo shmem; #endif bool static_heap; }; @@ -119,11 +135,18 @@ struct bootinfo { #define BOOTINFO_ACPI_INIT #endif +#ifdef CONFIG_STATIC_SHM +#define BOOTINFO_SHMEM_INIT .shmem.common.max_banks = NR_SHMEM_BANKS, +#else +#define BOOTINFO_SHMEM_INIT +#endif + #define BOOTINFO_INIT \ { \ .mem.common.max_banks = NR_MEM_BANKS, \ .reserved_mem.common.max_banks = NR_MEM_BANKS, \ BOOTINFO_ACPI_INIT \ + BOOTINFO_SHMEM_INIT \ } struct map_range_data @@ -158,6 +181,18 @@ static inline struct membanks *bootinfo_get_acpi(void) } #endif +#ifdef CONFIG_STATIC_SHM +static inline struct membanks *bootinfo_get_shmem(void) +{ + return &bootinfo.shmem.common; +} + +static inline struct shmem_membank_extra *bootinfo_get_shmem_extra(void) +{ + return bootinfo.shmem.extra; +} +#endif + void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len); size_t estimate_efi_size(unsigned int mem_nr_banks); diff --git a/xen/arch/arm/include/asm/static-shmem.h b/xen/arch/arm/include/asm/static-shmem.h index 108cedb55a9f..c6fac9906656 100644 --- a/xen/arch/arm/include/asm/static-shmem.h +++ b/xen/arch/arm/include/asm/static-shmem.h @@ -25,6 +25,10 @@ static inline int process_shm_chosen(struct domain *d, int process_shm_node(const void *fdt, int node, uint32_t address_cells, uint32_t size_cells); +void early_print_info_shmem(void); + +void init_sharedmem_pages(void); + #else /* !CONFIG_STATIC_SHM */ static inline int make_resv_memory_node(const struct domain *d, @@ -53,6 +57,10 @@ static inline int process_shm_node(const void *fdt, int node, return -EINVAL; } +static inline void early_print_info_shmem(void) {}; + +static inline void init_sharedmem_pages(void) {}; + #endif /* CONFIG_STATIC_SHM */ #endif /* __ASM_STATIC_SHMEM_H_ */ diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index cc719d508d63..111172a8c4b1 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -208,6 +208,9 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e, unsigned int first) { const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); +#ifdef CONFIG_STATIC_SHM + const struct membanks *shmem = bootinfo_get_shmem(); +#endif unsigned int i, nr; int rc; @@ -258,6 +261,22 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e, } } +#ifdef CONFIG_STATIC_SHM + nr += reserved_mem->nr_banks; + for ( ; i - nr < shmem->nr_banks; i++ ) + { + paddr_t r_s = shmem->bank[i - nr].start; + paddr_t r_e = r_s + shmem->bank[i - nr].size; + + if ( s < r_e && r_s < e ) + { + dt_unreserved_regions(r_e, e, cb, i + 1); + dt_unreserved_regions(s, r_s, cb, i + 1); + return; + } + } +#endif + cb(s, e); } @@ -344,13 +363,17 @@ bool __init check_reserved_regions_overlap(paddr_t region_start, bootinfo_get_reserved_mem(), #ifdef CONFIG_ACPI bootinfo_get_acpi(), +#endif +#ifdef CONFIG_STATIC_SHM + bootinfo_get_shmem(), #endif }; unsigned int i; /* * Check if input region is overlapping with reserved memory banks or - * ACPI EfiACPIReclaimMemory (when ACPI feature is enabled) + * ACPI EfiACPIReclaimMemory (when ACPI feature is enabled) or static + * shared memory banks (when static shared memory feature is enabled) */ for ( i = 0; i < ARRAY_SIZE(mem_banks); i++ ) if ( meminfo_overlap_check(mem_banks[i], region_start, region_size) ) diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index 8b7da952be6e..6143f52cb991 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -4,29 +4,30 @@ #include #include +#include #include static int __init acquire_nr_borrower_domain(struct domain *d, paddr_t pbase, paddr_t psize, unsigned long *nr_borrowers) { - const struct membanks *reserved_mem = bootinfo_get_reserved_mem(); + const struct membanks *shmem = bootinfo_get_shmem(); unsigned int bank; /* Iterate reserved memory to find requested shm bank. */ - for ( bank = 0 ; bank < reserved_mem->nr_banks; bank++ ) + for ( bank = 0 ; bank < shmem->nr_banks; bank++ ) { - paddr_t bank_start = reserved_mem->bank[bank].start; - paddr_t bank_size = reserved_mem->bank[bank].size; + paddr_t bank_start = shmem->bank[bank].start; + paddr_t bank_size = shmem->bank[bank].size; if ( (pbase == bank_start) && (psize == bank_size) ) break; } - if ( bank == reserved_mem->nr_banks ) + if ( bank == shmem->nr_banks ) return -ENOENT; - *nr_borrowers = reserved_mem->bank[bank].nr_shm_borrowers; + *nr_borrowers = shmem->bank[bank].shmem_extra->nr_shm_borrowers; return 0; } @@ -158,16 +159,22 @@ static int __init assign_shared_memory(struct domain *d, return ret; } -static int __init append_shm_bank_to_domain(struct membanks *shm_mem, - paddr_t start, paddr_t size, - const char *shm_id) +static int __init +append_shm_bank_to_domain(struct shared_meminfo *kinfo_shm_mem, paddr_t start, + paddr_t size, const char *shm_id) { + struct membanks *shm_mem = &kinfo_shm_mem->common; + struct shmem_membank_extra *shm_mem_extra; + if ( shm_mem->nr_banks >= shm_mem->max_banks ) return -ENOMEM; + shm_mem_extra = &kinfo_shm_mem->extra[shm_mem->nr_banks]; + shm_mem->bank[shm_mem->nr_banks].start = start; shm_mem->bank[shm_mem->nr_banks].size = size; - safe_strcpy(shm_mem->bank[shm_mem->nr_banks].shm_id, shm_id); + safe_strcpy(shm_mem_extra->shm_id, shm_id); + shm_mem->bank[shm_mem->nr_banks].shmem_extra = shm_mem_extra; shm_mem->nr_banks++; return 0; @@ -270,7 +277,7 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo, * Record static shared memory region info for later setting * up shm-node in guest device tree. */ - ret = append_shm_bank_to_domain(&kinfo->shm_mem.common, gbase, psize, + ret = append_shm_bank_to_domain(&kinfo->shm_mem, gbase, psize, shm_id); if ( ret ) return ret; @@ -324,7 +331,8 @@ static int __init make_shm_memory_node(const struct domain *d, void *fdt, dt_dprintk("Shared memory bank %u: %#"PRIx64"->%#"PRIx64"\n", i, start, start + size); - res = fdt_property_string(fdt, "xen,id", mem->bank[i].shm_id); + res = fdt_property_string(fdt, "xen,id", + mem->bank[i].shmem_extra->shm_id); if ( res ) return res; @@ -352,7 +360,8 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, const struct fdt_property *prop, *prop_id, *prop_role; const __be32 *cell; paddr_t paddr, gaddr, size, end; - struct membanks *mem = bootinfo_get_reserved_mem(); + struct membanks *mem = bootinfo_get_shmem(); + struct shmem_membank_extra *shmem_extra = bootinfo_get_shmem_extra(); unsigned int i; int len; bool owner = false; @@ -441,7 +450,8 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, */ if ( paddr == mem->bank[i].start && size == mem->bank[i].size ) { - if ( strncmp(shm_id, mem->bank[i].shm_id, MAX_SHM_ID_LENGTH) == 0 ) + if ( strncmp(shm_id, shmem_extra[i].shm_id, + MAX_SHM_ID_LENGTH) == 0 ) break; else { @@ -450,7 +460,8 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, return -EINVAL; } } - else if ( strncmp(shm_id, mem->bank[i].shm_id, MAX_SHM_ID_LENGTH) != 0 ) + else if ( strncmp(shm_id, shmem_extra[i].shm_id, + MAX_SHM_ID_LENGTH) != 0 ) continue; else { @@ -468,10 +479,10 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, return -EINVAL; /* Static shared memory shall be reserved from any other use. */ - safe_strcpy(mem->bank[mem->nr_banks].shm_id, shm_id); + safe_strcpy(shmem_extra[mem->nr_banks].shm_id, shm_id); mem->bank[mem->nr_banks].start = paddr; mem->bank[mem->nr_banks].size = size; - mem->bank[mem->nr_banks].type = MEMBANK_STATIC_DOMAIN; + mem->bank[mem->nr_banks].shmem_extra = &shmem_extra[mem->nr_banks]; mem->nr_banks++; } else @@ -485,7 +496,7 @@ int __init process_shm_node(const void *fdt, int node, uint32_t address_cells, * to calculate the reference count. */ if ( !owner ) - mem->bank[i].nr_shm_borrowers++; + shmem_extra[i].nr_shm_borrowers++; return 0; } @@ -531,6 +542,28 @@ int __init make_resv_memory_node(const struct domain *d, return res; } +void __init early_print_info_shmem(void) +{ + const struct membanks *shmem = bootinfo_get_shmem(); + unsigned int bank; + + for ( bank = 0; bank < shmem->nr_banks; bank++ ) + { + printk(" SHMEM[%u]: %"PRIpaddr" - %"PRIpaddr"\n", bank, + shmem->bank[bank].start, + shmem->bank[bank].start + shmem->bank[bank].size - 1); + } +} + +void __init init_sharedmem_pages(void) +{ + const struct membanks *shmem = bootinfo_get_shmem(); + unsigned int bank; + + for ( bank = 0 ; bank < shmem->nr_banks; bank++ ) + init_staticmem_bank(&shmem->bank[bank]); +} + /* * Local variables: * mode: C From patchwork Tue Mar 12 13:03:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589972 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 71389C54E68 for ; Tue, 12 Mar 2024 13:04:14 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691818.1078287 (Exim 4.92) (envelope-from ) id 1rk1nZ-0006ue-A5; Tue, 12 Mar 2024 13:04:05 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691818.1078287; Tue, 12 Mar 2024 13:04:05 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nZ-0006tl-4T; Tue, 12 Mar 2024 13:04:05 +0000 Received: by outflank-mailman (input) for mailman id 691818; Tue, 12 Mar 2024 13:04:03 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nX-0004WU-Dj for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:04:03 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id ff012a35-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:04:01 +0100 (CET) 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 7428715A1; Tue, 12 Mar 2024 06:04:38 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E4B2E3F762; Tue, 12 Mar 2024 06:03:59 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: ff012a35-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Penny Zheng , Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk , Penny Zheng Subject: [PATCH 09/11] xen/arm: remove shm holes for extended regions Date: Tue, 12 Mar 2024 13:03:29 +0000 Message-Id: <20240312130331.78418-10-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 From: Penny Zheng Static shared memory acts as reserved memory in guest, so it shall be excluded from extended regions. Extended regions are taken care of under three different scenarios: normal DomU, direct-map domain with iommu on, and direct-map domain with iommu off. For normal DomU, we create a new function "remove_shm_holes_for_domU", to firstly transfer original outputs into the format of "struct rangeset", then use "remove_shm_from_rangeset" to remove static shm from them. For direct-map domain with iommu on, after we get guest shm info from "kinfo", we use "remove_shm_from_rangeset" to remove static shm. For direct-map domain with iommu off, as static shm has already been taken care of through reserved memory banks, we do nothing. Signed-off-by: Penny Zheng Signed-off-by: Luca Fancellu --- v1: - Rework of https://patchwork.kernel.org/project/xen-devel/patch/20231206090623.1932275-8-Penny.Zheng@arm.com/ --- xen/arch/arm/domain_build.c | 16 ++++- xen/arch/arm/include/asm/domain_build.h | 2 + xen/arch/arm/include/asm/static-shmem.h | 18 ++++++ xen/arch/arm/static-shmem.c | 86 +++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 3 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 9fad9e8b2c40..740c483ea2db 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -817,8 +817,8 @@ int __init make_memory_node(const struct domain *d, return res; } -static int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn, - void *data) +int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn, + void *data) { struct membanks *ext_regions = data; paddr_t start, size; @@ -969,6 +969,8 @@ static int __init handle_pci_range(const struct dt_device_node *dev, * - MMIO * - Host RAM * - PCI aperture + * - Static shared memory regions, which are described by special property + * "xen,domain-shared-memory-v1" */ static int __init find_memory_holes(const struct kernel_info *kinfo, struct membanks *ext_regions) @@ -985,6 +987,11 @@ static int __init find_memory_holes(const struct kernel_info *kinfo, if ( !mem_holes ) return -ENOMEM; + /* Remove static shared memory regions */ + res = remove_shm_from_rangeset(kinfo, mem_holes); + if ( res ) + goto out; + /* Start with maximum possible addressable physical memory range */ start = 0; end = (1ULL << p2m_ipa_bits) - 1; @@ -1089,7 +1096,10 @@ static int __init find_domU_holes(const struct kernel_info *kinfo, res = 0; } - return res; + if ( res ) + return res; + + return remove_shm_holes_for_domU(kinfo, ext_regions); } int __init make_hypervisor_node(struct domain *d, diff --git a/xen/arch/arm/include/asm/domain_build.h b/xen/arch/arm/include/asm/domain_build.h index a6f276cc4263..026d975da28e 100644 --- a/xen/arch/arm/include/asm/domain_build.h +++ b/xen/arch/arm/include/asm/domain_build.h @@ -51,6 +51,8 @@ static inline int prepare_acpi(struct domain *d, struct kernel_info *kinfo) int prepare_acpi(struct domain *d, struct kernel_info *kinfo); #endif +int add_ext_regions(unsigned long s_gfn, unsigned long e_gfn, void *data); + #endif /* diff --git a/xen/arch/arm/include/asm/static-shmem.h b/xen/arch/arm/include/asm/static-shmem.h index c6fac9906656..2f70aed53ac7 100644 --- a/xen/arch/arm/include/asm/static-shmem.h +++ b/xen/arch/arm/include/asm/static-shmem.h @@ -29,6 +29,12 @@ void early_print_info_shmem(void); void init_sharedmem_pages(void); +int remove_shm_from_rangeset(const struct kernel_info *kinfo, + struct rangeset *rangeset); + +int remove_shm_holes_for_domU(const struct kernel_info *kinfo, + struct membanks *ext_regions); + #else /* !CONFIG_STATIC_SHM */ static inline int make_resv_memory_node(const struct domain *d, @@ -61,6 +67,18 @@ static inline void early_print_info_shmem(void) {}; static inline void init_sharedmem_pages(void) {}; +static inline int remove_shm_from_rangeset(const struct kernel_info *kinfo, + struct rangeset *rangeset) +{ + return 0; +} + +static inline int remove_shm_holes_for_domU(const struct kernel_info *kinfo, + struct membanks *ext_regions) +{ + return 0; +} + #endif /* CONFIG_STATIC_SHM */ #endif /* __ASM_STATIC_SHMEM_H_ */ diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index 6143f52cb991..b3e2105dd3f2 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ #include +#include #include #include @@ -564,6 +565,91 @@ void __init init_sharedmem_pages(void) init_staticmem_bank(&shmem->bank[bank]); } +int __init remove_shm_from_rangeset(const struct kernel_info *kinfo, + struct rangeset *rangeset) +{ + const struct membanks *shm_mem = &kinfo->shm_mem.common; + unsigned int i; + + /* Remove static shared memory regions */ + for ( i = 0; i < shm_mem->nr_banks; i++ ) + { + paddr_t start, end; + int res; + + start = shm_mem->bank[i].start; + end = shm_mem->bank[i].start + shm_mem->bank[i].size - 1; + res = rangeset_remove_range(rangeset, start, end); + if ( res ) + { + printk(XENLOG_ERR "Failed to remove: %#"PRIpaddr"->%#"PRIpaddr"\n", + start, end); + return -EINVAL; + } + } + + return 0; +} + +int __init remove_shm_holes_for_domU(const struct kernel_info *kinfo, + struct membanks *ext_regions) +{ + const struct membanks *shm_mem = &kinfo->shm_mem.common; + struct rangeset *guest_holes; + unsigned int i; + paddr_t start; + paddr_t end; + int res; + + /* No static shared memory region. */ + if ( shm_mem->nr_banks == 0 ) + return 0; + + dt_dprintk("Remove static shared memory holes for extended regions of DomU\n"); + + guest_holes = rangeset_new(NULL, NULL, 0); + if ( !guest_holes ) + return -ENOMEM; + + /* Copy extended regions sets into the rangeset */ + for ( i = 0; i < ext_regions->nr_banks; i++ ) + { + start = ext_regions->bank[i].start; + end = start + ext_regions->bank[i].size - 1; + + res = rangeset_add_range(guest_holes, start, end); + if ( res ) + { + printk(XENLOG_ERR "Failed to add: %#"PRIpaddr"->%#"PRIpaddr"\n", + start, end); + goto out; + } + } + + /* Remove static shared memory regions */ + res = remove_shm_from_rangeset(kinfo, guest_holes); + if ( res ) + goto out; + + i = ext_regions->nr_banks - 1; + start = ext_regions->bank[0].start; + end = ext_regions->bank[i].start + ext_regions->bank[i].size - 1; + + /* Reset original extended regions to hold new value */ + ext_regions->nr_banks = 0; + res = rangeset_report_ranges(guest_holes, start, end, add_ext_regions, + ext_regions); + if ( res ) + ext_regions->nr_banks = 0; + else if ( !ext_regions->nr_banks ) + res = -ENOENT; + + out: + rangeset_destroy(guest_holes); + + return res; +} + /* * Local variables: * mode: C From patchwork Tue Mar 12 13:03:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589971 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EE935C54E5D for ; Tue, 12 Mar 2024 13:04:15 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691819.1078292 (Exim 4.92) (envelope-from ) id 1rk1nZ-0006zu-Qm; Tue, 12 Mar 2024 13:04:05 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691819.1078292; Tue, 12 Mar 2024 13:04:05 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nZ-0006yp-HB; Tue, 12 Mar 2024 13:04:05 +0000 Received: by outflank-mailman (input) for mailman id 691819; Tue, 12 Mar 2024 13:04:05 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nY-0004WU-VI for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:04:04 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id fff54792-e070-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:04:03 +0100 (CET) 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 095E41570; Tue, 12 Mar 2024 06:04:40 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 79BFF3F762; Tue, 12 Mar 2024 06:04:01 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fff54792-e070-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Penny Zheng , Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk , Penny Zheng Subject: [PATCH 10/11] xen/arm: fix duplicate /reserved-memory node in Dom0 Date: Tue, 12 Mar 2024 13:03:30 +0000 Message-Id: <20240312130331.78418-11-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 From: Penny Zheng In case there is a /reserved-memory node already present in the host dtb, current Xen codes would create yet another /reserved-memory node when the static shared memory feature is enabled and static shared memory region are present, this would result in an incorrect device tree generation and guest would not be able to detect the static shared memory region. Avoid this issue checking the presence of the /reserved-memory node and appending the nodes instead of generating a duplicate /reserved-memory. Signed-off-by: Penny Zheng Signed-off-by: Luca Fancellu Reviewed-by: Michal Orzel --- v1: - Rework of https://patchwork.kernel.org/project/xen-devel/patch/20231206090623.1932275-11-Penny.Zheng@arm.com/ --- xen/arch/arm/domain_build.c | 23 ++++++++++++++++++++--- xen/arch/arm/include/asm/static-shmem.h | 11 +++++++++++ xen/arch/arm/static-shmem.c | 12 +++++++----- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 740c483ea2db..575e906d81a6 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -1620,6 +1620,7 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, DT_MATCH_PATH("/hypervisor"), { /* sentinel */ }, }; + static __initdata bool res_mem_node_found = false; struct dt_device_node *child; int res, i, nirq, irq_id; const char *name; @@ -1714,6 +1715,19 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, if ( res ) return res; + if ( dt_node_path_is_equal(node, "/reserved-memory") ) + { + res_mem_node_found = true; + /* + * Avoid duplicate /reserved-memory nodes in Device Tree, so list the + * static shared memory nodes there. + */ + res = make_shm_memory_node(d, kinfo, dt_n_addr_cells(node), + dt_n_size_cells(node)); + if ( res ) + return res; + } + for ( child = node->child; child != NULL; child = child->sibling ) { res = handle_node(d, kinfo, child, p2mt); @@ -1766,9 +1780,12 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, return res; } - res = make_resv_memory_node(d, kinfo, addrcells, sizecells); - if ( res ) - return res; + if ( !res_mem_node_found ) + { + res = make_resv_memory_node(d, kinfo, addrcells, sizecells); + if ( res ) + return res; + } } res = fdt_end_node(kinfo->fdt); diff --git a/xen/arch/arm/include/asm/static-shmem.h b/xen/arch/arm/include/asm/static-shmem.h index 2f70aed53ac7..d28b9540d49b 100644 --- a/xen/arch/arm/include/asm/static-shmem.h +++ b/xen/arch/arm/include/asm/static-shmem.h @@ -35,6 +35,10 @@ int remove_shm_from_rangeset(const struct kernel_info *kinfo, int remove_shm_holes_for_domU(const struct kernel_info *kinfo, struct membanks *ext_regions); +int make_shm_memory_node(const struct domain *d, + const struct kernel_info *kinfo, int addrcells, + int sizecells); + #else /* !CONFIG_STATIC_SHM */ static inline int make_resv_memory_node(const struct domain *d, @@ -79,6 +83,13 @@ static inline int remove_shm_holes_for_domU(const struct kernel_info *kinfo, return 0; } +static inline int make_shm_memory_node(const struct domain *d, + const struct kernel_info *kinfo, + int addrcells, int sizecells) +{ + return 0; +} + #endif /* CONFIG_STATIC_SHM */ #endif /* __ASM_STATIC_SHMEM_H_ */ diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index b3e2105dd3f2..67d5fa3b5d25 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -287,15 +287,17 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo, return 0; } -static int __init make_shm_memory_node(const struct domain *d, void *fdt, - int addrcells, int sizecells, - const struct membanks *mem) +int __init make_shm_memory_node(const struct domain *d, + const struct kernel_info *kinfo, int addrcells, + int sizecells) { + const struct membanks *mem = &kinfo->shm_mem.common; + void *fdt = kinfo->fdt; unsigned int i = 0; int res = 0; if ( mem->nr_banks == 0 ) - return -ENOENT; + return 0; /* * For each shared memory region, a range is exposed under @@ -534,7 +536,7 @@ int __init make_resv_memory_node(const struct domain *d, if ( res ) return res; - res = make_shm_memory_node(d, fdt, addrcells, sizecells, mem); + res = make_shm_memory_node(d, kinfo, addrcells, sizecells); if ( res ) return res; From patchwork Tue Mar 12 13:03:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Fancellu X-Patchwork-Id: 13589973 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0DA9EC54E60 for ; Tue, 12 Mar 2024 13:04:17 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.691820.1078308 (Exim 4.92) (envelope-from ) id 1rk1nc-0007az-2B; Tue, 12 Mar 2024 13:04:08 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 691820.1078308; Tue, 12 Mar 2024 13:04:08 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1nb-0007ad-T0; Tue, 12 Mar 2024 13:04:07 +0000 Received: by outflank-mailman (input) for mailman id 691820; Tue, 12 Mar 2024 13:04:06 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rk1na-0004WU-6H for xen-devel@lists.xenproject.org; Tue, 12 Mar 2024 13:04:06 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id 00a9ea6d-e071-11ee-a1ee-f123f15fe8a2; Tue, 12 Mar 2024 14:04:04 +0100 (CET) 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 5327215A1; Tue, 12 Mar 2024 06:04:41 -0700 (PDT) Received: from e125770.cambridge.arm.com (e125770.arm.com [10.1.199.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 0EB153F762; Tue, 12 Mar 2024 06:04:02 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 00a9ea6d-e071-11ee-a1ee-f123f15fe8a2 From: Luca Fancellu To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Michal Orzel , Volodymyr Babchuk Subject: [PATCH 11/11] xen/arm: List static shared memory regions as /memory nodes Date: Tue, 12 Mar 2024 13:03:31 +0000 Message-Id: <20240312130331.78418-12-luca.fancellu@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240312130331.78418-1-luca.fancellu@arm.com> References: <20240312130331.78418-1-luca.fancellu@arm.com> MIME-Version: 1.0 Currently Xen is not exporting the static shared memory regions to the device tree as /memory node, this commit is fixing this issue. Signed-off-by: Luca Fancellu --- xen/arch/arm/dom0less-build.c | 5 +++ xen/arch/arm/domain_build.c | 7 +++- xen/arch/arm/include/asm/static-shmem.h | 5 ++- xen/arch/arm/static-shmem.c | 54 +++++++++++++++---------- 4 files changed, 47 insertions(+), 24 deletions(-) diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c index fe2a771d4984..0892020f21a0 100644 --- a/xen/arch/arm/dom0less-build.c +++ b/xen/arch/arm/dom0less-build.c @@ -647,6 +647,11 @@ static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo) if ( ret ) goto err; + /* List static shared memory regions as /memory@
nodes */ + ret = make_shm_memory_node(d, kinfo, addrcells, sizecells, false); + if ( ret ) + return ret; + ret = make_resv_memory_node(d, kinfo, addrcells, sizecells); if ( ret ) goto err; diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 575e906d81a6..bd7716cd5829 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -1723,7 +1723,7 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, * static shared memory nodes there. */ res = make_shm_memory_node(d, kinfo, dt_n_addr_cells(node), - dt_n_size_cells(node)); + dt_n_size_cells(node), true); if ( res ) return res; } @@ -1780,6 +1780,11 @@ static int __init handle_node(struct domain *d, struct kernel_info *kinfo, return res; } + /* List static shared memory regions as /memory@
nodes */ + res = make_shm_memory_node(d, kinfo, addrcells, sizecells, false); + if ( res ) + return res; + if ( !res_mem_node_found ) { res = make_resv_memory_node(d, kinfo, addrcells, sizecells); diff --git a/xen/arch/arm/include/asm/static-shmem.h b/xen/arch/arm/include/asm/static-shmem.h index d28b9540d49b..c118bbb1c43b 100644 --- a/xen/arch/arm/include/asm/static-shmem.h +++ b/xen/arch/arm/include/asm/static-shmem.h @@ -37,7 +37,7 @@ int remove_shm_holes_for_domU(const struct kernel_info *kinfo, int make_shm_memory_node(const struct domain *d, const struct kernel_info *kinfo, int addrcells, - int sizecells); + int sizecells, bool is_resv_mem_node); #else /* !CONFIG_STATIC_SHM */ @@ -85,7 +85,8 @@ static inline int remove_shm_holes_for_domU(const struct kernel_info *kinfo, static inline int make_shm_memory_node(const struct domain *d, const struct kernel_info *kinfo, - int addrcells, int sizecells) + int addrcells, int sizecells, + bool is_resv_mem_node) { return 0; } diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c index 67d5fa3b5d25..cdaf4485c934 100644 --- a/xen/arch/arm/static-shmem.c +++ b/xen/arch/arm/static-shmem.c @@ -289,7 +289,7 @@ int __init process_shm(struct domain *d, struct kernel_info *kinfo, int __init make_shm_memory_node(const struct domain *d, const struct kernel_info *kinfo, int addrcells, - int sizecells) + int sizecells, bool is_resv_mem_node) { const struct membanks *mem = &kinfo->shm_mem.common; void *fdt = kinfo->fdt; @@ -300,11 +300,15 @@ int __init make_shm_memory_node(const struct domain *d, return 0; /* - * For each shared memory region, a range is exposed under - * the /reserved-memory node as a child node. Each range sub-node is - * named xen-shmem@
. + * When is_resv_mem_node is true, it means this function is called to + * create nodes under /reserved-memory, so for each shared memory region, a + * range is exposed under the /reserved-memory node as a child node. Each + * range sub-node is named xen-shmem@
. + * Otherwise the function is called under / and will create + * /memory@
nodes for each static shared memory region. */ - dt_dprintk("Create xen-shmem node\n"); + dt_dprintk("Create static shared memory %s nodes\n", + is_resv_mem_node ? "/reserved-memory/xen-shmem" : "/memory"); for ( ; i < mem->nr_banks; i++ ) { @@ -316,11 +320,16 @@ int __init make_shm_memory_node(const struct domain *d, __be32 *cells; unsigned int len = (addrcells + sizecells) * sizeof(__be32); - res = domain_fdt_begin_node(fdt, "xen-shmem", mem->bank[i].start); + res = domain_fdt_begin_node(fdt, + is_resv_mem_node ? "xen-shmem" : "memory", + mem->bank[i].start); if ( res ) return res; - res = fdt_property(fdt, "compatible", compat, sizeof(compat)); + if ( is_resv_mem_node ) + res = fdt_property(fdt, "compatible", compat, sizeof(compat)); + else + res = fdt_property_string(fdt, "device_type", "memory"); if ( res ) return res; @@ -334,20 +343,23 @@ int __init make_shm_memory_node(const struct domain *d, dt_dprintk("Shared memory bank %u: %#"PRIx64"->%#"PRIx64"\n", i, start, start + size); - res = fdt_property_string(fdt, "xen,id", - mem->bank[i].shmem_extra->shm_id); - if ( res ) - return res; + if ( is_resv_mem_node ) + { + res = fdt_property_string(fdt, "xen,id", + mem->bank[i].shmem_extra->shm_id); + if ( res ) + return res; - /* - * TODO: - * - xen,offset: (borrower VMs only) - * 64 bit integer offset within the owner virtual machine's shared - * memory region used for the mapping in the borrower VM - */ - res = fdt_property_u64(fdt, "xen,offset", 0); - if ( res ) - return res; + /* + * TODO: + * - xen,offset: (borrower VMs only) + * 64 bit integer offset within the owner virtual machine's shared + * memory region used for the mapping in the borrower VM + */ + res = fdt_property_u64(fdt, "xen,offset", 0); + if ( res ) + return res; + } res = fdt_end_node(fdt); if ( res ) @@ -536,7 +548,7 @@ int __init make_resv_memory_node(const struct domain *d, if ( res ) return res; - res = make_shm_memory_node(d, kinfo, addrcells, sizecells); + res = make_shm_memory_node(d, kinfo, addrcells, sizecells, true); if ( res ) return res;