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

[xen master] xen/arm: Skip memory nodes if not enabled



commit c419d2dd351c170ab7b44459b7f121599b23293d
Author:     Leo Yan <leo.yan@xxxxxxxxxx>
AuthorDate: Fri Oct 13 20:04:42 2023 +0800
Commit:     Julien Grall <jgrall@xxxxxxxxxx>
CommitDate: Thu Nov 16 13:58:35 2023 +0000

    xen/arm: Skip memory nodes if not enabled
    
    Currently, Xen doesn't check the status property of memory/reserved
    memory nodes, which may lead to the following issues:
    
    - If a memory node has a status "disabled" it implies that it should
      not be used. Xen does not handle the status property for the memory
      node and ends up using it.
    
    - If a reserved memory node has a status "disabled", it means that this
      region is no longer reserved and can be used, but the "disabled"
      status is not handled by Xen.
    
      Xen passes the intact device tree binding of the reserved memory nodes
      to Dom0 and creates a memory node to cover reserved regions. Disabled
      reserved memory nodes are ignored by the Dom0 Linux kernel, thus the
      Dom0 Linux kernel will continue to allocate pages from such a region.
    
      On the other hand, since the disabled status is not handled by Xen,
      the disabled reserved memory regions are excluded from the page
      management in Xen which results in Xen being unable to obtain the
      corresponding MFN, in the end, Xen reports error like:
    
      (XEN) arch/arm/p2m.c:2202: d0v0: Failing to acquire the MFN 0x1a02dc
    
    This patch introduces a function device_tree_node_is_available(). If it
    detects a memory node is not enabled, Xen will not add the memory region
    into the memory lists. In the end, this avoids to generate the memory
    node for the disabled memory regions sent to the kernel and the kernel
    cannot use the disabled memory nodes any longer.
    
    Since this patch adds checking device node's status in the
    device_tree_get_meminfo() function, except it checks for memory nodes
    and reserved memory nodes, it also supports status for static memory
    and static heap.
    
    Suggested-by: Michal Orzel <michal.orzel@xxxxxxx>
    Signed-off-by: Leo Yan <leo.yan@xxxxxxxxxx>
    Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>
---
 xen/arch/arm/bootfdt.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
index 2673ad17a1..d73f8e4971 100644
--- a/xen/arch/arm/bootfdt.c
+++ b/xen/arch/arm/bootfdt.c
@@ -16,6 +16,24 @@
 #include <xsm/xsm.h>
 #include <asm/setup.h>
 
+static bool __init device_tree_node_is_available(const void *fdt, int node)
+{
+    const char *status;
+    int len;
+
+    status = fdt_getprop(fdt, node, "status", &len);
+    if ( !status )
+        return true;
+
+    if ( len > 0 )
+    {
+        if ( !strcmp(status, "ok") || !strcmp(status, "okay") )
+            return true;
+    }
+
+    return false;
+}
+
 static bool __init device_tree_node_matches(const void *fdt, int node,
                                             const char *match)
 {
@@ -97,6 +115,9 @@ static int __init device_tree_get_meminfo(const void *fdt, 
int node,
     paddr_t start, size;
     struct meminfo *mem = data;
 
+    if ( !device_tree_node_is_available(fdt, node) )
+        return 0;
+
     if ( address_cells < 1 || size_cells < 1 )
     {
         printk("fdt: property `%s': invalid #address-cells or #size-cells",
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

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