[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v5 2/7] xen/arm: introduce domain on Static Allocation
Hi Stefano > -----Original Message----- > From: Stefano Stabellini <sstabellini@xxxxxxxxxx> > Sent: Friday, September 3, 2021 5:31 AM > To: Penny Zheng <Penny.Zheng@xxxxxxx> > Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx; sstabellini@xxxxxxxxxx; julien@xxxxxxx; > Bertrand Marquis <Bertrand.Marquis@xxxxxxx>; Wei Chen > <Wei.Chen@xxxxxxx>; nd <nd@xxxxxxx> > Subject: 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. > """ > oh, "supersede" learned! ;) > > 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. > """ > Thanks for the detailed suggestion. I'll just take it. > 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 > Sure. Will fix it. > > > }; > > > > struct meminfo { > > -- > > 2.25.1 > >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |