devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem
@ 2024-07-08 23:06 Oreoluwa Babatunde
  2024-07-08 23:06 ` [PATCH 1/4] Revert "of: reserved_mem: Restructure code to call reserved mem init functions earlier" Oreoluwa Babatunde
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Oreoluwa Babatunde @ 2024-07-08 23:06 UTC (permalink / raw)
  To: robh, saravanak, klarasmodin, aisheng.dong
  Cc: hch, m.szyprowski, robin.murphy, devicetree, linux-kernel, iommu,
	will, catalin.marinas, kernel, Oreoluwa Babatunde

With recent changes made to initialize the cma regions before the page
tables are setup, commit f2a524d9ef5b ("of: reserved_mem: Restructure
code to call reserved mem init functions earlier"), an issue was
introduced where the initialization of the cma regions fail and are
initialized as "non-reusable" regions instead of "reusable". [1], [2]

This issue occurs because the device_node of the regions are not yet
created by the time the cma regions are being initialized.

The cma regions need to be initialized before the page tables are setup
for them to be configured correctly as was realized in [3].

Hence, since the unflatten_devicetree APIs are not available until after
the page tables have been setup, revert back to using the fdt APIs. This
makes it possible to store a reference to each cma node in the
reserved_mem array by the time it is needed in the init function.

[1] https://lore.kernel.org/all/DU0PR04MB9299C3EC247E1FE2C373440F80DE2@DU0PR04MB9299.eurprd04.prod.outlook.com/

[2] https://lore.kernel.org/all/986361f4-f000-4129-8214-39f2fb4a90da@gmail.com/

[3] https://lore.kernel.org/all/20240610213403.GA1697364@thelio-3990X/

Oreoluwa Babatunde (4):
  Revert "of: reserved_mem: Restructure code to call reserved mem init
    functions earlier"
  Revert "of: reserved_mem: Rename fdt_* functions to refelct the change
    from using fdt APIs"
  Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan
    reserved memory nodes"
  of: reserved_mem: Restructure code to call rmem init functions earlier

 drivers/of/fdt.c                |   2 +-
 drivers/of/of_private.h         |   2 +-
 drivers/of/of_reserved_mem.c    | 103 +++++++++++++++++---------------
 include/linux/of_reserved_mem.h |   2 +-
 kernel/dma/coherent.c           |  10 ++--
 kernel/dma/contiguous.c         |   8 +--
 kernel/dma/swiotlb.c            |  10 ++--
 7 files changed, 72 insertions(+), 65 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/4] Revert "of: reserved_mem: Restructure code to call reserved mem init functions earlier"
  2024-07-08 23:06 [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Oreoluwa Babatunde
@ 2024-07-08 23:06 ` Oreoluwa Babatunde
  2024-07-08 23:06 ` [PATCH 2/4] Revert "of: reserved_mem: Rename fdt_* functions to refelct the change from using fdt APIs" Oreoluwa Babatunde
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Oreoluwa Babatunde @ 2024-07-08 23:06 UTC (permalink / raw)
  To: robh, saravanak, klarasmodin, aisheng.dong
  Cc: hch, m.szyprowski, robin.murphy, devicetree, linux-kernel, iommu,
	will, catalin.marinas, kernel, Oreoluwa Babatunde

This reverts commit f2a524d9ef5b2cf9b06c4a59374bb5efbf697ba0.

With recent changes made to initialize the cma regions before the page
tables are setup, commit f2a524d9ef5b ("of: reserved_mem: Restructure
code to call reserved mem init functions earlier"), an issue was
introduced where the initialization of the cma regions fail and are
initialized as "non-reusable" regions instead of "reusable".

This issue occurs because the device_node of the regions are not yet
created by the time the cma regions are being initialized.

The cma regions need to be initialized before the page tables are setup
for them to be configured correctly as was realized in [1].

Hence, since the unflatten_devicetree APIs are not available until after
the page tables have been setup, revert back to using the fdt APIs. This
makes it possible to store a reference to each cma node in the
reserved_mem array by the time it is needed in their init function.

Since this fix is based on changes that were made to use the
unflatten_devicetree APIs, revert it. The fix will be reapplied with the
relevant changes needed to make use of the fdt APIs instead.

[1] https://lore.kernel.org/all/20240610213403.GA1697364@thelio-3990X/

Signed-off-by: Oreoluwa Babatunde <quic_obabatun@quicinc.com>
---
 drivers/of/fdt.c             |  2 +-
 drivers/of/of_private.h      |  2 +-
 drivers/of/of_reserved_mem.c | 83 +++++++++++++++---------------------
 3 files changed, 37 insertions(+), 50 deletions(-)

diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index ea2dff0478c7..9cde2abd2fc0 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1239,7 +1239,7 @@ void __init unflatten_device_tree(void)
 	unittest_unflatten_overlay_base();
 
 	/* initialize the reserved memory regions */
-	of_scan_reserved_mem_reg_nodes();
+	of_init_reserved_mem();
 }
 
 /**
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 7412aed903df..01b33c4b1e9f 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -181,7 +181,7 @@ static inline struct device_node *__of_get_dma_parent(const struct device_node *
 #endif
 
 int fdt_scan_reserved_mem(void);
-void of_scan_reserved_mem_reg_nodes(void);
+void of_init_reserved_mem(void);
 
 bool of_fdt_device_is_available(const void *blob, unsigned long node);
 
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index b31001728866..eb54490a0a11 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -97,8 +97,6 @@ static void __init alloc_reserved_mem_array(void)
 	reserved_mem = new_array;
 }
 
-static void __init of_init_reserved_mem_node(struct reserved_mem *rmem);
-
 /*
  * of_reserved_mem_save_node() - save fdt node for second pass initialization
  */
@@ -117,12 +115,6 @@ static void __init of_reserved_mem_save_node(struct device_node *node, const cha
 	rmem->base = base;
 	rmem->size = size;
 
-	/*
-	 * Run the region specific initialization function for the rmem
-	 * node.
-	 */
-	of_init_reserved_mem_node(rmem);
-
 	reserved_mem_count++;
 	return;
 }
@@ -209,8 +201,6 @@ static int __init __fdt_reserved_mem_check_root(unsigned long node)
 	return 0;
 }
 
-static void __init __rmem_check_for_overlap(void);
-
 /**
  * of_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined
  * reserved memory regions.
@@ -221,7 +211,7 @@ static void __init __rmem_check_for_overlap(void);
  * size are all stored in the reserved_mem array by calling the
  * of_reserved_mem_save_node() function.
  */
-void __init of_scan_reserved_mem_reg_nodes(void)
+static void __init of_scan_reserved_mem_reg_nodes(void)
 {
 	struct device_node *node, *child;
 	phys_addr_t base, size;
@@ -232,13 +222,6 @@ void __init of_scan_reserved_mem_reg_nodes(void)
 		return;
 	}
 
-	/*
-	 * Before moving forward, allocate the exact size needed for the
-	 * reserved_mem array and copy all previously saved contents
-	 * into the new array if successful.
-	 */
-	alloc_reserved_mem_array();
-
 	for_each_child_of_node(node, child) {
 		int ret = 0;
 		const char *uname;
@@ -263,8 +246,6 @@ void __init of_scan_reserved_mem_reg_nodes(void)
 		if (size)
 			of_reserved_mem_save_node(child, uname, base, size);
 	}
-	/* check for overlapping reserved regions */
-	__rmem_check_for_overlap();
 }
 
 static int __init __reserved_mem_alloc_size(unsigned long node, const char *uname);
@@ -545,38 +526,44 @@ static void __init __rmem_check_for_overlap(void)
 }
 
 /**
- * of_init_reserved_mem_node() - Initialize a saved reserved memory region.
- * @rmem: reserved_mem object of the memory region to be initialized.
- *
- * This function is used to call the region specific initialization
- * function on the rmem object passed as an argument. The rmem object
- * will contain the base address, size, node name, and device_node of
- * the reserved memory region to be initialized.
+ * of_init_reserved_mem() - allocate and init all saved reserved memory regions
  */
-static void __init of_init_reserved_mem_node(struct reserved_mem *rmem)
+void __init of_init_reserved_mem(void)
 {
-	int err;
-	bool nomap;
-	struct device_node *node = rmem->dev_node;
+	int i;
+
+	alloc_reserved_mem_array();
 
-	nomap = of_property_present(node, "no-map");
+	of_scan_reserved_mem_reg_nodes();
 
-	err = __reserved_mem_init_node(rmem);
-	if (err != 0 && err != -ENOENT) {
-		pr_info("node %s compatible matching fail\n", rmem->name);
-		if (nomap)
-			memblock_clear_nomap(rmem->base, rmem->size);
-		else
-			memblock_phys_free(rmem->base, rmem->size);
-	} else {
-		phys_addr_t end = rmem->base + rmem->size - 1;
-		bool reusable = of_property_present(node, "reusable");
-
-		pr_info("%pa..%pa (%lu KiB) %s %s %s\n",
-			&rmem->base, &end, (unsigned long)(rmem->size / SZ_1K),
-			nomap ? "nomap" : "map",
-			reusable ? "reusable" : "non-reusable",
-			rmem->name ? rmem->name : "unknown");
+	/* check for overlapping reserved regions */
+	__rmem_check_for_overlap();
+
+	for (i = 0; i < reserved_mem_count; i++) {
+		struct reserved_mem *rmem = &reserved_mem[i];
+		struct device_node *node = rmem->dev_node;
+		int err = 0;
+		bool nomap;
+
+		nomap = of_property_present(node, "no-map");
+
+		err = __reserved_mem_init_node(rmem);
+		if (err != 0 && err != -ENOENT) {
+			pr_info("node %s compatible matching fail\n", rmem->name);
+			if (nomap)
+				memblock_clear_nomap(rmem->base, rmem->size);
+			else
+				memblock_phys_free(rmem->base, rmem->size);
+		} else {
+			phys_addr_t end = rmem->base + rmem->size - 1;
+			bool reusable = of_property_present(node, "reusable");
+
+			pr_info("%pa..%pa (%lu KiB) %s %s %s\n",
+				&rmem->base, &end, (unsigned long)(rmem->size / SZ_1K),
+				nomap ? "nomap" : "map",
+				reusable ? "reusable" : "non-reusable",
+				rmem->name ? rmem->name : "unknown");
+		}
 	}
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/4] Revert "of: reserved_mem: Rename fdt_* functions to refelct the change from using fdt APIs"
  2024-07-08 23:06 [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Oreoluwa Babatunde
  2024-07-08 23:06 ` [PATCH 1/4] Revert "of: reserved_mem: Restructure code to call reserved mem init functions earlier" Oreoluwa Babatunde
@ 2024-07-08 23:06 ` Oreoluwa Babatunde
  2024-07-08 23:06 ` [PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes" Oreoluwa Babatunde
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Oreoluwa Babatunde @ 2024-07-08 23:06 UTC (permalink / raw)
  To: robh, saravanak, klarasmodin, aisheng.dong
  Cc: hch, m.szyprowski, robin.murphy, devicetree, linux-kernel, iommu,
	will, catalin.marinas, kernel, Oreoluwa Babatunde

This reverts commit fec32ea96dd90bf0af97e001f380d4a240013aa0.

With recent changes made to initialize the cma regions before the page
tables are setup, commit f2a524d9ef5b ("of: reserved_mem: Restructure
code to call reserved mem init functions earlier"), an issue was
introduced where the initialization of the cma regions fail and are
initialized as "non-reusable" regions instead of "reusable".

This issue occurs because the device_node of the regions are not yet
created by the time the cma regions are being initialized.

The cma regions need to be initialized before the page tables are setup
for them to be configured correctly as was realized in [1].

Hence, since the unflatten_devicetree APIs are not available until after
the page tables have been setup, revert back to using the fdt APIs. This
makes it possible to store a reference to each cma node in the
reserved_mem array by the time it is needed in their init function.

[1] https://lore.kernel.org/all/20240610213403.GA1697364@thelio-3990X/

Signed-off-by: Oreoluwa Babatunde <quic_obabatun@quicinc.com>
---
 drivers/of/fdt.c             |  2 +-
 drivers/of/of_private.h      |  2 +-
 drivers/of/of_reserved_mem.c | 22 +++++++++++-----------
 3 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 9cde2abd2fc0..e0f93886cc17 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1239,7 +1239,7 @@ void __init unflatten_device_tree(void)
 	unittest_unflatten_overlay_base();
 
 	/* initialize the reserved memory regions */
-	of_init_reserved_mem();
+	fdt_init_reserved_mem();
 }
 
 /**
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 01b33c4b1e9f..32b10d45b558 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -181,7 +181,7 @@ static inline struct device_node *__of_get_dma_parent(const struct device_node *
 #endif
 
 int fdt_scan_reserved_mem(void);
-void of_init_reserved_mem(void);
+void fdt_init_reserved_mem(void);
 
 bool of_fdt_device_is_available(const void *blob, unsigned long node);
 
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index eb54490a0a11..784a49a27e7f 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -98,10 +98,10 @@ static void __init alloc_reserved_mem_array(void)
 }
 
 /*
- * of_reserved_mem_save_node() - save fdt node for second pass initialization
+ * fdt_reserved_mem_save_node() - save fdt node for second pass initialization
  */
-static void __init of_reserved_mem_save_node(struct device_node *node, const char *uname,
-					     phys_addr_t base, phys_addr_t size)
+static void __init fdt_reserved_mem_save_node(struct device_node *node, const char *uname,
+					      phys_addr_t base, phys_addr_t size)
 {
 	struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
 
@@ -202,16 +202,16 @@ static int __init __fdt_reserved_mem_check_root(unsigned long node)
 }
 
 /**
- * of_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined
+ * fdt_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined
  * reserved memory regions.
  *
  * This function is used to scan through the DT and store the
  * information for the reserved memory regions that are defined using
  * the "reg" property. The region node number, name, base address, and
  * size are all stored in the reserved_mem array by calling the
- * of_reserved_mem_save_node() function.
+ * fdt_reserved_mem_save_node() function.
  */
-static void __init of_scan_reserved_mem_reg_nodes(void)
+static void __init fdt_scan_reserved_mem_reg_nodes(void)
 {
 	struct device_node *node, *child;
 	phys_addr_t base, size;
@@ -244,7 +244,7 @@ static void __init of_scan_reserved_mem_reg_nodes(void)
 		size = res.end - res.start + 1;
 
 		if (size)
-			of_reserved_mem_save_node(child, uname, base, size);
+			fdt_reserved_mem_save_node(child, uname, base, size);
 	}
 }
 
@@ -442,7 +442,7 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
 		       uname, (unsigned long)(size / SZ_1M));
 		return -ENOMEM;
 	}
-	of_reserved_mem_save_node(NULL, uname, base, size);
+	fdt_reserved_mem_save_node(NULL, uname, base, size);
 	return 0;
 }
 
@@ -526,15 +526,15 @@ static void __init __rmem_check_for_overlap(void)
 }
 
 /**
- * of_init_reserved_mem() - allocate and init all saved reserved memory regions
+ * fdt_init_reserved_mem() - allocate and init all saved reserved memory regions
  */
-void __init of_init_reserved_mem(void)
+void __init fdt_init_reserved_mem(void)
 {
 	int i;
 
 	alloc_reserved_mem_array();
 
-	of_scan_reserved_mem_reg_nodes();
+	fdt_scan_reserved_mem_reg_nodes();
 
 	/* check for overlapping reserved regions */
 	__rmem_check_for_overlap();
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes"
  2024-07-08 23:06 [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Oreoluwa Babatunde
  2024-07-08 23:06 ` [PATCH 1/4] Revert "of: reserved_mem: Restructure code to call reserved mem init functions earlier" Oreoluwa Babatunde
  2024-07-08 23:06 ` [PATCH 2/4] Revert "of: reserved_mem: Rename fdt_* functions to refelct the change from using fdt APIs" Oreoluwa Babatunde
@ 2024-07-08 23:06 ` Oreoluwa Babatunde
  2024-07-16  8:06   ` kernel test robot
  2024-07-08 23:06 ` [PATCH 4/4] of: reserved_mem: Restructure code to call rmem init functions earlier Oreoluwa Babatunde
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 9+ messages in thread
From: Oreoluwa Babatunde @ 2024-07-08 23:06 UTC (permalink / raw)
  To: robh, saravanak, klarasmodin, aisheng.dong
  Cc: hch, m.szyprowski, robin.murphy, devicetree, linux-kernel, iommu,
	will, catalin.marinas, kernel, Oreoluwa Babatunde

This reverts commit 59d2c3cbcb5a47483629d8d992886e2650d786df.

With recent changes made to initialize the cma regions before the page
tables are setup, commit f2a524d9ef5b ("of: reserved_mem: Restructure
code to call reserved mem init functions earlier"), an issue was
introduced where the initialization of the cma regions fail and are
initialized as "non-reusable" regions instead of "reusable".

This issue occurs because the device_node of the regions are not yet
created by the time the cma regions are being initialized.

The cma regions need to be initialized before the page tables are setup
for them to be configured correctly as was realized in [1].

Hence, since the unflatten_devicetree APIs are not available until after
the page tables have been setup, revert back to using the fdt APIs. This
makes it possible to store a reference to each cma node in the
reserved_mem array by the time it is needed in their init function.

[1] https://lore.kernel.org/all/20240610213403.GA1697364@thelio-3990X/

Signed-off-by: Oreoluwa Babatunde <quic_obabatun@quicinc.com>
---
 drivers/of/of_reserved_mem.c    | 67 +++++++++++++++++++--------------
 include/linux/of_reserved_mem.h |  2 +-
 kernel/dma/coherent.c           | 10 +++--
 kernel/dma/contiguous.c         |  8 ++--
 kernel/dma/swiotlb.c            | 10 ++---
 5 files changed, 55 insertions(+), 42 deletions(-)

diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 784a49a27e7f..113d593ea031 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -14,7 +14,6 @@
 #include <linux/err.h>
 #include <linux/libfdt.h>
 #include <linux/of.h>
-#include <linux/of_address.h>
 #include <linux/of_fdt.h>
 #include <linux/of_platform.h>
 #include <linux/mm.h>
@@ -100,7 +99,7 @@ static void __init alloc_reserved_mem_array(void)
 /*
  * fdt_reserved_mem_save_node() - save fdt node for second pass initialization
  */
-static void __init fdt_reserved_mem_save_node(struct device_node *node, const char *uname,
+static void __init fdt_reserved_mem_save_node(unsigned long node, const char *uname,
 					      phys_addr_t base, phys_addr_t size)
 {
 	struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
@@ -110,7 +109,7 @@ static void __init fdt_reserved_mem_save_node(struct device_node *node, const ch
 		return;
 	}
 
-	rmem->dev_node = node;
+	rmem->fdt_node = node;
 	rmem->name = uname;
 	rmem->base = base;
 	rmem->size = size;
@@ -179,11 +178,11 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
 }
 
 /*
- * __fdt_reserved_mem_check_root() - check if #size-cells, #address-cells provided
+ * __reserved_mem_check_root() - check if #size-cells, #address-cells provided
  * in /reserved-memory matches the values supported by the current implementation,
  * also check if ranges property has been provided
  */
-static int __init __fdt_reserved_mem_check_root(unsigned long node)
+static int __init __reserved_mem_check_root(unsigned long node)
 {
 	const __be32 *prop;
 
@@ -213,35 +212,41 @@ static int __init __fdt_reserved_mem_check_root(unsigned long node)
  */
 static void __init fdt_scan_reserved_mem_reg_nodes(void)
 {
-	struct device_node *node, *child;
+	int t_len = (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32);
+	const void *fdt = initial_boot_params;
 	phys_addr_t base, size;
+	const __be32 *prop;
+	int node, child;
+	int len;
 
-	node = of_find_node_by_path("/reserved-memory");
-	if (!node) {
+	node = fdt_path_offset(fdt, "/reserved-memory");
+	if (node < 0) {
 		pr_info("Reserved memory: No reserved-memory node in the DT\n");
 		return;
 	}
 
-	for_each_child_of_node(node, child) {
-		int ret = 0;
+	if (__reserved_mem_check_root(node)) {
+		pr_err("Reserved memory: unsupported node format, ignoring\n");
+		return;
+	}
+
+	fdt_for_each_subnode(child, fdt, node) {
 		const char *uname;
-		struct resource res;
-		struct reserved_mem *rmem;
 
-		if (!of_device_is_available(child))
+		prop = of_get_flat_dt_prop(child, "reg", &len);
+		if (!prop)
+			continue;
+		if (!of_fdt_device_is_available(fdt, child))
 			continue;
 
-		ret = of_address_to_resource(child, 0, &res);
-		if (ret) {
-			rmem = of_reserved_mem_lookup(child);
-			if (rmem)
-				rmem->dev_node = child;
+		uname = fdt_get_name(fdt, child, NULL);
+		if (len && len % t_len != 0) {
+			pr_err("Reserved memory: invalid reg property in '%s', skipping node.\n",
+			       uname);
 			continue;
 		}
-		uname = of_node_full_name(child);
-
-		base = res.start;
-		size = res.end - res.start + 1;
+		base = dt_mem_next_cell(dt_root_addr_cells, &prop);
+		size = dt_mem_next_cell(dt_root_size_cells, &prop);
 
 		if (size)
 			fdt_reserved_mem_save_node(child, uname, base, size);
@@ -264,7 +269,7 @@ int __init fdt_scan_reserved_mem(void)
 	if (node < 0)
 		return -ENODEV;
 
-	if (__fdt_reserved_mem_check_root(node) != 0) {
+	if (__reserved_mem_check_root(node) != 0) {
 		pr_err("Reserved memory: unsupported node format, ignoring\n");
 		return -EINVAL;
 	}
@@ -442,7 +447,7 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
 		       uname, (unsigned long)(size / SZ_1M));
 		return -ENOMEM;
 	}
-	fdt_reserved_mem_save_node(NULL, uname, base, size);
+	fdt_reserved_mem_save_node(node, uname, base, size);
 	return 0;
 }
 
@@ -462,7 +467,7 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem)
 		reservedmem_of_init_fn initfn = i->data;
 		const char *compat = i->compatible;
 
-		if (!of_device_is_compatible(rmem->dev_node, compat))
+		if (!of_flat_dt_is_compatible(rmem->fdt_node, compat))
 			continue;
 
 		ret = initfn(rmem);
@@ -495,6 +500,11 @@ static int __init __rmem_cmp(const void *a, const void *b)
 	if (ra->size > rb->size)
 		return 1;
 
+	if (ra->fdt_node < rb->fdt_node)
+		return -1;
+	if (ra->fdt_node > rb->fdt_node)
+		return 1;
+
 	return 0;
 }
 
@@ -541,11 +551,11 @@ void __init fdt_init_reserved_mem(void)
 
 	for (i = 0; i < reserved_mem_count; i++) {
 		struct reserved_mem *rmem = &reserved_mem[i];
-		struct device_node *node = rmem->dev_node;
+		unsigned long node = rmem->fdt_node;
 		int err = 0;
 		bool nomap;
 
-		nomap = of_property_present(node, "no-map");
+		nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
 
 		err = __reserved_mem_init_node(rmem);
 		if (err != 0 && err != -ENOENT) {
@@ -556,7 +566,8 @@ void __init fdt_init_reserved_mem(void)
 				memblock_phys_free(rmem->base, rmem->size);
 		} else {
 			phys_addr_t end = rmem->base + rmem->size - 1;
-			bool reusable = of_property_present(node, "reusable");
+			bool reusable =
+				(of_get_flat_dt_prop(node, "reusable", NULL)) != NULL;
 
 			pr_info("%pa..%pa (%lu KiB) %s %s %s\n",
 				&rmem->base, &end, (unsigned long)(rmem->size / SZ_1K),
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index 769b8f67c8d3..e338282da652 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -10,7 +10,7 @@ struct reserved_mem_ops;
 
 struct reserved_mem {
 	const char			*name;
-	struct device_node              *dev_node;
+	unsigned long			fdt_node;
 	const struct reserved_mem_ops	*ops;
 	phys_addr_t			base;
 	phys_addr_t			size;
diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c
index 8f99586204fb..ff5683a57f77 100644
--- a/kernel/dma/coherent.c
+++ b/kernel/dma/coherent.c
@@ -362,18 +362,20 @@ static const struct reserved_mem_ops rmem_dma_ops = {
 
 static int __init rmem_dma_setup(struct reserved_mem *rmem)
 {
-	struct device_node *node = rmem->dev_node;
+	unsigned long node = rmem->fdt_node;
 
-	if (of_property_present(node, "reusable"))
+	if (of_get_flat_dt_prop(node, "reusable", NULL))
 		return -EINVAL;
 
-	if (IS_ENABLED(CONFIG_ARM) && !of_property_present(node, "no-map")) {
+#ifdef CONFIG_ARM
+	if (!of_get_flat_dt_prop(node, "no-map", NULL)) {
 		pr_err("Reserved memory: regions without no-map are not yet supported\n");
 		return -EINVAL;
 	}
+#endif
 
 #ifdef CONFIG_DMA_GLOBAL_POOL
-	if (of_property_present(node, "linux,dma-default")) {
+	if (of_get_flat_dt_prop(node, "linux,dma-default", NULL)) {
 		WARN(dma_reserved_default_memory,
 		     "Reserved memory: region for default DMA coherent area is redefined\n");
 		dma_reserved_default_memory = rmem;
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index 450e9e4be79c..055da410ac71 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -456,8 +456,8 @@ static const struct reserved_mem_ops rmem_cma_ops = {
 
 static int __init rmem_cma_setup(struct reserved_mem *rmem)
 {
-	struct device_node *node = rmem->dev_node;
-	bool default_cma = of_property_read_bool(node, "linux,cma-default");
+	unsigned long node = rmem->fdt_node;
+	bool default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
 	struct cma *cma;
 	int err;
 
@@ -467,8 +467,8 @@ static int __init rmem_cma_setup(struct reserved_mem *rmem)
 		return -EBUSY;
 	}
 
-	if (!of_property_present(node, "reusable") ||
-	    of_property_present(node, "no-map"))
+	if (!of_get_flat_dt_prop(node, "reusable", NULL) ||
+	    of_get_flat_dt_prop(node, "no-map", NULL))
 		return -EINVAL;
 
 	if (!IS_ALIGNED(rmem->base | rmem->size, CMA_MIN_ALIGNMENT_BYTES)) {
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 9949ddc14272..fe1ccb53596f 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -1859,12 +1859,12 @@ static const struct reserved_mem_ops rmem_swiotlb_ops = {
 
 static int __init rmem_swiotlb_setup(struct reserved_mem *rmem)
 {
-	struct device_node *node = rmem->dev_node;
+	unsigned long node = rmem->fdt_node;
 
-	if (of_property_present(node, "reusable") ||
-	    of_property_present(node, "linux,cma-default") ||
-	    of_property_present(node, "linux,dma-default") ||
-	    of_property_present(node, "no-map"))
+	if (of_get_flat_dt_prop(node, "reusable", NULL) ||
+	    of_get_flat_dt_prop(node, "linux,cma-default", NULL) ||
+	    of_get_flat_dt_prop(node, "linux,dma-default", NULL) ||
+	    of_get_flat_dt_prop(node, "no-map", NULL))
 		return -EINVAL;
 
 	rmem->ops = &rmem_swiotlb_ops;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/4] of: reserved_mem: Restructure code to call rmem init functions earlier
  2024-07-08 23:06 [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Oreoluwa Babatunde
                   ` (2 preceding siblings ...)
  2024-07-08 23:06 ` [PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes" Oreoluwa Babatunde
@ 2024-07-08 23:06 ` Oreoluwa Babatunde
  2024-07-09  8:35 ` [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Aisheng Dong
  2024-07-09 11:30 ` Klara Modin
  5 siblings, 0 replies; 9+ messages in thread
From: Oreoluwa Babatunde @ 2024-07-08 23:06 UTC (permalink / raw)
  To: robh, saravanak, klarasmodin, aisheng.dong
  Cc: hch, m.szyprowski, robin.murphy, devicetree, linux-kernel, iommu,
	will, catalin.marinas, kernel, Oreoluwa Babatunde

This reapplies the fix from commit f2a524d9ef5b ("of: reserved_mem:
Restructure code to call reserved mem init functions earlier") which now
uses the fdt APIs instead of the unflatten_devicetree APIs.

Signed-off-by: Oreoluwa Babatunde <quic_obabatun@quicinc.com>
---
 drivers/of/fdt.c             |  2 +-
 drivers/of/of_private.h      |  2 +-
 drivers/of/of_reserved_mem.c | 79 ++++++++++++++++++++----------------
 3 files changed, 45 insertions(+), 38 deletions(-)

diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index e0f93886cc17..b5b1c9c8ed0a 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1239,7 +1239,7 @@ void __init unflatten_device_tree(void)
 	unittest_unflatten_overlay_base();
 
 	/* initialize the reserved memory regions */
-	fdt_init_reserved_mem();
+	fdt_scan_reserved_mem_reg_nodes();
 }
 
 /**
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 32b10d45b558..7ee11623612e 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -181,7 +181,7 @@ static inline struct device_node *__of_get_dma_parent(const struct device_node *
 #endif
 
 int fdt_scan_reserved_mem(void);
-void fdt_init_reserved_mem(void);
+void fdt_scan_reserved_mem_reg_nodes(void);
 
 bool of_fdt_device_is_available(const void *blob, unsigned long node);
 
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 113d593ea031..3fa06670f751 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -96,6 +96,7 @@ static void __init alloc_reserved_mem_array(void)
 	reserved_mem = new_array;
 }
 
+static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem);
 /*
  * fdt_reserved_mem_save_node() - save fdt node for second pass initialization
  */
@@ -114,6 +115,7 @@ static void __init fdt_reserved_mem_save_node(unsigned long node, const char *un
 	rmem->base = base;
 	rmem->size = size;
 
+	fdt_init_reserved_mem_node(rmem);
 	reserved_mem_count++;
 	return;
 }
@@ -200,6 +202,7 @@ static int __init __reserved_mem_check_root(unsigned long node)
 	return 0;
 }
 
+static void __init __rmem_check_for_overlap(void);
 /**
  * fdt_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined
  * reserved memory regions.
@@ -210,7 +213,7 @@ static int __init __reserved_mem_check_root(unsigned long node)
  * size are all stored in the reserved_mem array by calling the
  * fdt_reserved_mem_save_node() function.
  */
-static void __init fdt_scan_reserved_mem_reg_nodes(void)
+void __init fdt_scan_reserved_mem_reg_nodes(void)
 {
 	int t_len = (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32);
 	const void *fdt = initial_boot_params;
@@ -230,6 +233,13 @@ static void __init fdt_scan_reserved_mem_reg_nodes(void)
 		return;
 	}
 
+	/*
+	 * Allocate the exact size needed for the reserved_mem array and
+	 * copy all the contents from the previous array if allocation
+	 * is successful.
+	 */
+	alloc_reserved_mem_array();
+
 	fdt_for_each_subnode(child, fdt, node) {
 		const char *uname;
 
@@ -251,6 +261,9 @@ static void __init fdt_scan_reserved_mem_reg_nodes(void)
 		if (size)
 			fdt_reserved_mem_save_node(child, uname, base, size);
 	}
+
+	/* check for overlapping reserved regions */
+	__rmem_check_for_overlap();
 }
 
 static int __init __reserved_mem_alloc_size(unsigned long node, const char *uname);
@@ -536,45 +549,39 @@ static void __init __rmem_check_for_overlap(void)
 }
 
 /**
- * fdt_init_reserved_mem() - allocate and init all saved reserved memory regions
+ * fdt_init_reserved_mem_node() - allocate and init an rmem memory region
+ * @rmem: reserved_mem object of the memory region to be initialized.
+ *
+ * This function is used to call the region specific initialization
+ * function on the rmem object passed as an argument. The rmem object
+ * will contain the base address, size, node name, and device_node of
+ * the reserved memory region to be initialized.
  */
-void __init fdt_init_reserved_mem(void)
+static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem)
 {
-	int i;
-
-	alloc_reserved_mem_array();
-
-	fdt_scan_reserved_mem_reg_nodes();
+	unsigned long node = rmem->fdt_node;
+	int err = 0;
+	bool nomap;
 
-	/* check for overlapping reserved regions */
-	__rmem_check_for_overlap();
+	nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
 
-	for (i = 0; i < reserved_mem_count; i++) {
-		struct reserved_mem *rmem = &reserved_mem[i];
-		unsigned long node = rmem->fdt_node;
-		int err = 0;
-		bool nomap;
-
-		nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
-
-		err = __reserved_mem_init_node(rmem);
-		if (err != 0 && err != -ENOENT) {
-			pr_info("node %s compatible matching fail\n", rmem->name);
-			if (nomap)
-				memblock_clear_nomap(rmem->base, rmem->size);
-			else
-				memblock_phys_free(rmem->base, rmem->size);
-		} else {
-			phys_addr_t end = rmem->base + rmem->size - 1;
-			bool reusable =
-				(of_get_flat_dt_prop(node, "reusable", NULL)) != NULL;
-
-			pr_info("%pa..%pa (%lu KiB) %s %s %s\n",
-				&rmem->base, &end, (unsigned long)(rmem->size / SZ_1K),
-				nomap ? "nomap" : "map",
-				reusable ? "reusable" : "non-reusable",
-				rmem->name ? rmem->name : "unknown");
-		}
+	err = __reserved_mem_init_node(rmem);
+	if (err != 0 && err != -ENOENT) {
+		pr_info("node %s compatible matching fail\n", rmem->name);
+		if (nomap)
+			memblock_clear_nomap(rmem->base, rmem->size);
+		else
+			memblock_phys_free(rmem->base, rmem->size);
+	} else {
+		phys_addr_t end = rmem->base + rmem->size - 1;
+		bool reusable =
+			(of_get_flat_dt_prop(node, "reusable", NULL)) != NULL;
+
+		pr_info("%pa..%pa (%lu KiB) %s %s %s\n",
+			&rmem->base, &end, (unsigned long)(rmem->size / SZ_1K),
+			nomap ? "nomap" : "map",
+			reusable ? "reusable" : "non-reusable",
+			rmem->name ? rmem->name : "unknown");
 	}
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* RE: [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem
  2024-07-08 23:06 [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Oreoluwa Babatunde
                   ` (3 preceding siblings ...)
  2024-07-08 23:06 ` [PATCH 4/4] of: reserved_mem: Restructure code to call rmem init functions earlier Oreoluwa Babatunde
@ 2024-07-09  8:35 ` Aisheng Dong
  2024-07-09 11:30 ` Klara Modin
  5 siblings, 0 replies; 9+ messages in thread
From: Aisheng Dong @ 2024-07-09  8:35 UTC (permalink / raw)
  To: Oreoluwa Babatunde, robh@kernel.org, saravanak@google.com,
	klarasmodin@gmail.com
  Cc: hch@lst.de, m.szyprowski@samsung.com, robin.murphy@arm.com,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	iommu@lists.linux.dev, will@kernel.org, catalin.marinas@arm.com,
	kernel@quicinc.com, Jason Liu

> From: Oreoluwa Babatunde <quic_obabatun@quicinc.com>
> Sent: 2024年7月9日 7:06
> 
> With recent changes made to initialize the cma regions before the page tables
> are setup, commit f2a524d9ef5b ("of: reserved_mem: Restructure code to call
> reserved mem init functions earlier"), an issue was introduced where the
> initialization of the cma regions fail and are initialized as "non-reusable"
> regions instead of "reusable". [1], [2]
> 
> This issue occurs because the device_node of the regions are not yet created
> by the time the cma regions are being initialized.
> 
> The cma regions need to be initialized before the page tables are setup for
> them to be configured correctly as was realized in [3].
> 
> Hence, since the unflatten_devicetree APIs are not available until after the
> page tables have been setup, revert back to using the fdt APIs. This makes it
> possible to store a reference to each cma node in the reserved_mem array by
> the time it is needed in the init function.
> 
> [1] https://lore.kernel.org/all/DU0PR04MB9299C3EC247E1FE2C373440F80DE2@DU0PR04MB9299.eurprd04.prod.outlook.com/

For CMA regressions issue, tested it worked.
Tested-by: Dong Aisheng <aisheng.dong@nxp.com>

Regards
Aisheng

> 
> Oreoluwa Babatunde (4):
>   Revert "of: reserved_mem: Restructure code to call reserved mem init
>     functions earlier"
>   Revert "of: reserved_mem: Rename fdt_* functions to refelct the change
>     from using fdt APIs"
>   Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan
>     reserved memory nodes"
>   of: reserved_mem: Restructure code to call rmem init functions earlier
> 
>  drivers/of/fdt.c                |   2 +-
>  drivers/of/of_private.h         |   2 +-
>  drivers/of/of_reserved_mem.c    | 103 +++++++++++++++++---------------
>  include/linux/of_reserved_mem.h |   2 +-
>  kernel/dma/coherent.c           |  10 ++--
>  kernel/dma/contiguous.c         |   8 +--
>  kernel/dma/swiotlb.c            |  10 ++--
>  7 files changed, 72 insertions(+), 65 deletions(-)
> 
> --
> 2.34.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem
  2024-07-08 23:06 [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Oreoluwa Babatunde
                   ` (4 preceding siblings ...)
  2024-07-09  8:35 ` [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Aisheng Dong
@ 2024-07-09 11:30 ` Klara Modin
  2024-08-09 18:56   ` Oreoluwa Babatunde
  5 siblings, 1 reply; 9+ messages in thread
From: Klara Modin @ 2024-07-09 11:30 UTC (permalink / raw)
  To: Oreoluwa Babatunde
  Cc: robh, saravanak, aisheng.dong, hch, m.szyprowski, robin.murphy,
	devicetree, linux-kernel, iommu, will, catalin.marinas, kernel

Hi,

Den tis 9 juli 2024 kl 01:06 skrev Oreoluwa Babatunde
<quic_obabatun@quicinc.com>:
>
> With recent changes made to initialize the cma regions before the page
> tables are setup, commit f2a524d9ef5b ("of: reserved_mem: Restructure
> code to call reserved mem init functions earlier"), an issue was
> introduced where the initialization of the cma regions fail and are
> initialized as "non-reusable" regions instead of "reusable". [1], [2]
>
> This issue occurs because the device_node of the regions are not yet
> created by the time the cma regions are being initialized.
>
> The cma regions need to be initialized before the page tables are setup
> for them to be configured correctly as was realized in [3].
>
> Hence, since the unflatten_devicetree APIs are not available until after
> the page tables have been setup, revert back to using the fdt APIs. This
> makes it possible to store a reference to each cma node in the
> reserved_mem array by the time it is needed in the init function.
>
> [1] https://lore.kernel.org/all/DU0PR04MB9299C3EC247E1FE2C373440F80DE2@DU0PR04MB9299.eurprd04.prod.outlook.com/
>
> [2] https://lore.kernel.org/all/986361f4-f000-4129-8214-39f2fb4a90da@gmail.com/
>
> [3] https://lore.kernel.org/all/20240610213403.GA1697364@thelio-3990X/
>

These reverts also fixes the issue for me. Feel free to CC me when you
decide to send the next version if you want and I can retest it.

Regards,
Tested-by: Klara Modin <klarasmodin@gmail.com>

> Oreoluwa Babatunde (4):
>   Revert "of: reserved_mem: Restructure code to call reserved mem init
>     functions earlier"
>   Revert "of: reserved_mem: Rename fdt_* functions to refelct the change
>     from using fdt APIs"
>   Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan
>     reserved memory nodes"
>   of: reserved_mem: Restructure code to call rmem init functions earlier
>
>  drivers/of/fdt.c                |   2 +-
>  drivers/of/of_private.h         |   2 +-
>  drivers/of/of_reserved_mem.c    | 103 +++++++++++++++++---------------
>  include/linux/of_reserved_mem.h |   2 +-
>  kernel/dma/coherent.c           |  10 ++--
>  kernel/dma/contiguous.c         |   8 +--
>  kernel/dma/swiotlb.c            |  10 ++--
>  7 files changed, 72 insertions(+), 65 deletions(-)
>
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes"
  2024-07-08 23:06 ` [PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes" Oreoluwa Babatunde
@ 2024-07-16  8:06   ` kernel test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2024-07-16  8:06 UTC (permalink / raw)
  To: Oreoluwa Babatunde
  Cc: oe-lkp, lkp, devicetree, iommu, robh, saravanak, klarasmodin,
	aisheng.dong, hch, m.szyprowski, robin.murphy, linux-kernel, will,
	catalin.marinas, kernel, Oreoluwa Babatunde, oliver.sang



Hello,

kernel test robot noticed "BUG:kernel_NULL_pointer_dereference,address" on:

commit: 50618d443add4eda4aa94c76fb56e72783c260ae ("[PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes"")
url: https://github.com/intel-lab-lkp/linux/commits/Oreoluwa-Babatunde/Revert-of-reserved_mem-Restructure-code-to-call-reserved-mem-init-functions-earlier/20240709-073454
base: https://git.kernel.org/cgit/linux/kernel/git/robh/linux.git for-next
patch subject: [PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes"

in testcase: boot

compiler: clang-18
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G

(please refer to attached dmesg/kmsg for entire log/backtrace)


+---------------------------------------------+------------+------------+
|                                             | 20cf0f8c96 | 50618d443a |
+---------------------------------------------+------------+------------+
| boot_successes                              | 18         | 0          |
| boot_failures                               | 0          | 18         |
| BUG:kernel_NULL_pointer_dereference,address | 0          | 18         |
| Oops                                        | 0          | 18         |
| RIP:fdt_ro_probe                            | 0          | 18         |
| Kernel_panic-not_syncing:Fatal_exception    | 0          | 18         |
+---------------------------------------------+------------+------------+


If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <oliver.sang@intel.com>
| Closes: https://lore.kernel.org/oe-lkp/202407161521.ec4d9668-lkp@intel.com


[    0.082892][    T0] BUG: kernel NULL pointer dereference, address: 0000000000000004
[    0.085157][    T0] #PF: supervisor read access in kernel mode
[    0.086877][    T0] #PF: error_code(0x0000) - not-present page
[    0.088532][    T0] PGD 0 P4D 0
[    0.089466][    T0] Oops: Oops: 0000 [#1] PREEMPT
[    0.090747][    T0] CPU: 0 PID: 0 Comm: swapper Tainted: G                T  6.10.0-rc1-00046-g50618d443add #1
[ 0.093729][ T0] RIP: 0010:fdt_ro_probe_ (scripts/dtc/libfdt/libfdt.h:? lib/../scripts/dtc/libfdt/fdt.c:?) 
[ 0.095168][ T0] Code: cc cc cc cc cc cc cc cc 90 90 90 90 90 90 90 90 90 90 90 b8 24 59 c7 5e b8 ed ff ff ff 40 f6 c7 07 74 07 31 c9 31 ff 31 d2 c3 <8b> 4f 04 8b 17 0f ca 81 fa 12 01 f2 2f 74 28 b8 f7 ff ff ff 81 fa
All code
========
   0:	cc                   	int3
   1:	cc                   	int3
   2:	cc                   	int3
   3:	cc                   	int3
   4:	cc                   	int3
   5:	cc                   	int3
   6:	cc                   	int3
   7:	cc                   	int3
   8:	90                   	nop
   9:	90                   	nop
   a:	90                   	nop
   b:	90                   	nop
   c:	90                   	nop
   d:	90                   	nop
   e:	90                   	nop
   f:	90                   	nop
  10:	90                   	nop
  11:	90                   	nop
  12:	90                   	nop
  13:	b8 24 59 c7 5e       	mov    $0x5ec75924,%eax
  18:	b8 ed ff ff ff       	mov    $0xffffffed,%eax
  1d:	40 f6 c7 07          	test   $0x7,%dil
  21:	74 07                	je     0x2a
  23:	31 c9                	xor    %ecx,%ecx
  25:	31 ff                	xor    %edi,%edi
  27:	31 d2                	xor    %edx,%edx
  29:	c3                   	ret
  2a:*	8b 4f 04             	mov    0x4(%rdi),%ecx		<-- trapping instruction
  2d:	8b 17                	mov    (%rdi),%edx
  2f:	0f ca                	bswap  %edx
  31:	81 fa 12 01 f2 2f    	cmp    $0x2ff20112,%edx
  37:	74 28                	je     0x61
  39:	b8 f7 ff ff ff       	mov    $0xfffffff7,%eax
  3e:	81                   	.byte 0x81
  3f:	fa                   	cli

Code starting with the faulting instruction
===========================================
   0:	8b 4f 04             	mov    0x4(%rdi),%ecx
   3:	8b 17                	mov    (%rdi),%edx
   5:	0f ca                	bswap  %edx
   7:	81 fa 12 01 f2 2f    	cmp    $0x2ff20112,%edx
   d:	74 28                	je     0x37
   f:	b8 f7 ff ff ff       	mov    $0xfffffff7,%eax
  14:	81                   	.byte 0x81
  15:	fa                   	cli
[    0.100859][    T0] RSP: 0000:ffffffff83e03e28 EFLAGS: 00010046
[    0.102634][    T0] RAX: 00000000ffffffed RBX: 0000000000000000 RCX: 0000000000000000
[    0.104925][    T0] RDX: 0000000000000010 RSI: ffffffff83ae68e5 RDI: 0000000000000000
[    0.107172][    T0] RBP: 0000000000000010 R08: 0000000000000000 R09: 0000000000000000
[    0.109427][    T0] R10: ffff88843fff2200 R11: 0000000000000000 R12: 0000000000000000
[    0.111656][    T0] R13: 0000000000000000 R14: 0000000000000000 R15: ffffffff83ae68e5
[    0.113969][    T0] FS:  0000000000000000(0000) GS:ffffffff83eb3000(0000) knlGS:0000000000000000
[    0.116389][    T0] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    0.118314][    T0] CR2: 0000000000000004 CR3: 0000000003ea3000 CR4: 00000000000000b0
[    0.120569][    T0] Call Trace:
[    0.121512][    T0]  <TASK>
[ 0.122317][ T0] ? __die_body (arch/x86/kernel/dumpstack.c:421) 
[ 0.123615][ T0] ? page_fault_oops (arch/x86/mm/fault.c:711) 
[ 0.125110][ T0] ? console_flush_all (include/linux/rcupdate.h:? include/linux/srcu.h:232 kernel/printk/printk.c:286 kernel/printk/printk.c:2986) 
[ 0.126609][ T0] ? exc_page_fault (arch/x86/include/asm/paravirt.h:687) 
[ 0.127940][ T0] ? asm_exc_page_fault (arch/x86/include/asm/idtentry.h:623) 
[ 0.129365][ T0] ? fdt_ro_probe_ (scripts/dtc/libfdt/libfdt.h:? lib/../scripts/dtc/libfdt/fdt.c:?) 
[ 0.130637][ T0] ? fdt_path_offset_namelen (lib/../scripts/dtc/libfdt/fdt_ro.c:256) 
[ 0.132233][ T0] ? fdt_scan_reserved_mem_reg_nodes (drivers/of/of_reserved_mem.c:?) 
[ 0.134085][ T0] ? fdt_init_reserved_mem (drivers/of/of_reserved_mem.c:550) 
[ 0.135650][ T0] ? x86_flattree_get_config (arch/x86/kernel/devicetree.c:313) 
[ 0.137230][ T0] ? setup_arch (arch/x86/kernel/setup.c:1099) 
[ 0.138552][ T0] ? start_kernel (init/main.c:481 init/main.c:927) 
[ 0.139865][ T0] ? x86_64_start_reservations (??:?) 
[ 0.141519][ T0] ? x86_64_start_kernel (??:?) 
[ 0.142935][ T0] ? common_startup_64 (arch/x86/kernel/head_64.S:421) 
[    0.144349][    T0]  </TASK>
[    0.145232][    T0] Modules linked in:
[    0.146391][    T0] CR2: 0000000000000004
[    0.147628][    T0] ---[ end trace 0000000000000000 ]---
[ 0.149306][ T0] RIP: 0010:fdt_ro_probe_ (scripts/dtc/libfdt/libfdt.h:? lib/../scripts/dtc/libfdt/fdt.c:?) 
[ 0.150885][ T0] Code: cc cc cc cc cc cc cc cc 90 90 90 90 90 90 90 90 90 90 90 b8 24 59 c7 5e b8 ed ff ff ff 40 f6 c7 07 74 07 31 c9 31 ff 31 d2 c3 <8b> 4f 04 8b 17 0f ca 81 fa 12 01 f2 2f 74 28 b8 f7 ff ff ff 81 fa
All code
========
   0:	cc                   	int3
   1:	cc                   	int3
   2:	cc                   	int3
   3:	cc                   	int3
   4:	cc                   	int3
   5:	cc                   	int3
   6:	cc                   	int3
   7:	cc                   	int3
   8:	90                   	nop
   9:	90                   	nop
   a:	90                   	nop
   b:	90                   	nop
   c:	90                   	nop
   d:	90                   	nop
   e:	90                   	nop
   f:	90                   	nop
  10:	90                   	nop
  11:	90                   	nop
  12:	90                   	nop
  13:	b8 24 59 c7 5e       	mov    $0x5ec75924,%eax
  18:	b8 ed ff ff ff       	mov    $0xffffffed,%eax
  1d:	40 f6 c7 07          	test   $0x7,%dil
  21:	74 07                	je     0x2a
  23:	31 c9                	xor    %ecx,%ecx
  25:	31 ff                	xor    %edi,%edi
  27:	31 d2                	xor    %edx,%edx
  29:	c3                   	ret
  2a:*	8b 4f 04             	mov    0x4(%rdi),%ecx		<-- trapping instruction
  2d:	8b 17                	mov    (%rdi),%edx
  2f:	0f ca                	bswap  %edx
  31:	81 fa 12 01 f2 2f    	cmp    $0x2ff20112,%edx
  37:	74 28                	je     0x61
  39:	b8 f7 ff ff ff       	mov    $0xfffffff7,%eax
  3e:	81                   	.byte 0x81
  3f:	fa                   	cli

Code starting with the faulting instruction
===========================================
   0:	8b 4f 04             	mov    0x4(%rdi),%ecx
   3:	8b 17                	mov    (%rdi),%edx
   5:	0f ca                	bswap  %edx
   7:	81 fa 12 01 f2 2f    	cmp    $0x2ff20112,%edx
   d:	74 28                	je     0x37
   f:	b8 f7 ff ff ff       	mov    $0xfffffff7,%eax
  14:	81                   	.byte 0x81
  15:	fa                   	cli


The kernel config and materials to reproduce are available at:
https://download.01.org/0day-ci/archive/20240716/202407161521.ec4d9668-lkp@intel.com



-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem
  2024-07-09 11:30 ` Klara Modin
@ 2024-08-09 18:56   ` Oreoluwa Babatunde
  0 siblings, 0 replies; 9+ messages in thread
From: Oreoluwa Babatunde @ 2024-08-09 18:56 UTC (permalink / raw)
  To: Klara Modin
  Cc: robh, saravanak, aisheng.dong, hch, m.szyprowski, robin.murphy,
	devicetree, linux-kernel, iommu, will, catalin.marinas, kernel


On 7/9/2024 4:30 AM, Klara Modin wrote:
> Hi,
>
> Den tis 9 juli 2024 kl 01:06 skrev Oreoluwa Babatunde
> <quic_obabatun@quicinc.com>:
>> With recent changes made to initialize the cma regions before the page
>> tables are setup, commit f2a524d9ef5b ("of: reserved_mem: Restructure
>> code to call reserved mem init functions earlier"), an issue was
>> introduced where the initialization of the cma regions fail and are
>> initialized as "non-reusable" regions instead of "reusable". [1], [2]
>>
>> This issue occurs because the device_node of the regions are not yet
>> created by the time the cma regions are being initialized.
>>
>> The cma regions need to be initialized before the page tables are setup
>> for them to be configured correctly as was realized in [3].
>>
>> Hence, since the unflatten_devicetree APIs are not available until after
>> the page tables have been setup, revert back to using the fdt APIs. This
>> makes it possible to store a reference to each cma node in the
>> reserved_mem array by the time it is needed in the init function.
>>
>> [1] https://lore.kernel.org/all/DU0PR04MB9299C3EC247E1FE2C373440F80DE2@DU0PR04MB9299.eurprd04.prod.outlook.com/
>>
>> [2] https://lore.kernel.org/all/986361f4-f000-4129-8214-39f2fb4a90da@gmail.com/
>>
>> [3] https://lore.kernel.org/all/20240610213403.GA1697364@thelio-3990X/
>>
> These reverts also fixes the issue for me. Feel free to CC me when you
> decide to send the next version if you want and I can retest it.
>
> Regards,
> Tested-by: Klara Modin <klarasmodin@gmail.com>
Hi Klara,

I have uploaded a new version of this patch set and cc'ed you on it.
Please help me retest to see if it still works for you.
https://lore.kernel.org/all/20240809184814.2703050-1-quic_obabatun@quicinc.com/

Thank you!
Oreoluwa

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-08-09 18:57 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-08 23:06 [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Oreoluwa Babatunde
2024-07-08 23:06 ` [PATCH 1/4] Revert "of: reserved_mem: Restructure code to call reserved mem init functions earlier" Oreoluwa Babatunde
2024-07-08 23:06 ` [PATCH 2/4] Revert "of: reserved_mem: Rename fdt_* functions to refelct the change from using fdt APIs" Oreoluwa Babatunde
2024-07-08 23:06 ` [PATCH 3/4] Revert "of: reserved_mem: Use unflatten_devicetree APIs to scan reserved memory nodes" Oreoluwa Babatunde
2024-07-16  8:06   ` kernel test robot
2024-07-08 23:06 ` [PATCH 4/4] of: reserved_mem: Restructure code to call rmem init functions earlier Oreoluwa Babatunde
2024-07-09  8:35 ` [PATCH 0/4] Revert use of Unflatten_devicetree APIs from reserved_mem Aisheng Dong
2024-07-09 11:30 ` Klara Modin
2024-08-09 18:56   ` Oreoluwa Babatunde

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).