|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 06/23] xen/arm: don't add duplicate boot modules, introduce domU flag
On Tue, 9 Oct 2018, Julien Grall wrote:
> Hi Stefano,
>
> On 05/10/2018 19:47, Stefano Stabellini wrote:
> > Don't add duplicate boot modules (same kind and same start address),
> > they are freed later, we don't want to introduce double-free errors.
> >
> > Introduce a domU flag in struct bootmodule and struct bootcmdline. Set
> > it for kernels and ramdisks of "xen,domain" nodes to avoid getting
> > confused in kernel_probe, where we try to guess which is the dom0 kernel
> > and initrd to be compatible with older versions of the multiboot spec.
>
> This comments need at least to be replicated in the structure. So we have an
> idea how to use it.
>
> Lastly, technically it is not older versions of the specification. Your
> extension does not deal with Dom0.
OK
> >
> > boot_module_find_by_kind and boot_cmdline_find_by_kind automatically
> > check for !domU entries (they are only used for non-domU modules).
> >
> > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
> >
> > ---
> > Changes in v4:
> > - use unsigned int
> > - better commit message
> > - introduce domU flag and usage
> >
> > Changes in v2:
> > - new patch
> > ---
> > xen/arch/arm/bootfdt.c | 14 +++++++++-----
> > xen/arch/arm/setup.c | 21 +++++++++++++++++----
> > xen/include/asm-arm/setup.h | 4 +++-
> > 3 files changed, 29 insertions(+), 10 deletions(-)
> >
> > diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
> > index 273032b..349aa9d 100644
> > --- a/xen/arch/arm/bootfdt.c
> > +++ b/xen/arch/arm/bootfdt.c
> > @@ -164,7 +164,8 @@ static void __init process_memory_node(const void *fdt,
> > int node,
> > }
> > static void __init add_boot_cmdline(const void *fdt, int node,
> > - const char *name, bootmodule_kind kind)
> > + const char *name, bootmodule_kind kind,
> > + bool domU)
> > {
> > struct bootcmdlines *cmds = &bootinfo.cmdlines;
> > struct bootcmdline *cmd;
> > @@ -184,6 +185,7 @@ static void __init add_boot_cmdline(const void *fdt, int
> > node,
> > cmd = &cmds->cmdline[cmds->nr_mods++];
> > cmd->kind = kind;
> > + cmd->domU = domU;
> > ASSERT(strlen(name) <= DT_MAX_NAME);
> > safe_strcpy(cmd->dt_name, name);
> > @@ -206,6 +208,7 @@ static void __init process_multiboot_node(const void
> > *fdt, int node,
> > int len = sizeof("/chosen");
> > char path[8]; /* sizeof "/chosen" */
> > int parent_node;
> > + bool domU;
> > parent_node = fdt_parent_offset(fdt, node);
> > ASSERT(parent_node >= 0);
> > @@ -263,8 +266,9 @@ static void __init process_multiboot_node(const void
> > *fdt, int node,
> > kind = BOOTMOD_XSM;
> > }
> > - add_boot_module(kind, start, size);
> > - add_boot_cmdline(fdt, node, fdt_get_name(fdt, parent_node, &len),
> > kind);
> > + domU = fdt_node_check_compatible(fdt, parent_node, "xen,domain") == 0;
> > + add_boot_module(kind, start, size, domU);
> > + add_boot_cmdline(fdt, node, fdt_get_name(fdt, parent_node, &len), kind,
> > domU);
> > }
> > static void __init process_chosen_node(const void *fdt, int node,
> > @@ -310,7 +314,7 @@ static void __init process_chosen_node(const void *fdt,
> > int node,
> > printk("Initrd %"PRIpaddr"-%"PRIpaddr"\n", start, end);
> > - add_boot_module(BOOTMOD_RAMDISK, start, end-start);
> > + add_boot_module(BOOTMOD_RAMDISK, start, end-start, false);
> > }
> > static int __init early_scan_node(const void *fdt,
> > @@ -381,7 +385,7 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t
> > paddr)
> > if ( ret < 0 )
> > panic("No valid device tree\n");
> > - add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt));
> > + add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt), false);
> > device_tree_for_each_node((void *)fdt, early_scan_node, NULL);
> > early_print_info();
> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> > index bc7dd97..dbab232 100644
> > --- a/xen/arch/arm/setup.c
> > +++ b/xen/arch/arm/setup.c
> > @@ -201,10 +201,12 @@ void __init dt_unreserved_regions(paddr_t s, paddr_t
> > e,
> > }
> > struct bootmodule __init *add_boot_module(bootmodule_kind kind,
> > - paddr_t start, paddr_t size)
> > + paddr_t start, paddr_t size,
> > + bool domU)
> > {
> > struct bootmodules *mods = &bootinfo.modules;
> > struct bootmodule *mod;
> This at least need to be replica
I take this was a typo?
> > + unsigned int i;
> > if ( mods->nr_mods == MAX_MODULES )
> > {
> > @@ -212,11 +214,22 @@ struct bootmodule __init
> > *add_boot_module(bootmodule_kind kind,
> > boot_module_kind_as_string(kind), start, start + size);
> > return NULL;
> > }
> > + for ( i = 0 ; i < mods->nr_mods ; i++ )
> > + {
> > + mod = &mods->module[i];
> > + if ( mod->kind == kind && mod->start == start )
> > + {
> > + if ( !domU )
> > + mod->domU = false;
> > + return mod;
> > + }
> > + }
> > mod = &mods->module[mods->nr_mods++];
> > mod->kind = kind;
> > mod->start = start;
> > mod->size = size;
> > + mod->domU = domU;
> > return mod;
> > }
> > @@ -229,7 +242,7 @@ struct bootmodule * __init
> > boot_module_find_by_kind(bootmodule_kind kind)
> > for (i = 0 ; i < mods->nr_mods ; i++ )
> > {
> > mod = &mods->module[i];
> > - if ( mod->kind == kind )
> > + if ( mod->kind == kind && !mod->domU )
>
> From the name of the function is it unclear why we would only return module
> with !mod->domU. So this needs some clarifications in the code.
I'll add a comment
>
> > return mod;
> > }
> > return NULL;
> > @@ -244,7 +257,7 @@ struct bootcmdline * __init
> > boot_cmdline_find_by_kind(bootmodule_kind kind)
> > for ( i = 0 ; i < cmds->nr_mods ; i++ )
> > {
> > cmd = &cmds->cmdline[i];
> > - if ( cmd->kind == kind )
> > + if ( cmd->kind == kind && !cmd->domU )
>
> Ditto here.
I'll add a comment
> > return cmd;
> > }
> > return NULL;
> > @@ -738,7 +751,7 @@ void __init start_xen(unsigned long boot_phys_offset,
> > /* Register Xen's load address as a boot module. */
> > xen_bootmodule = add_boot_module(BOOTMOD_XEN,
> > (paddr_t)(uintptr_t)(_start +
> > boot_phys_offset),
> > - (paddr_t)(uintptr_t)(_end - _start + 1));
> > + (paddr_t)(uintptr_t)(_end - _start + 1),
> > false);
> > BUG_ON(!xen_bootmodule);
> > xen_paddr = get_xen_paddr();
> > diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
> > index c2ed5cc..711b4a2 100644
> > --- a/xen/include/asm-arm/setup.h
> > +++ b/xen/include/asm-arm/setup.h
> > @@ -33,6 +33,7 @@ struct meminfo {
> > #define BOOTMOD_MAX_CMDLINE 1024
> > struct bootmodule {
> > bootmodule_kind kind;
> > + bool domU;
>
> This needs some documentation in the code.
OK
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |