[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 08/11] xen/arm: Reduce struct membank size on static shared memory
Hi Luca, On 12/03/2024 14:03, Luca Fancellu wrote: > > > 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 NIT: AFAICT the padding will be reused on Arm64 but on Arm32 there will still be 4B padding. > 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'. Ok, so from this point onwards, when dealing with "reserved" memory, one needs to account for shmem as well, as it will no longer be part of bootinfo.reserved_mem (unlike static-mem or static-heap). This is really the only disadvantage. The changes LGTM, just a few comments below. > > Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> > --- > 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 <xen/pfn.h> > #include <asm/fixmap.h> > #include <asm/static-memory.h> > +#include <asm/static-shmem.h> > > 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 <asm/setup.h> > #include <asm/static-memory.h> > +#include <asm/static-shmem.h> > > /* 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]; > +}; Same as with meminfo, please add a BUILD_BUG_ON for padding between common and bank. > + > /* > * 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 <xen/sched.h> > > #include <asm/domain_build.h> > +#include <asm/static-memory.h> > #include <asm/static-shmem.h> > > 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, Is there any particular reason to prepend the shm_mem name with kinfo? ~Michal
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |