[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v5 07/25] xen/arm: don't add duplicate boot modules, introduce domU flag



On Tue, 30 Oct 2018, Julien Grall wrote:
> Hi Stefano,
> 
> On 23/10/2018 03:02, 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 all versions of the multiboot spec.
> > 
> > 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 v5:
> > - improve commit message
> > - add in-code comments
> > 
> > Changes in v4:
> > - use unsigned int
> > - better commit message
> > - introduce domU flag and usage
> > 
> > Changes in v2:
> > - new patch
> > ---
> >   xen/arch/arm/bootfdt.c      | 11 +++++++----
> >   xen/arch/arm/setup.c        | 30 +++++++++++++++++++++++++-----
> >   xen/include/asm-arm/setup.h | 12 ++++++++++--
> >   3 files changed, 42 insertions(+), 11 deletions(-)
> > 
> > diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
> > index cb6f77d..c325b6e 100644
> > --- a/xen/arch/arm/bootfdt.c
> > +++ b/xen/arch/arm/bootfdt.c
> > @@ -175,6 +175,7 @@ static void __init process_multiboot_node(const void
> > *fdt, int node,
> >       int len = sizeof("/chosen");
> >       char path[8]; /* sizeof "/chosen" */
> >       int parent_node, ret;
> > +    bool domU;
> >         parent_node = fdt_parent_offset(fdt, node);
> >       ASSERT(parent_node >= 0);
> > @@ -229,12 +230,14 @@ static void __init process_multiboot_node(const void
> > *fdt, int node,
> >               kind = BOOTMOD_XSM;
> >       }
> >   -    add_boot_module(kind, start, size);
> > +    domU = fdt_node_check_compatible(fdt, parent_node, "xen,domain") == 0;
> > +    add_boot_module(kind, start, size, domU);
> >         prop = fdt_get_property(fdt, node, "bootargs", &len);
> >       if ( !prop )
> >           return;
> > -    add_boot_cmdline(fdt_get_name(fdt, parent_node, &len), prop->data,
> > kind);
> > +    add_boot_cmdline(fdt_get_name(fdt, parent_node, &len), prop->data,
> > +                     kind, domU);
> >   }
> >     static void __init process_chosen_node(const void *fdt, int node,
> > @@ -280,7 +283,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,
> > @@ -351,7 +354,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 2098591..72b12f9 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;
> > +    unsigned int i;
> >         if ( mods->nr_mods == MAX_MODULES )
> >       {
> > @@ -212,15 +214,29 @@ 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;
> >   }
> >   +/*
> > + * This function is only used to find dom0 modules, so check for !mod->domU
> 
> This comment is misleading. The function is used not only to find Dom0 Modules
> but also XSM & co.
> 
> How about:
> 
> "boot_module_find_by_kind can only be used to return Xen modules (e.g XSM,
> DTB) or Dom0 modules. This is not suitable for looking up for guest modules."

Sure, that's clearer


> > + */
> >   struct bootmodule * __init boot_module_find_by_kind(bootmodule_kind kind)
> >   {
> >       struct bootmodules *mods = &bootinfo.modules;
> > @@ -229,14 +245,14 @@ 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 )
> >               return mod;
> >       }
> >       return NULL;
> >   }
> >     void __init add_boot_cmdline(const char *name, const char *cmdline,
> > -                             bootmodule_kind kind)
> > +                             bootmodule_kind kind, bool domU)
> >   {
> >       struct bootcmdlines *cmds = &bootinfo.cmdlines;
> >       struct bootcmdline *cmd;
> > @@ -249,6 +265,7 @@ void __init add_boot_cmdline(const char *name, const
> > char *cmdline,
> >         cmd = &cmds->cmdline[cmds->nr_mods++];
> >       cmd->kind = kind;
> > +    cmd->domU = domU;
> >         ASSERT(strlen(name) <= DT_MAX_NAME);
> >       safe_strcpy(cmd->dt_name, name);
> > @@ -258,6 +275,9 @@ void __init add_boot_cmdline(const char *name, const
> > char *cmdline,
> >       safe_strcpy(cmd->cmdline, cmdline);
> >   }
> >   +/*
> > + * This function is only used to find dom0 modules, so check for !mod->domU
> > + */
> 
> Same here.

OK


> >   struct bootcmdline * __init boot_cmdline_find_by_kind(bootmodule_kind
> > kind)
> >   {
> >       struct bootcmdlines *cmds = &bootinfo.cmdlines;
> > @@ -267,7 +287,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 )
> >               return cmd;
> >       }
> >       return NULL;
> > @@ -761,7 +781,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 7580007..3a30329 100644
> > --- a/xen/include/asm-arm/setup.h
> > +++ b/xen/include/asm-arm/setup.h
> > @@ -30,9 +30,16 @@ struct meminfo {
> >       struct 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
> > + * kernel_probe, where we try to guess which is the dom0 kernel and
> > + * initrd to be compatible with all versions of the multiboot spec.
> > + */
> >   #define BOOTMOD_MAX_CMDLINE 1024
> >   struct bootmodule {
> >       bootmodule_kind kind;
> > +    bool domU;
> >       paddr_t start;
> >       paddr_t size;
> >   };
> > @@ -41,6 +48,7 @@ struct bootmodule {
> >   #define DT_MAX_NAME 41
> >   struct bootcmdline {
> >       bootmodule_kind kind;
> > +    bool domU;
> >       char dt_name[DT_MAX_NAME];
> >       char cmdline[BOOTMOD_MAX_CMDLINE];
> >   };
> > @@ -91,10 +99,10 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t
> > paddr);
> >   const char __init *boot_fdt_cmdline(const void *fdt);
> >     struct bootmodule *add_boot_module(bootmodule_kind kind,
> > -                                   paddr_t start, paddr_t size);
> > +                                   paddr_t start, paddr_t size, bool domU);
> >   struct bootmodule *boot_module_find_by_kind(bootmodule_kind kind);
> >   void add_boot_cmdline(const char *name, const char *cmdline,
> > -                      bootmodule_kind kind);
> > +                      bootmodule_kind kind, bool domU);
> >   struct bootcmdline *boot_cmdline_find_by_kind(bootmodule_kind kind);
> >   const char * __init boot_module_kind_as_string(bootmodule_kind kind);
> >   
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.