[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 2/7] xen/arm: introduce domain on Static Allocation
On Tue, 24 Aug 2021, Penny Zheng wrote: > Static Allocation refers to system or sub-system(domains) for which memory > areas are pre-defined by configuration using physical address ranges. > Those pre-defined memory, -- Static Memory, as parts of RAM reserved in the > beginning, shall never go to heap allocator or boot allocator for any use. > > Memory can be statically allocated to a domain using the property "xen,static- > mem" defined in the domain configuration. The number of cells for the address > and the size must be defined using respectively the properties > "#xen,static-mem-address-cells" and "#xen,static-mem-size-cells". > > This patch introduces this new `xen,static-mem` feature, and also documents > and parses this new attribute at boot time. > > This patch also introduces a new field "bool xen_domain" in "struct membank" > to tell the difference of one memory bank is reserved as the whole > hardware resource, or bind to one specific xen domain node, through > "xen,static-mem" > > Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx> > --- > v5 changes: > - check the node using the Xen domain binding whether contains the property > "xen,static-mem", not the property itself > - add "rc = ..." to get the error propagated > - introduce new field "bool xen_domain", then static memory shall be also > stored > as reserved memory(bootinfo.reserved_mem), but being bind to one > specific Xen domain node. > - doc refinement > --- > docs/misc/arm/device-tree/booting.txt | 33 ++++++++++++++++++++++++ > xen/arch/arm/bootfdt.c | 36 +++++++++++++++++++++++++-- > xen/include/asm-arm/setup.h | 1 + > 3 files changed, 68 insertions(+), 2 deletions(-) > > diff --git a/docs/misc/arm/device-tree/booting.txt > b/docs/misc/arm/device-tree/booting.txt > index 5243bc7fd3..95b20ddc3a 100644 > --- a/docs/misc/arm/device-tree/booting.txt > +++ b/docs/misc/arm/device-tree/booting.txt > @@ -268,3 +268,36 @@ The DTB fragment is loaded at 0xc000000 in the example > above. It should > follow the convention explained in docs/misc/arm/passthrough.txt. The > DTB fragment will be added to the guest device tree, so that the guest > kernel will be able to discover the device. > + > + > +Static Allocation > +============= > + > +Static Allocation refers to system or sub-system(domains) for which memory > +areas are pre-defined by configuration using physical address ranges. > + > +Memory can be statically allocated to a domain using the property > "xen,static- > +mem" defined in the domain configuration. The number of cells for the address > +and the size must be defined using respectively the properties > +"#xen,static-mem-address-cells" and "#xen,static-mem-size-cells". > + > +Below is an example on how to specify the static memory region in the > +device-tree: > + > + / { > + chosen { > + domU1 { > + compatible = "xen,domain"; > + #address-cells = <0x2>; > + #size-cells = <0x2>; > + cpus = <2>; > + #xen,static-mem-address-cells = <0x1>; > + #xen,static-mem-size-cells = <0x1>; > + xen,static-mem = <0x30000000 0x20000000>; > + ... > + }; > + }; > + }; > + > +This will reserve a 512MB region starting at the host physical address > +0x30000000 to be exclusively used by DomU1 This binding is OK. We might want to clarify what is the purpose of the "memory" property when "xen,static-mem" is present. I would suggest to write that when "xen,static-mem" is present, the "memory" property becomes optional. Or even better: """ When present, the xen,static-mem property supersedes the memory property. """ In the future when Xen will support direct mapping, I assume that we'll also add a direct-map property to enable it. Something like: domU1 { compatible = "xen,domain"; #address-cells = <0x2>; #size-cells = <0x2>; cpus = <2>; #xen,static-mem-address-cells = <0x1>; #xen,static-mem-size-cells = <0x1>; xen,static-mem = <0x30000000 0x20000000>; direct-map; ... }; Maybe I would add a statement to clarify it that xen,static-mem doesn't automatically imply direct mapping. Something like: """ The static memory will be mapped in the guest at the usual guest memory addresses (GUEST_RAM0_BASE, GUEST_RAM1_BASE) defined by xen/include/public/arch-arm.h. """ The rest of the patch looks OK. One minor NIT below. > diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c > index 8c81be3379..00f34eec58 100644 > --- a/xen/arch/arm/bootfdt.c > +++ b/xen/arch/arm/bootfdt.c > @@ -66,7 +66,7 @@ void __init device_tree_get_reg(const __be32 **cell, u32 > address_cells, > static int __init device_tree_get_meminfo(const void *fdt, int node, > const char *prop_name, > u32 address_cells, u32 size_cells, > - void *data) > + void *data, bool xen_domain) > { > const struct fdt_property *prop; > unsigned int i, banks; > @@ -90,6 +90,7 @@ static int __init device_tree_get_meminfo(const void *fdt, > int node, > continue; > mem->bank[mem->nr_banks].start = start; > mem->bank[mem->nr_banks].size = size; > + mem->bank[mem->nr_banks].xen_domain = xen_domain; > mem->nr_banks++; > } > > @@ -184,7 +185,8 @@ static int __init process_memory_node(const void *fdt, > int node, > return -EINVAL; > } > > - return device_tree_get_meminfo(fdt, node, "reg", address_cells, > size_cells, data); > + return device_tree_get_meminfo(fdt, node, "reg", address_cells, > size_cells, > + data, false); > } > > static int __init process_reserved_memory_node(const void *fdt, int node, > @@ -338,6 +340,34 @@ static void __init process_chosen_node(const void *fdt, > int node, > add_boot_module(BOOTMOD_RAMDISK, start, end-start, false); > } > > +static int __init process_domain_node(const void *fdt, int node, > + const char *name, > + u32 address_cells, u32 size_cells) > +{ > + const struct fdt_property *prop; > + > + printk("Checking for \"xen,static-mem\" in domain node\n"); > + > + prop = fdt_get_property(fdt, node, "xen,static-mem", NULL); > + if ( !prop ) > + /* No "xen,static-mem" present. */ > + return 0; > + > + address_cells = device_tree_get_u32(fdt, node, > + "#xen,static-mem-address-cells", 0); > + size_cells = device_tree_get_u32(fdt, node, > + "#xen,static-mem-size-cells", 0); > + if ( address_cells < 1 || size_cells < 1 ) > + { > + printk("fdt: node `%s': invalid #xen,static-mem-address-cells or > #xen,static-mem-size-cells", > + name); > + return -EINVAL; > + } > + > + return device_tree_get_meminfo(fdt, node, "xen,static-mem", > address_cells, > + size_cells, &bootinfo.reserved_mem, true); > +} > + > static int __init early_scan_node(const void *fdt, > int node, const char *name, int depth, > u32 address_cells, u32 size_cells, > @@ -356,6 +386,8 @@ static int __init early_scan_node(const void *fdt, > process_multiboot_node(fdt, node, name, address_cells, size_cells); > else if ( depth == 1 && device_tree_node_matches(fdt, node, "chosen") ) > process_chosen_node(fdt, node, name, address_cells, size_cells); > + else if ( depth == 2 && device_tree_node_compatible(fdt, node, > "xen,domain") ) > + rc = process_domain_node(fdt, node, name, address_cells, size_cells); > > if ( rc < 0 ) > printk("fdt: node `%s': parsing failed\n", name); > diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h > index c4b6af6029..6c3c16294b 100644 > --- a/xen/include/asm-arm/setup.h > +++ b/xen/include/asm-arm/setup.h > @@ -24,6 +24,7 @@ typedef enum { > struct membank { > paddr_t start; > paddr_t size; > + bool xen_domain; /* whether memory bank is bind to Xen domain. */ ^ a or the ^ bound to a > }; > > struct meminfo { > -- > 2.25.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |