From nobody Fri Apr 26 19:27:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=none dis=none) header.from=arm.com Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1668480809640590.3965259512001; Mon, 14 Nov 2022 18:53:29 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.443635.698306 (Exim 4.92) (envelope-from ) id 1oum4I-0000Km-8P; Tue, 15 Nov 2022 02:52:58 +0000 Received: by outflank-mailman (output) from mailman id 443635.698306; Tue, 15 Nov 2022 02:52: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 1oum4I-0000Kf-4I; Tue, 15 Nov 2022 02:52:58 +0000 Received: by outflank-mailman (input) for mailman id 443635; Tue, 15 Nov 2022 02:52: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 1oum4G-0000BJ-RK for xen-devel@lists.xenproject.org; Tue, 15 Nov 2022 02:52:56 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-sth1.inumbo.com (Halon) with ESMTP id 99feff1e-6490-11ed-91b6-6bf2151ebd3b; Tue, 15 Nov 2022 03:52:55 +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 D1B9913D5; Mon, 14 Nov 2022 18:52:59 -0800 (PST) Received: from a011292.shanghai.arm.com (a011292.shanghai.arm.com [10.169.190.94]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id F37B13F73B; Mon, 14 Nov 2022 18:52:50 -0800 (PST) X-Outflank-Mailman: Message body and most headers restored to incoming version 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: 99feff1e-6490-11ed-91b6-6bf2151ebd3b From: Penny Zheng To: xen-devel@lists.xenproject.org Cc: wei.chen@arm.com, Penny Zheng , Stefano Stabellini , Julien Grall , Bertrand Marquis , Volodymyr Babchuk , Penny Zheng Subject: [PATCH v1 01/13] xen/arm: re-arrange the static shared memory region Date: Tue, 15 Nov 2022 10:52:23 +0800 Message-Id: <20221115025235.1378931-2-Penny.Zheng@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221115025235.1378931-1-Penny.Zheng@arm.com> References: <20221115025235.1378931-1-Penny.Zheng@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1668480810941100003 Content-Type: text/plain; charset="utf-8" This commit re-arranges the static shared memory regions into a separate ar= ray shm_meminfo. And static shared memory region now would have its own structu= re 'shm_membank' to hold all shm-related members, like shm_id, etc, and a poin= ter to the normal memory bank 'membank'. This will avoid continuing to grow 'membank'. Signed-off-by: Penny Zheng --- xen/arch/arm/bootfdt.c | 40 +++++++++++++++++++------------ xen/arch/arm/domain_build.c | 35 ++++++++++++++++----------- xen/arch/arm/include/asm/kernel.h | 2 +- xen/arch/arm/include/asm/setup.h | 16 +++++++++---- 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index 6014c0f852..ccf281cd37 100644 --- a/xen/arch/arm/bootfdt.c +++ b/xen/arch/arm/bootfdt.c @@ -384,6 +384,7 @@ static int __init process_shm_node(const void *fdt, int= node, const __be32 *cell; paddr_t paddr, gaddr, size; struct meminfo *mem =3D &bootinfo.reserved_mem; + struct shm_meminfo *shm_mem =3D &bootinfo.shm_mem; unsigned int i; int len; bool owner =3D false; @@ -455,17 +456,21 @@ static int __init process_shm_node(const void *fdt, i= nt node, return -EINVAL; } =20 - for ( i =3D 0; i < mem->nr_banks; i++ ) + for ( i =3D 0; i < shm_mem->nr_banks; i++ ) { + paddr_t bank_start =3D shm_mem->bank[i].membank->start; + paddr_t bank_size =3D shm_mem->bank[i].membank->size; + /* * Meet the following check: * 1) The shm ID matches and the region exactly match * 2) The shm ID doesn't match and the region doesn't overlap * with an existing one */ - if ( paddr =3D=3D mem->bank[i].start && size =3D=3D mem->bank[i].s= ize ) + if ( paddr =3D=3D bank_start && size =3D=3D bank_size ) { - if ( strncmp(shm_id, mem->bank[i].shm_id, MAX_SHM_ID_LENGTH) = =3D=3D 0 ) + if ( strncmp(shm_id, + shm_mem->bank[i].shm_id, MAX_SHM_ID_LENGTH) =3D= =3D 0 ) break; else { @@ -477,17 +482,17 @@ static int __init process_shm_node(const void *fdt, i= nt node, else { paddr_t end =3D paddr + size; - paddr_t bank_end =3D mem->bank[i].start + mem->bank[i].size; + paddr_t bank_end =3D bank_start + bank_size; =20 - if ( (end <=3D paddr) || (bank_end <=3D mem->bank[i].start) ) + if ( (end <=3D paddr) || (bank_end <=3D bank_start) ) { printk("fdt: static shared memory region %s overflow\n", s= hm_id); return -EINVAL; } =20 - if ( (end <=3D mem->bank[i].start) || (paddr >=3D bank_end) ) + if ( (end <=3D bank_start) || (paddr >=3D bank_end) ) { - if ( strcmp(shm_id, mem->bank[i].shm_id) !=3D 0 ) + if ( strcmp(shm_id, shm_mem->bank[i].shm_id) !=3D 0 ) continue; else { @@ -499,22 +504,27 @@ static int __init process_shm_node(const void *fdt, i= nt node, else { printk("fdt: shared memory region overlap with an existing= entry %#"PRIpaddr" - %#"PRIpaddr"\n", - mem->bank[i].start, bank_end); + bank_start, bank_end); return -EINVAL; } } } =20 - if ( i =3D=3D mem->nr_banks ) + if ( i =3D=3D shm_mem->nr_banks ) { - if ( i < NR_MEM_BANKS ) + if ( (i < NR_MEM_BANKS) && (mem->nr_banks < NR_MEM_BANKS) ) { /* 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 =3D paddr; - mem->bank[mem->nr_banks].size =3D size; - mem->bank[mem->nr_banks].type =3D MEMBANK_STATIC_DOMAIN; + struct membank *membank =3D &mem->bank[mem->nr_banks]; + + membank->start =3D paddr; + membank->size =3D size; + membank->type =3D MEMBANK_STATIC_DOMAIN; mem->nr_banks++; + + safe_strcpy(shm_mem->bank[i].shm_id, shm_id); + shm_mem->bank[i].membank =3D membank; + shm_mem->nr_banks++; } else { @@ -527,7 +537,7 @@ static int __init process_shm_node(const void *fdt, int= node, * to calculate the reference count. */ if ( !owner ) - mem->bank[i].nr_shm_borrowers++; + shm_mem->bank[i].nr_shm_borrowers++; =20 return 0; } diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index bd30d3798c..c0fd13f6ed 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -757,20 +757,20 @@ static int __init acquire_nr_borrower_domain(struct d= omain *d, { unsigned int bank; =20 - /* Iterate reserved memory to find requested shm bank. */ - for ( bank =3D 0 ; bank < bootinfo.reserved_mem.nr_banks; bank++ ) + /* Iterate static shared memory to find requested shm bank. */ + for ( bank =3D 0 ; bank < bootinfo.shm_mem.nr_banks; bank++ ) { - paddr_t bank_start =3D bootinfo.reserved_mem.bank[bank].start; - paddr_t bank_size =3D bootinfo.reserved_mem.bank[bank].size; + paddr_t bank_start =3D bootinfo.shm_mem.bank[bank].membank->start; + paddr_t bank_size =3D bootinfo.shm_mem.bank[bank].membank->size; =20 if ( (pbase =3D=3D bank_start) && (psize =3D=3D bank_size) ) break; } =20 - if ( bank =3D=3D bootinfo.reserved_mem.nr_banks ) + if ( bank =3D=3D bootinfo.shm_mem.nr_banks ) return -ENOENT; =20 - *nr_borrowers =3D bootinfo.reserved_mem.bank[bank].nr_shm_borrowers; + *nr_borrowers =3D bootinfo.shm_mem.bank[bank].nr_shm_borrowers; =20 return 0; } @@ -907,11 +907,18 @@ static int __init append_shm_bank_to_domain(struct ke= rnel_info *kinfo, paddr_t start, paddr_t size, const char *shm_id) { + struct membank *membank; + if ( kinfo->shm_mem.nr_banks >=3D NR_MEM_BANKS ) return -ENOMEM; =20 - kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].start =3D start; - kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].size =3D size; + membank =3D xmalloc_bytes(sizeof(struct membank)); + if ( membank =3D=3D NULL ) + return -ENOMEM; + + kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].membank =3D membank; + kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].membank->start =3D start; + kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].membank->size =3D size; safe_strcpy(kinfo->shm_mem.bank[kinfo->shm_mem.nr_banks].shm_id, shm_i= d); kinfo->shm_mem.nr_banks++; =20 @@ -1355,7 +1362,7 @@ static int __init make_memory_node(const struct domai= n *d, static int __init make_shm_memory_node(const struct domain *d, void *fdt, int addrcells, int sizecells, - const struct meminfo *mem) + const struct shm_meminfo *mem) { unsigned int i =3D 0; int res =3D 0; @@ -1372,8 +1379,8 @@ static int __init make_shm_memory_node(const struct d= omain *d, =20 for ( ; i < mem->nr_banks; i++ ) { - uint64_t start =3D mem->bank[i].start; - uint64_t size =3D mem->bank[i].size; + uint64_t start =3D mem->bank[i].membank->start; + uint64_t size =3D mem->bank[i].membank->size; /* Placeholder for xen-shmem@ + a 64-bit number + \0 */ char buf[27]; const char compat[] =3D "xen,shared-memory-v1"; @@ -1382,7 +1389,7 @@ static int __init make_shm_memory_node(const struct d= omain *d, __be32 *cells; unsigned int len =3D (addrcells + sizecells) * sizeof(__be32); =20 - snprintf(buf, sizeof(buf), "xen-shmem@%"PRIx64, mem->bank[i].start= ); + snprintf(buf, sizeof(buf), "xen-shmem@%"PRIx64, start); res =3D fdt_begin_node(fdt, buf); if ( res ) return res; @@ -1426,7 +1433,7 @@ static int __init make_shm_memory_node(const struct d= omain *d, static int __init make_shm_memory_node(const struct domain *d, void *fdt, int addrcells, int sizecells, - const struct meminfo *mem) + const struct shm_meminfo *mem) { ASSERT_UNREACHABLE(); return -EOPNOTSUPP; @@ -1436,7 +1443,7 @@ static int __init make_shm_memory_node(const struct d= omain *d, static int __init make_resv_memory_node(const struct domain *d, void *fdt, int addrcells, int sizecells, - const struct meminfo *mem) + const struct shm_meminfo *mem) { int res =3D 0; /* Placeholder for reserved-memory\0 */ diff --git a/xen/arch/arm/include/asm/kernel.h b/xen/arch/arm/include/asm/k= ernel.h index 5bb30c3f2f..f47ba9d619 100644 --- a/xen/arch/arm/include/asm/kernel.h +++ b/xen/arch/arm/include/asm/kernel.h @@ -38,7 +38,7 @@ struct kernel_info { void *fdt; /* flat device tree */ paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */ struct meminfo mem; - struct meminfo shm_mem; + struct shm_meminfo shm_mem; =20 /* kernel entry point */ paddr_t entry; diff --git a/xen/arch/arm/include/asm/setup.h b/xen/arch/arm/include/asm/se= tup.h index fdbf68aadc..2d4ae0f00a 100644 --- a/xen/arch/arm/include/asm/setup.h +++ b/xen/arch/arm/include/asm/setup.h @@ -50,10 +50,6 @@ struct membank { paddr_t start; paddr_t size; enum membank_type type; -#ifdef CONFIG_STATIC_SHM - char shm_id[MAX_SHM_ID_LENGTH]; - unsigned int nr_shm_borrowers; -#endif }; =20 struct meminfo { @@ -61,6 +57,17 @@ struct meminfo { struct membank bank[NR_MEM_BANKS]; }; =20 +struct shm_membank { + char shm_id[MAX_SHM_ID_LENGTH]; + unsigned int nr_shm_borrowers; + struct membank *membank; +}; + +struct shm_meminfo { + unsigned int nr_banks; + struct shm_membank bank[NR_MEM_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 @@ -105,6 +112,7 @@ struct bootinfo { struct meminfo acpi; #endif bool static_heap; + struct shm_meminfo shm_mem; }; =20 struct map_range_data --=20 2.25.1