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

Re: [Xen-devel] [RFC] xen/arm: domain_build: introduce dom0_lowmem bootargs



Hi Julien,
On Tue, Sep 13, 2016 at 01:59:01PM +0100, Julien Grall wrote:
>Hello Peng,
>
>On 13/09/16 13:55, Peng Fan wrote:
>>On AArch64 SoCs, some IPs may only have the capability to access
>>32bits address space. The physical memory assigned for Dom0 maybe
>>not in 4GB address space, then the IPs will not work properly.
>>
>>Introduce dom0_lowmem bootargs, user could pass "dom0_lowmem=xx"
>>to xen. It means how much memory user would like to be allocated
>>in lower 4GB memory space. If there is not enough memory for
>>dom0_lowmem, higher memory will be allocated.
>>
>>Thinking such a memory layout on an AArch64 SoC:
>>Region 0: 2GB(0x80000000 - 0xffffffff)
>>Region 1: 4GB(0x880000000 - 0x97fffffff)
>>If user would like to assign 2GB for Dom0 and 1GB of the 2GB memory
>>in Region 0, user could pass "dom0=2048M dom0_lowmem=1024M" to xen.
>>
>>Signed-off-by: Peng Fan <peng.fan@xxxxxxx>
>>Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>>Cc: Julien Grall <julien.grall@xxxxxxx>
>>---
>>
>>This patch is to resolve the issue mentioned in
>>https://lists.xen.org/archives/html/xen-devel/2016-09/msg00235.html
>>This patch not tested on latest 4.8-unstable, I only tested similar
>>patch on xen 4.7 on AArch64 platform.
>
>Please test any patch send upstream on 4.8-unstable. The code may have
>changed.

I have rebase this patch based on 4.8-unstable.
latest commit:
"
commit a3fe74e4345e66ddb7aa514395260a5e5f8b0cdc
Author: Tamas K Lengyel <tamas.lengyel@xxxxxxxxxxxx>
Date:   Mon Aug 1 11:59:14 2016 -0600

    arm/vm_event: get/set registers
"

Since I have not rebased my platform patches to 4.8-unstable, so have not 
tested.

Please kindly comments whether introudcing "dom0_lowmem" is acceptable or not
to resolve the issue I met in 
https://lists.xen.org/archives/html/xen-devel/2016-09/msg00235.html.

I'll rebase my platform patches and do some test.

>
>>
>>The idea of patch is that user could specify the lowmem that user would
>>like to use. I rethought the ideas in 
>>https://lists.xen.org/archives/html/xen-devel/2016-09/msg00487.html,
>>but that is not good. lowmem is precise, it maybe used for some IPs that maybe
>>passthrough to DomU, so we only allocate the needed memory for Dom0.
>
>Why? IPs passthrough to DomU will have to be protected by an SMMU so it does
>not matter whether Dom0 is using all the lowmem or not.

I just think there maybe some cases that some physical memory need to be
reserved for DomU usage.
SMMU is not a must when we passthrough a non DMA capable device to DomU.
So I think an DRAM area can be encoded in dts, and passthrough to DomU.

Thanks,
Peng.
>
>Regards,
>
>>
>> xen/arch/arm/domain_build.c | 30 +++++++++++++++++++++++++++++-
>> 1 file changed, 29 insertions(+), 1 deletion(-)
>>
>>diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
>>index 35ab08d..0f53bba 100644
>>--- a/xen/arch/arm/domain_build.c
>>+++ b/xen/arch/arm/domain_build.c
>>@@ -33,6 +33,8 @@ int dom0_11_mapping = 1;
>>
>> #define DOM0_MEM_DEFAULT 0x8000000 /* 128 MiB */
>> static u64 __initdata dom0_mem = DOM0_MEM_DEFAULT;
>>+/* Only for AArch64 */
>>+static u64 __initdata dom0_lowmem;
>>
>> static void __init parse_dom0_mem(const char *s)
>> {
>>@@ -42,6 +44,12 @@ static void __init parse_dom0_mem(const char *s)
>> }
>> custom_param("dom0_mem", parse_dom0_mem);
>>
>>+static void __init parse_dom0_lowmem(const char *s)
>>+{
>>+    dom0_lowmem = parse_size_and_unit(s, &s);
>>+}
>>+custom_param("dom0_lowmem", parse_dom0_lowmem);
>>+
>> //#define DEBUG_11_ALLOCATION
>> #ifdef DEBUG_11_ALLOCATION
>> # define D11PRINT(fmt, args...) printk(XENLOG_DEBUG fmt, ##args)
>>@@ -244,7 +252,7 @@ static void allocate_memory(struct domain *d, struct 
>>kernel_info *kinfo)
>>     unsigned int order = get_11_allocation_size(kinfo->unassigned_mem);
>>     int i;
>>
>>-    bool_t lowmem = is_32bit_domain(d);
>>+    bool_t lowmem = is_32bit_domain(d) || !!dom0_lowmem;
>>     unsigned int bits;
>>
>>     /*
>>@@ -263,6 +271,9 @@ static void allocate_memory(struct domain *d, struct 
>>kernel_info *kinfo)
>>      * First try and allocate the largest thing we can as low as
>>      * possible to be bank 0.
>>      */
>>+    if ( dom0_lowmem )
>>+        order = get_order_from_bytes(dom0_lowmem);
>>+
>>     while ( order >= min_low_order )
>>     {
>>         for ( bits = order ; bits <= (lowmem ? 32 : PADDR_BITS); bits++ )
>>@@ -278,6 +289,11 @@ static void allocate_memory(struct domain *d, struct 
>>kernel_info *kinfo)
>>
>>  got_bank0:
>>
>>+    if ( dom0_lowmem ) {
>>+        dom0_lowmem -= pfn_to_paddr((1 << order));
>>+        lowmem = is_32bit_domain(d) || !!dom0_lowmem;
>>+    }
>>+
>>     if ( !insert_11_bank(d, kinfo, pg, order) )
>>         BUG(); /* Cannot fail for first bank */
>>
>>@@ -325,6 +341,16 @@ static void allocate_memory(struct domain *d, struct 
>>kernel_info *kinfo)
>>             }
>>         }
>>
>>+        if ( dom0_lowmem && lowmem )
>>+        {
>>+            dom0_lowmem -= pfn_to_paddr((1 << order));
>>+            lowmem = is_32bit_domain(d) || !!dom0_lowmem;
>>+        }
>>+     else
>>+        {
>>+            lowmem = false;
>>+        }
>>+
>>         /*
>>          * Success, next time around try again to get the largest order
>>          * allocation possible.
>>@@ -2098,6 +2124,8 @@ int construct_dom0(struct domain *d)
>>
>>     d->max_pages = ~0U;
>>
>>+    BUG_ON(dom0_mem < dom0_lowmem);
>>+
>>     kinfo.unassigned_mem = dom0_mem;
>>
>>     rc = kernel_probe(&kinfo);
>>
>
>-- 
>Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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