[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] xen/arm: Fix MISRA regression on R1.1, flexible array member not at the end
On Tue, 30 Apr 2024, Luca Fancellu wrote: > Commit 2209c1e35b47 ("xen/arm: Introduce a generic way to access memory > bank structures") introduced a MISRA regression for Rule 1.1 because a > flexible array member is introduced in the middle of a struct, furthermore > this is using a GCC extension that is going to be deprecated in GCC 14 and > a warning to identify such cases will be present > (-Wflex-array-member-not-at-end) to identify such cases. > > In order to fix this issue, use the macro __struct_group to create a > structure 'struct membanks_hdr' which will hold the common data among > structures using the 'struct membanks' interface. > > Modify the 'struct shared_meminfo' and 'struct meminfo' to use this new > structure, effectively removing the flexible array member from the middle > of the structure and modify the code accessing the .common field to use > the macro container_of to maintain the functionality of the interface. > > Given this change, container_of needs to be supplied with a type and so > the macro 'kernel_info_get_mem' inside arm/include/asm/kernel.h can't be > an option since it uses const and non-const types for struct membanks, so > introduce two static inline, one of which will keep the const qualifier. > > Given the complexity of the interface, which carries a lot of benefit but > on the other hand could be prone to developer confusion if the access is > open-coded, introduce two static inline helper for the > 'struct kernel_info' .shm_mem member and get rid the open-coding > shm_mem.common access. > > Fixes: 2209c1e35b47 ("xen/arm: Introduce a generic way to access memory bank > structures") > Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > xen/arch/arm/acpi/domain_build.c | 2 +- > xen/arch/arm/domain_build.c | 6 +++--- > xen/arch/arm/include/asm/kernel.h | 11 ++++++++++- > xen/arch/arm/include/asm/setup.h | 18 ++++++++++-------- > xen/arch/arm/include/asm/static-shmem.h | 12 ++++++++++++ > xen/arch/arm/static-shmem.c | 19 +++++++++---------- > 6 files changed, 45 insertions(+), 23 deletions(-) > > diff --git a/xen/arch/arm/acpi/domain_build.c > b/xen/arch/arm/acpi/domain_build.c > index ed895dd8f926..2ce75543d004 100644 > --- a/xen/arch/arm/acpi/domain_build.c > +++ b/xen/arch/arm/acpi/domain_build.c > @@ -451,7 +451,7 @@ static int __init estimate_acpi_efi_size(struct domain *d, > struct acpi_table_rsdp *rsdp_tbl; > struct acpi_table_header *table; > > - efi_size = estimate_efi_size(kernel_info_get_mem(kinfo)->nr_banks); > + efi_size = estimate_efi_size(kernel_info_get_mem_const(kinfo)->nr_banks); > > acpi_size = ROUNDUP(sizeof(struct acpi_table_fadt), 8); > acpi_size += ROUNDUP(sizeof(struct acpi_table_stao), 8); > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c > index 0784e4c5e315..f6550809cfdf 100644 > --- a/xen/arch/arm/domain_build.c > +++ b/xen/arch/arm/domain_build.c > @@ -805,7 +805,7 @@ int __init make_memory_node(const struct kernel_info > *kinfo, int addrcells, > * static shared memory banks need to be listed as /memory node, so when > * this function is handling the normal memory, add the banks. > */ > - if ( mem == kernel_info_get_mem(kinfo) ) > + if ( mem == kernel_info_get_mem_const(kinfo) ) > shm_mem_node_fill_reg_range(kinfo, reg, &nr_cells, addrcells, > sizecells); > > @@ -884,7 +884,7 @@ static int __init find_unallocated_memory(const struct > kernel_info *kinfo, > { > const struct membanks *mem = bootinfo_get_mem(); > const struct membanks *mem_banks[] = { > - kernel_info_get_mem(kinfo), > + kernel_info_get_mem_const(kinfo), > bootinfo_get_reserved_mem(), > #ifdef CONFIG_STATIC_SHM > bootinfo_get_shmem(), > @@ -1108,7 +1108,7 @@ static int __init find_domU_holes(const struct > kernel_info *kinfo, > uint64_t bankend; > const uint64_t bankbase[] = GUEST_RAM_BANK_BASES; > const uint64_t banksize[] = GUEST_RAM_BANK_SIZES; > - const struct membanks *kinfo_mem = kernel_info_get_mem(kinfo); > + const struct membanks *kinfo_mem = kernel_info_get_mem_const(kinfo); > int res = -ENOENT; > > for ( i = 0; i < GUEST_RAM_BANKS; i++ ) > diff --git a/xen/arch/arm/include/asm/kernel.h > b/xen/arch/arm/include/asm/kernel.h > index 16a2bfc01e27..7e6e3c82a477 100644 > --- a/xen/arch/arm/include/asm/kernel.h > +++ b/xen/arch/arm/include/asm/kernel.h > @@ -80,7 +80,16 @@ struct kernel_info { > }; > }; > > -#define kernel_info_get_mem(kinfo) (&(kinfo)->mem.common) > +static inline struct membanks *kernel_info_get_mem(struct kernel_info *kinfo) > +{ > + return container_of(&kinfo->mem.common, struct membanks, common); > +} > + > +static inline const struct membanks * > +kernel_info_get_mem_const(const struct kernel_info *kinfo) > +{ > + return container_of(&kinfo->mem.common, const struct membanks, common); > +} > > #ifdef CONFIG_STATIC_SHM > #define KERNEL_INFO_SHM_MEM_INIT .shm_mem.common.max_banks = NR_SHMEM_BANKS, > diff --git a/xen/arch/arm/include/asm/setup.h > b/xen/arch/arm/include/asm/setup.h > index 28fb659fe946..61c15806a7c4 100644 > --- a/xen/arch/arm/include/asm/setup.h > +++ b/xen/arch/arm/include/asm/setup.h > @@ -64,18 +64,20 @@ struct membank { > }; > > struct membanks { > - unsigned int nr_banks; > - unsigned int max_banks; > + __struct_group(membanks_hdr, common, , > + unsigned int nr_banks; > + unsigned int max_banks; > + ); > struct membank bank[]; > }; > > struct meminfo { > - struct membanks common; > + struct membanks_hdr common; > struct membank bank[NR_MEM_BANKS]; > }; > > struct shared_meminfo { > - struct membanks common; > + struct membanks_hdr common; > struct membank bank[NR_SHMEM_BANKS]; > struct shmem_membank_extra extra[NR_SHMEM_BANKS]; > }; > @@ -166,25 +168,25 @@ extern domid_t max_init_domid; > > static inline struct membanks *bootinfo_get_mem(void) > { > - return &bootinfo.mem.common; > + return container_of(&bootinfo.mem.common, struct membanks, common); > } > > static inline struct membanks *bootinfo_get_reserved_mem(void) > { > - return &bootinfo.reserved_mem.common; > + return container_of(&bootinfo.reserved_mem.common, struct membanks, > common); > } > > #ifdef CONFIG_ACPI > static inline struct membanks *bootinfo_get_acpi(void) > { > - return &bootinfo.acpi.common; > + return container_of(&bootinfo.acpi.common, struct membanks, common); > } > #endif > > #ifdef CONFIG_STATIC_SHM > static inline struct membanks *bootinfo_get_shmem(void) > { > - return &bootinfo.shmem.common; > + return container_of(&bootinfo.shmem.common, struct membanks, common); > } > > static inline struct shmem_membank_extra *bootinfo_get_shmem_extra(void) > diff --git a/xen/arch/arm/include/asm/static-shmem.h > b/xen/arch/arm/include/asm/static-shmem.h > index 3b6569e5703f..806ee41cfc37 100644 > --- a/xen/arch/arm/include/asm/static-shmem.h > +++ b/xen/arch/arm/include/asm/static-shmem.h > @@ -45,6 +45,18 @@ int make_shm_resv_memory_node(const struct kernel_info > *kinfo, int addrcells, > void shm_mem_node_fill_reg_range(const struct kernel_info *kinfo, __be32 > *reg, > int *nr_cells, int addrcells, int > sizecells); > > +static inline struct membanks * > +kernel_info_get_shm_mem(struct kernel_info *kinfo) > +{ > + return container_of(&kinfo->shm_mem.common, struct membanks, common); > +} > + > +static inline const struct membanks * > +kernel_info_get_shm_mem_const(const struct kernel_info *kinfo) > +{ > + return container_of(&kinfo->shm_mem.common, const struct membanks, > common); > +} > + > #else /* !CONFIG_STATIC_SHM */ > > /* Worst case /memory node reg element: (addrcells + sizecells) */ > diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c > index 09f474ec6050..78881dd1d3f7 100644 > --- a/xen/arch/arm/static-shmem.c > +++ b/xen/arch/arm/static-shmem.c > @@ -172,16 +172,16 @@ static int __init assign_shared_memory(struct domain *d, > } > > static int __init > -append_shm_bank_to_domain(struct shared_meminfo *kinfo_shm_mem, paddr_t > start, > +append_shm_bank_to_domain(struct kernel_info *kinfo, paddr_t start, > paddr_t size, const char *shm_id) > { > - struct membanks *shm_mem = &kinfo_shm_mem->common; > + struct membanks *shm_mem = kernel_info_get_shm_mem(kinfo); > 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_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; > @@ -289,8 +289,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, gbase, psize, > - shm_id); > + ret = append_shm_bank_to_domain(kinfo, gbase, psize, shm_id); > if ( ret ) > return ret; > } > @@ -301,7 +300,7 @@ int __init process_shm(struct domain *d, struct > kernel_info *kinfo, > int __init make_shm_resv_memory_node(const struct kernel_info *kinfo, > int addrcells, int sizecells) > { > - const struct membanks *mem = &kinfo->shm_mem.common; > + const struct membanks *mem = kernel_info_get_shm_mem_const(kinfo); > void *fdt = kinfo->fdt; > unsigned int i = 0; > int res = 0; > @@ -517,7 +516,7 @@ int __init process_shm_node(const void *fdt, int node, > uint32_t address_cells, > int __init make_resv_memory_node(const struct kernel_info *kinfo, int > addrcells, > int sizecells) > { > - const struct membanks *mem = &kinfo->shm_mem.common; > + const struct membanks *mem = kernel_info_get_shm_mem_const(kinfo); > void *fdt = kinfo->fdt; > int res = 0; > /* Placeholder for reserved-memory\0 */ > @@ -579,7 +578,7 @@ void __init init_sharedmem_pages(void) > int __init remove_shm_from_rangeset(const struct kernel_info *kinfo, > struct rangeset *rangeset) > { > - const struct membanks *shm_mem = &kinfo->shm_mem.common; > + const struct membanks *shm_mem = kernel_info_get_shm_mem_const(kinfo); > unsigned int i; > > /* Remove static shared memory regions */ > @@ -607,7 +606,7 @@ int __init remove_shm_from_rangeset(const struct > kernel_info *kinfo, > 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; > + const struct membanks *shm_mem = kernel_info_get_shm_mem_const(kinfo); > struct rangeset *guest_holes; > unsigned int i; > paddr_t start; > @@ -673,7 +672,7 @@ void __init shm_mem_node_fill_reg_range(const struct > kernel_info *kinfo, > __be32 *reg, int *nr_cells, > int addrcells, int sizecells) > { > - const struct membanks *mem = &kinfo->shm_mem.common; > + const struct membanks *mem = kernel_info_get_shm_mem_const(kinfo); > unsigned int i; > __be32 *cells; > > -- > 2.34.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |