|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] xen/arm: Move early mapping operations to new function
Hi Julien,
thanks for your review.
>> +void __init setup_early_mappings(paddr_t fdt_paddr)
>> +{
>> + const char *cmdline;
>> + struct bootmodule *xen_bootmodule;
>> +
>> + device_tree_flattened = early_fdt_map(fdt_paddr);
>> + if ( !device_tree_flattened )
>> + panic("Invalid device tree blob at physical address %#"PRIpaddr".\n"
>> + "The DTB must be 8-byte aligned and must not exceed 2 MB in
>> size.\n\n"
>> + "Please check your bootloader.\n",
>> + fdt_paddr);
>> +
>> + /* Register Xen's load address as a boot module. */
>> + xen_bootmodule = add_boot_module(BOOTMOD_XEN,
>> + virt_to_maddr(_start),
>> + (paddr_t)(uintptr_t)(_end - _start), false);
>> + BUG_ON(!xen_bootmodule);
>
> Don't you need the code above for the MPU?
>
>> +
>> + cmdline = boot_fdt_cmdline(device_tree_flattened);
>> + printk("Command line: %s\n", cmdline);
>> + cmdline_parse(cmdline);
>
> I find confusing this is part of early mappings. Shouldn't this be part of
> common code?
>
>> +
>> + llc_coloring_init();
>> +
>> + /*
>> + * Page tables must be setup after LLC coloring initialization because
>> + * coloring info are required in order to create colored mappings
>> + */
>> + setup_pagetables();
>> + /* Device-tree was mapped in boot page tables, remap it in the new
>> tables */
>> + device_tree_flattened = early_fdt_map(fdt_paddr);
>> +}
>> +
>> void *__init arch_vmap_virt_end(void)
>> {
>> return (void *)(VMAP_VIRT_START + VMAP_VIRT_SIZE);
>> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
>> index c1f2d1b89d43..b2f34ba2a873 100644
>> --- a/xen/arch/arm/setup.c
>> +++ b/xen/arch/arm/setup.c
>> @@ -12,7 +12,6 @@
>> #include <xen/device_tree.h>
>> #include <xen/domain_page.h>
>> #include <xen/grant_table.h>
>> -#include <xen/llc-coloring.h>
>> #include <xen/types.h>
>> #include <xen/string.h>
>> #include <xen/serial.h>
>> @@ -300,8 +299,6 @@ size_t __read_mostly dcache_line_bytes;
>> void asmlinkage __init start_xen(unsigned long fdt_paddr)
>> {
>> size_t fdt_size;
>> - const char *cmdline;
>> - struct bootmodule *xen_bootmodule;
>> struct domain *d;
>> int rc, i;
>> @@ -315,35 +312,10 @@ void asmlinkage __init start_xen(unsigned long
>> fdt_paddr)
>> smp_clear_cpu_maps();
>> - device_tree_flattened = early_fdt_map(fdt_paddr);
>> - if ( !device_tree_flattened )
>> - panic("Invalid device tree blob at physical address %#lx.\n"
>> - "The DTB must be 8-byte aligned and must not exceed 2 MB in
>> size.\n\n"
>> - "Please check your bootloader.\n",
>> - fdt_paddr);
>
> I understand why you don't need to call early_fdt_map() twice. But I am a bit
> surprised why the two calls are moved to the MMU code. I think it would be
> better if one of the call is kept here and early_fdt_map() is implemented for
> the MPU.
>
>> -
>> - /* Register Xen's load address as a boot module. */
>> - xen_bootmodule = add_boot_module(BOOTMOD_XEN,
>> - virt_to_maddr(_start),
>> - (paddr_t)(uintptr_t)(_end - _start), false);
>> - BUG_ON(!xen_bootmodule);
>> + setup_early_mappings(fdt_paddr);
>> fdt_size = boot_fdt_info(device_tree_flattened, fdt_paddr);
>
> This function will parse the memory banks. This is required by ...
>
>> - cmdline = boot_fdt_cmdline(device_tree_flattened);
>> - printk("Command line: %s\n", cmdline);
>> - cmdline_parse(cmdline);
>> -
>> - llc_coloring_init();
>
> ... llc_coloring_init(). Yet you move it early. So I think it means the cache
> coloring code would stop working.
woops, I didn’t see boot_fdt_info was parsing the memory banks, sorry I
overlooked that,
I saw no dependencies on variables and given that I don’t have a working cache
coloring setup
I didn’t notice. I’ll be more careful next time.
>
>
> > -> - /*
>> - * Page tables must be setup after LLC coloring initialization because
>> - * coloring info are required in order to create colored mappings
>> - */
>> - setup_pagetables();
>> - /* Device-tree was mapped in boot page tables, remap it in the new
>> tables */
>> - device_tree_flattened = early_fdt_map(fdt_paddr);
>> -
>> setup_mm();
>> vm_init();
So yes I would have used some duplication for the MPU part doing this:
void __init setup_early_mappings(paddr_t fdt_paddr)
{
const char *cmdline;
struct bootmodule *xen_bootmodule;
<setup_mpu>
device_tree_flattened = early_fdt_map(fdt_paddr);
if ( !device_tree_flattened )
panic("Invalid device tree blob at physical address %#"PRIpaddr".\n"
"The DTB must be 8-byte aligned and must not exceed 2 MB in
size.\n\n"
"Please check your bootloader.\n",
fdt_paddr);
/* Register Xen's load address as a boot module. */
xen_bootmodule = add_boot_module(BOOTMOD_XEN,
virt_to_maddr(_start),
(paddr_t)(uintptr_t)(_end - _start), false);
BUG_ON(!xen_bootmodule);
cmdline = boot_fdt_cmdline(device_tree_flattened);
printk("Command line: %s\n", cmdline);
cmdline_parse(cmdline);
}
I discussed with Michal before and he suggested to setup the MPU from the early
ASM code,
it sounded a good idea to do that in the mpu enable_boot_cpu_mm, but then I
realised my
MPU region table sits in .bss.
So I had some choices:
1) place the MPU region table in .data? I would still like it to be zeroed but
I could do that in a “setup_mpu()” function.
There is still the DT additional early_fdt_map call, but maybe I could move
that into setup_pagetables() ?
Or I could have a return value from llc_coloring_init() and make the second
early_fdt_map call depending on if
cache coloring is setup or not?
I would then provide an empty stub for setup_pagetables() on MPU systems.
2) Provide a common function like what I’ve tried to do in this patch, so that
different memory management subsystem
could provide their implementation. Key differences as we saw are:
a) MMU don’t call anything before early_fdt_map because it has already
some data structure in place at this stage
b) MMU needs to call llc_coloring_init, setup_pagetables and an
additional early_fdt_map.
Would something like pre_fdt_map(), post_fdt_map() work? pre_fdt_map()
would be empty for MMU.
Please let me know your view on this, maybe you have some better design.
Cheers,
Luca
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |