linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd()
@ 2018-10-31 19:28 Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 1/6] nds32: Remove phys_initrd_start and phys_initrd_size Florian Fainelli
                   ` (6 more replies)
  0 siblings, 7 replies; 16+ messages in thread
From: Florian Fainelli @ 2018-10-31 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

Hi all,

Changes in v3:

- use C conditionals in drivers/of/fdt.c
- added check on phys_initrd_size in arch/arm64/mm/init.c to determine
  whether initrd_start must be populated
- fixed a build warning with ARC that was just missing an (unsigned
  long) cast

Changes in v2:

- get rid of ARCH_HAS_PHYS_INITRD and instead define
  phys_initrd_start/phys_initrd_size in init/do_mounts_initrd.c

- make __early_init_dt_declare_initrd() account for ARM64 specific
  behavior with __va() when having CONFIG_DEBUG_VM enabled

- consolidate early_initrd() command line parsing into
  init/do_mounts_initrd.c

Because phys_initrd_start/phys_initrd_size are now compiled in
ini/do_mounts_initrd.c which is only built with CONFIG_BLK_DEV_INITRD=y,
we need to be a bit careful about the uses throughout architecture
specific code.

Previous discussions/submissions list here:

v3:
https://www.spinics.net/lists/arm-kernel/msg683566.html
v2:
https://lkml.org/lkml/2018/10/25/4

Florian Fainelli (6):
  nds32: Remove phys_initrd_start and phys_initrd_size
  arch: Make phys_initrd_start and phys_initrd_size global variables
  of/fdt: Populate phys_initrd_start/phys_initrd_size from FDT
  arm64: Utilize phys_initrd_start/phys_initrd_size
  of/fdt: Remove custom __early_init_dt_declare_initrd() implementation
  arch: Move initrd= parsing into do_mounts_initrd.c

 arch/arc/mm/init.c              | 25 +++++--------------------
 arch/arm/mm/init.c              | 28 ++--------------------------
 arch/arm64/include/asm/memory.h |  8 --------
 arch/arm64/mm/init.c            | 33 +++++++--------------------------
 arch/nds32/mm/init.c            |  2 --
 arch/unicore32/mm/init.c        | 24 +++++-------------------
 drivers/of/fdt.c                | 17 ++++++++++++-----
 include/linux/initrd.h          |  3 +++
 init/do_mounts_initrd.c         | 20 ++++++++++++++++++++
 9 files changed, 54 insertions(+), 106 deletions(-)

-- 
2.17.1

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

* [PATCH v3 1/6] nds32: Remove phys_initrd_start and phys_initrd_size
  2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
@ 2018-10-31 19:28 ` Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 2/6] arch: Make phys_initrd_start and phys_initrd_size global variables Florian Fainelli
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Florian Fainelli @ 2018-10-31 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

This will conflict with a subsequent change making phys_initrd_start and
phys_initrd_size global variables. nds32 does not make use of those nor
provides a suitable declarations so just get rid of them.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 arch/nds32/mm/init.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/arch/nds32/mm/init.c b/arch/nds32/mm/init.c
index c713d2ad55dc..32f55a24ccbb 100644
--- a/arch/nds32/mm/init.c
+++ b/arch/nds32/mm/init.c
@@ -22,8 +22,6 @@
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 DEFINE_SPINLOCK(anon_alias_lock);
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
-extern unsigned long phys_initrd_start;
-extern unsigned long phys_initrd_size;
 
 /*
  * empty_zero_page is a special page that is used for
-- 
2.17.1

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

* [PATCH v3 2/6] arch: Make phys_initrd_start and phys_initrd_size global variables
  2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 1/6] nds32: Remove phys_initrd_start and phys_initrd_size Florian Fainelli
@ 2018-10-31 19:28 ` Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 3/6] of/fdt: Populate phys_initrd_start/phys_initrd_size from FDT Florian Fainelli
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Florian Fainelli @ 2018-10-31 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

Make phys_initrd_start and phys_initrd_size global variables declared in
init/do_mounts_initrd.c such that we can later have generic code in
drivers/of/fdt.c populate those variables for us.

This requires both the ARM and unicore32 implementations to be properly
guarded against CONFIG_BLK_DEV_INITRD, and also initialize the variables
to the expected default values (unicore32).

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 arch/arm/mm/init.c       |  5 ++---
 arch/unicore32/mm/init.c | 10 +++++++---
 include/linux/initrd.h   |  3 +++
 init/do_mounts_initrd.c  |  3 +++
 4 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 0cc8e04295a4..87d59a53861d 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -51,9 +51,7 @@ unsigned long __init __clear_cr(unsigned long mask)
 }
 #endif
 
-static phys_addr_t phys_initrd_start __initdata = 0;
-static unsigned long phys_initrd_size __initdata = 0;
-
+#ifdef CONFIG_BLK_DEV_INITRD
 static int __init early_initrd(char *p)
 {
 	phys_addr_t start;
@@ -90,6 +88,7 @@ static int __init parse_tag_initrd2(const struct tag *tag)
 }
 
 __tagtable(ATAG_INITRD2, parse_tag_initrd2);
+#endif
 
 static void __init find_limits(unsigned long *min, unsigned long *max_low,
 			       unsigned long *max_high)
diff --git a/arch/unicore32/mm/init.c b/arch/unicore32/mm/init.c
index 8f8699e62bd5..f2f815d46846 100644
--- a/arch/unicore32/mm/init.c
+++ b/arch/unicore32/mm/init.c
@@ -31,9 +31,7 @@
 
 #include "mm.h"
 
-static unsigned long phys_initrd_start __initdata = 0x01000000;
-static unsigned long phys_initrd_size __initdata = SZ_8M;
-
+#ifdef CONFIG_BLK_DEV_INITRD
 static int __init early_initrd(char *p)
 {
 	unsigned long start, size;
@@ -49,6 +47,7 @@ static int __init early_initrd(char *p)
 	return 0;
 }
 early_param("initrd", early_initrd);
+#endif
 
 /*
  * This keeps memory configuration data used by a couple memory
@@ -157,6 +156,11 @@ void __init uc32_memblock_init(struct meminfo *mi)
 	memblock_reserve(__pa(_text), _end - _text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
+	if (!phys_initrd_size) {
+		phys_initrd_start = 0x01000000;
+		phys_initrd_size = SZ_8M;
+	}
+
 	if (phys_initrd_size) {
 		memblock_reserve(phys_initrd_start, phys_initrd_size);
 
diff --git a/include/linux/initrd.h b/include/linux/initrd.h
index 84b423044088..14beaff9b445 100644
--- a/include/linux/initrd.h
+++ b/include/linux/initrd.h
@@ -21,4 +21,7 @@ extern int initrd_below_start_ok;
 extern unsigned long initrd_start, initrd_end;
 extern void free_initrd_mem(unsigned long, unsigned long);
 
+extern phys_addr_t phys_initrd_start;
+extern unsigned long phys_initrd_size;
+
 extern unsigned int real_root_dev;
diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c
index d1a5d885ce13..45865b72f4ea 100644
--- a/init/do_mounts_initrd.c
+++ b/init/do_mounts_initrd.c
@@ -16,6 +16,9 @@ int initrd_below_start_ok;
 unsigned int real_root_dev;	/* do_proc_dointvec cannot handle kdev_t */
 static int __initdata mount_initrd = 1;
 
+phys_addr_t phys_initrd_start __initdata;
+unsigned long phys_initrd_size __initdata;
+
 static int __init no_initrd(char *str)
 {
 	mount_initrd = 0;
-- 
2.17.1

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

* [PATCH v3 3/6] of/fdt: Populate phys_initrd_start/phys_initrd_size from FDT
  2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 1/6] nds32: Remove phys_initrd_start and phys_initrd_size Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 2/6] arch: Make phys_initrd_start and phys_initrd_size global variables Florian Fainelli
@ 2018-10-31 19:28 ` Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size Florian Fainelli
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Florian Fainelli @ 2018-10-31 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

Now that we have central and global variables holding the physical
address and size of the initrd, we can have
early_init_dt_check_for_initrd() populate
phys_initrd_start/phys_initrd_size for us.

This allows us to remove a chunk of code from arch/arm/mm/init.c
introduced with commit 65939301acdb ("arm: set initrd_start/initrd_end
for fdt scan").

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 arch/arm/mm/init.c | 6 ------
 drivers/of/fdt.c   | 2 ++
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 87d59a53861d..4bfa08e27319 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -236,12 +236,6 @@ static void __init arm_initrd_init(void)
 	phys_addr_t start;
 	unsigned long size;
 
-	/* FDT scan will populate initrd_start */
-	if (initrd_start && !phys_initrd_size) {
-		phys_initrd_start = __virt_to_phys(initrd_start);
-		phys_initrd_size = initrd_end - initrd_start;
-	}
-
 	initrd_start = initrd_end = 0;
 
 	if (!phys_initrd_size)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 76c83c1ffeda..e34cb49231b5 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -925,6 +925,8 @@ static void __init early_init_dt_check_for_initrd(unsigned long node)
 	end = of_read_number(prop, len/4);
 
 	__early_init_dt_declare_initrd(start, end);
+	phys_initrd_start = start;
+	phys_initrd_size = end - start;
 
 	pr_debug("initrd_start=0x%llx  initrd_end=0x%llx\n",
 		 (unsigned long long)start, (unsigned long long)end);
-- 
2.17.1

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
                   ` (2 preceding siblings ...)
  2018-10-31 19:28 ` [PATCH v3 3/6] of/fdt: Populate phys_initrd_start/phys_initrd_size from FDT Florian Fainelli
@ 2018-10-31 19:28 ` Florian Fainelli
  2018-11-05 20:33   ` Rob Herring
  2018-11-05 20:39   ` Ard Biesheuvel
  2018-10-31 19:28 ` [PATCH v3 5/6] of/fdt: Remove custom __early_init_dt_declare_initrd() implementation Florian Fainelli
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 16+ messages in thread
From: Florian Fainelli @ 2018-10-31 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

ARM64 is the only architecture that re-defines
__early_init_dt_declare_initrd() in order for that function to populate
initrd_start/initrd_end with physical addresses instead of virtual
addresses. Instead of having an override we can leverage
drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
populate those variables for us.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 arch/arm64/mm/init.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index 3cf87341859f..00ef2166bb73 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
 	if (*endp == ',') {
 		size = memparse(endp + 1, NULL);
 
-		initrd_start = start;
-		initrd_end = start + size;
+		phys_initrd_start = start;
+		phys_initrd_size = size;
 	}
 	return 0;
 }
@@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
 		memblock_add(__pa_symbol(_text), (u64)(_end - _text));
 	}
 
-	if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
+	if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
 		/*
 		 * Add back the memory we just removed if it results in the
 		 * initrd to become inaccessible via the linear mapping.
 		 * Otherwise, this is a no-op
 		 */
-		u64 base = initrd_start & PAGE_MASK;
-		u64 size = PAGE_ALIGN(initrd_end) - base;
+		u64 base = phys_initrd_start & PAGE_MASK;
+		u64 size = PAGE_ALIGN(phys_initrd_size);
 
 		/*
 		 * We can only add back the initrd memory if we don't end up
@@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
 	 */
 	memblock_reserve(__pa_symbol(_text), _end - _text);
 #ifdef CONFIG_BLK_DEV_INITRD
-	if (initrd_start) {
-		memblock_reserve(initrd_start, initrd_end - initrd_start);
-
+	if (phys_initrd_size) {
 		/* the generic initrd code expects virtual addresses */
-		initrd_start = __phys_to_virt(initrd_start);
-		initrd_end = __phys_to_virt(initrd_end);
+		initrd_start = __phys_to_virt(phys_initrd_start);
+		initrd_end = initrd_start + phys_initrd_size;
+		initrd_below_start_ok = 0;
 	}
 #endif
 
-- 
2.17.1

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

* [PATCH v3 5/6] of/fdt: Remove custom __early_init_dt_declare_initrd() implementation
  2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
                   ` (3 preceding siblings ...)
  2018-10-31 19:28 ` [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size Florian Fainelli
@ 2018-10-31 19:28 ` Florian Fainelli
  2018-10-31 19:28 ` [PATCH v3 6/6] arch: Move initrd= parsing into do_mounts_initrd.c Florian Fainelli
  2018-11-05 20:31 ` [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Rob Herring
  6 siblings, 0 replies; 16+ messages in thread
From: Florian Fainelli @ 2018-10-31 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

Now that ARM64 uses phys_initrd_start/phys_initrd_size, we can get rid
of its custom __early_init_dt_declare_initrd() which causes a fair
amount of objects rebuild when changing CONFIG_BLK_DEV_INITRD. In order
to make sure ARM64 does not produce a BUG() when VM debugging is turned
on though, we must avoid early calls to __va() which is what
__early_init_dt_declare_initrd() does and wrap this around to avoid
running that code on ARM64.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 arch/arm64/include/asm/memory.h |  8 --------
 drivers/of/fdt.c                | 15 ++++++++++-----
 2 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h
index b96442960aea..dc3ca21ba240 100644
--- a/arch/arm64/include/asm/memory.h
+++ b/arch/arm64/include/asm/memory.h
@@ -168,14 +168,6 @@
 #define IOREMAP_MAX_ORDER	(PMD_SHIFT)
 #endif
 
-#ifdef CONFIG_BLK_DEV_INITRD
-#define __early_init_dt_declare_initrd(__start, __end)			\
-	do {								\
-		initrd_start = (__start);				\
-		initrd_end = (__end);					\
-	} while (0)
-#endif
-
 #ifndef __ASSEMBLY__
 
 #include <linux/bitops.h>
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index e34cb49231b5..4118a344cf45 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -892,15 +892,20 @@ const void * __init of_flat_dt_match_machine(const void *default_match,
 }
 
 #ifdef CONFIG_BLK_DEV_INITRD
-#ifndef __early_init_dt_declare_initrd
 static void __early_init_dt_declare_initrd(unsigned long start,
 					   unsigned long end)
 {
-	initrd_start = (unsigned long)__va(start);
-	initrd_end = (unsigned long)__va(end);
-	initrd_below_start_ok = 1;
+	/* ARM64 would cause a BUG to occur here when CONFIG_DEBUG_VM is
+	 * enabled since __va() is called too early. ARM64 does make use
+	 * of phys_initrd_start/phys_initrd_size so we can skip this
+	 * conversion.
+	 */
+	if (!IS_ENABLED(CONFIG_ARM64)) {
+		initrd_start = (unsigned long)__va(start);
+		initrd_end = (unsigned long)__va(end);
+		initrd_below_start_ok = 1;
+	}
 }
-#endif
 
 /**
  * early_init_dt_check_for_initrd - Decode initrd location from flat tree
-- 
2.17.1

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

* [PATCH v3 6/6] arch: Move initrd= parsing into do_mounts_initrd.c
  2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
                   ` (4 preceding siblings ...)
  2018-10-31 19:28 ` [PATCH v3 5/6] of/fdt: Remove custom __early_init_dt_declare_initrd() implementation Florian Fainelli
@ 2018-10-31 19:28 ` Florian Fainelli
  2018-11-05 20:31 ` [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Rob Herring
  6 siblings, 0 replies; 16+ messages in thread
From: Florian Fainelli @ 2018-10-31 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

ARC, ARM, ARM64 and Unicore32 are all capable of parsing the "initrd="
command line parameter to allow specifying the physical address and size
of an initrd. Move that parsing into init/do_mounts_initrd.c such that
we no longer duplicate that logic.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 arch/arc/mm/init.c       | 25 +++++--------------------
 arch/arm/mm/init.c       | 17 -----------------
 arch/arm64/mm/init.c     | 18 ------------------
 arch/unicore32/mm/init.c | 18 ------------------
 init/do_mounts_initrd.c  | 17 +++++++++++++++++
 5 files changed, 22 insertions(+), 73 deletions(-)

diff --git a/arch/arc/mm/init.c b/arch/arc/mm/init.c
index ba145065c579..55879a9dee0d 100644
--- a/arch/arc/mm/init.c
+++ b/arch/arc/mm/init.c
@@ -79,24 +79,6 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 		base, TO_MB(size), !in_use ? "Not used":"");
 }
 
-#ifdef CONFIG_BLK_DEV_INITRD
-static int __init early_initrd(char *p)
-{
-	unsigned long start, size;
-	char *endp;
-
-	start = memparse(p, &endp);
-	if (*endp == ',') {
-		size = memparse(endp + 1, NULL);
-
-		initrd_start = (unsigned long)__va(start);
-		initrd_end = (unsigned long)__va(start + size);
-	}
-	return 0;
-}
-early_param("initrd", early_initrd);
-#endif
-
 /*
  * First memory setup routine called from setup_arch()
  * 1. setup swapper's mm @init_mm
@@ -141,8 +123,11 @@ void __init setup_arch_memory(void)
 	memblock_reserve(low_mem_start, __pa(_end) - low_mem_start);
 
 #ifdef CONFIG_BLK_DEV_INITRD
-	if (initrd_start)
-		memblock_reserve(__pa(initrd_start), initrd_end - initrd_start);
+	if (phys_initrd_size) {
+		memblock_reserve(phys_initrd_start, phys_initrd_size);
+		initrd_start = (unsigned long)__va(phys_initrd_start);
+		initrd_end = initrd_start + phys_initrd_size;
+	}
 #endif
 
 	early_init_fdt_reserve_self();
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 4bfa08e27319..58ec68709606 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -52,23 +52,6 @@ unsigned long __init __clear_cr(unsigned long mask)
 #endif
 
 #ifdef CONFIG_BLK_DEV_INITRD
-static int __init early_initrd(char *p)
-{
-	phys_addr_t start;
-	unsigned long size;
-	char *endp;
-
-	start = memparse(p, &endp);
-	if (*endp == ',') {
-		size = memparse(endp + 1, NULL);
-
-		phys_initrd_start = start;
-		phys_initrd_size = size;
-	}
-	return 0;
-}
-early_param("initrd", early_initrd);
-
 static int __init parse_tag_initrd(const struct tag *tag)
 {
 	pr_warn("ATAG_INITRD is deprecated; "
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index 00ef2166bb73..d95a6cb205b8 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -62,24 +62,6 @@
 s64 memstart_addr __ro_after_init = -1;
 phys_addr_t arm64_dma_phys_limit __ro_after_init;
 
-#ifdef CONFIG_BLK_DEV_INITRD
-static int __init early_initrd(char *p)
-{
-	unsigned long start, size;
-	char *endp;
-
-	start = memparse(p, &endp);
-	if (*endp == ',') {
-		size = memparse(endp + 1, NULL);
-
-		phys_initrd_start = start;
-		phys_initrd_size = size;
-	}
-	return 0;
-}
-early_param("initrd", early_initrd);
-#endif
-
 #ifdef CONFIG_KEXEC_CORE
 /*
  * reserve_crashkernel() - reserves memory for crash kernel
diff --git a/arch/unicore32/mm/init.c b/arch/unicore32/mm/init.c
index f2f815d46846..99acdb829a7e 100644
--- a/arch/unicore32/mm/init.c
+++ b/arch/unicore32/mm/init.c
@@ -31,24 +31,6 @@
 
 #include "mm.h"
 
-#ifdef CONFIG_BLK_DEV_INITRD
-static int __init early_initrd(char *p)
-{
-	unsigned long start, size;
-	char *endp;
-
-	start = memparse(p, &endp);
-	if (*endp == ',') {
-		size = memparse(endp + 1, NULL);
-
-		phys_initrd_start = start;
-		phys_initrd_size = size;
-	}
-	return 0;
-}
-early_param("initrd", early_initrd);
-#endif
-
 /*
  * This keeps memory configuration data used by a couple memory
  * initialization functions, as well as show_mem() for the skipping
diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c
index 45865b72f4ea..732d21f4a637 100644
--- a/init/do_mounts_initrd.c
+++ b/init/do_mounts_initrd.c
@@ -27,6 +27,23 @@ static int __init no_initrd(char *str)
 
 __setup("noinitrd", no_initrd);
 
+static int __init early_initrd(char *p)
+{
+	phys_addr_t start;
+	unsigned long size;
+	char *endp;
+
+	start = memparse(p, &endp);
+	if (*endp == ',') {
+		size = memparse(endp + 1, NULL);
+
+		phys_initrd_start = start;
+		phys_initrd_size = size;
+	}
+	return 0;
+}
+early_param("initrd", early_initrd);
+
 static int init_linuxrc(struct subprocess_info *info, struct cred *new)
 {
 	ksys_unshare(CLONE_FS | CLONE_FILES);
-- 
2.17.1

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

* [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd()
  2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
                   ` (5 preceding siblings ...)
  2018-10-31 19:28 ` [PATCH v3 6/6] arch: Move initrd= parsing into do_mounts_initrd.c Florian Fainelli
@ 2018-11-05 20:31 ` Rob Herring
  6 siblings, 0 replies; 16+ messages in thread
From: Rob Herring @ 2018-11-05 20:31 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Oct 31, 2018 at 12:28:37PM -0700, Florian Fainelli wrote:
> Hi all,
> 
> Changes in v3:
> 
> - use C conditionals in drivers/of/fdt.c
> - added check on phys_initrd_size in arch/arm64/mm/init.c to determine
>   whether initrd_start must be populated
> - fixed a build warning with ARC that was just missing an (unsigned
>   long) cast
> 
> Changes in v2:
> 
> - get rid of ARCH_HAS_PHYS_INITRD and instead define
>   phys_initrd_start/phys_initrd_size in init/do_mounts_initrd.c
> 
> - make __early_init_dt_declare_initrd() account for ARM64 specific
>   behavior with __va() when having CONFIG_DEBUG_VM enabled
> 
> - consolidate early_initrd() command line parsing into
>   init/do_mounts_initrd.c
> 
> Because phys_initrd_start/phys_initrd_size are now compiled in
> ini/do_mounts_initrd.c which is only built with CONFIG_BLK_DEV_INITRD=y,
> we need to be a bit careful about the uses throughout architecture
> specific code.
> 
> Previous discussions/submissions list here:
> 
> v3:
> https://www.spinics.net/lists/arm-kernel/msg683566.html
> v2:
> https://lkml.org/lkml/2018/10/25/4
> 
> Florian Fainelli (6):
>   nds32: Remove phys_initrd_start and phys_initrd_size
>   arch: Make phys_initrd_start and phys_initrd_size global variables
>   of/fdt: Populate phys_initrd_start/phys_initrd_size from FDT
>   arm64: Utilize phys_initrd_start/phys_initrd_size
>   of/fdt: Remove custom __early_init_dt_declare_initrd() implementation
>   arch: Move initrd= parsing into do_mounts_initrd.c

This all looks good to me. I can take it via the DT if you want. I'll 
give folks some more time to review though.

Rob

> 
>  arch/arc/mm/init.c              | 25 +++++--------------------
>  arch/arm/mm/init.c              | 28 ++--------------------------
>  arch/arm64/include/asm/memory.h |  8 --------
>  arch/arm64/mm/init.c            | 33 +++++++--------------------------
>  arch/nds32/mm/init.c            |  2 --
>  arch/unicore32/mm/init.c        | 24 +++++-------------------
>  drivers/of/fdt.c                | 17 ++++++++++++-----
>  include/linux/initrd.h          |  3 +++
>  init/do_mounts_initrd.c         | 20 ++++++++++++++++++++
>  9 files changed, 54 insertions(+), 106 deletions(-)
> 
> -- 
> 2.17.1
> 

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-10-31 19:28 ` [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size Florian Fainelli
@ 2018-11-05 20:33   ` Rob Herring
  2018-11-05 20:39   ` Ard Biesheuvel
  1 sibling, 0 replies; 16+ messages in thread
From: Rob Herring @ 2018-11-05 20:33 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Oct 31, 2018 at 12:28:41PM -0700, Florian Fainelli wrote:
> ARM64 is the only architecture that re-defines
> __early_init_dt_declare_initrd() in order for that function to populate
> initrd_start/initrd_end with physical addresses instead of virtual
> addresses. Instead of having an override we can leverage
> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
> populate those variables for us.
> 
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
>  arch/arm64/mm/init.c | 19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
> index 3cf87341859f..00ef2166bb73 100644
> --- a/arch/arm64/mm/init.c
> +++ b/arch/arm64/mm/init.c
> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>  	if (*endp == ',') {
>  		size = memparse(endp + 1, NULL);
>  
> -		initrd_start = start;
> -		initrd_end = start + size;
> +		phys_initrd_start = start;
> +		phys_initrd_size = size;
>  	}
>  	return 0;
>  }
> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>  		memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>  	}
>  
> -	if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
> +	if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>  		/*
>  		 * Add back the memory we just removed if it results in the
>  		 * initrd to become inaccessible via the linear mapping.
>  		 * Otherwise, this is a no-op
>  		 */
> -		u64 base = initrd_start & PAGE_MASK;
> -		u64 size = PAGE_ALIGN(initrd_end) - base;
> +		u64 base = phys_initrd_start & PAGE_MASK;
> +		u64 size = PAGE_ALIGN(phys_initrd_size);
>  
>  		/*
>  		 * We can only add back the initrd memory if we don't end up
> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>  	 */
>  	memblock_reserve(__pa_symbol(_text), _end - _text);
>  #ifdef CONFIG_BLK_DEV_INITRD
> -	if (initrd_start) {
> -		memblock_reserve(initrd_start, initrd_end - initrd_start);
> -
> +	if (phys_initrd_size) {

Since we're touching the if anyways, perhaps convert the #ifdef to a C 
IS_ENABLED().

>  		/* the generic initrd code expects virtual addresses */
> -		initrd_start = __phys_to_virt(initrd_start);
> -		initrd_end = __phys_to_virt(initrd_end);
> +		initrd_start = __phys_to_virt(phys_initrd_start);
> +		initrd_end = initrd_start + phys_initrd_size;
> +		initrd_below_start_ok = 0;
>  	}
>  #endif
>  
> -- 
> 2.17.1
> 

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-10-31 19:28 ` [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size Florian Fainelli
  2018-11-05 20:33   ` Rob Herring
@ 2018-11-05 20:39   ` Ard Biesheuvel
  2018-11-05 20:41     ` Florian Fainelli
  1 sibling, 1 reply; 16+ messages in thread
From: Ard Biesheuvel @ 2018-11-05 20:39 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Florian,

On 31 October 2018 at 20:28, Florian Fainelli <f.fainelli@gmail.com> wrote:
> ARM64 is the only architecture that re-defines
> __early_init_dt_declare_initrd() in order for that function to populate
> initrd_start/initrd_end with physical addresses instead of virtual
> addresses. Instead of having an override we can leverage
> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
> populate those variables for us.
>
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
>  arch/arm64/mm/init.c | 19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
> index 3cf87341859f..00ef2166bb73 100644
> --- a/arch/arm64/mm/init.c
> +++ b/arch/arm64/mm/init.c
> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>         if (*endp == ',') {
>                 size = memparse(endp + 1, NULL);
>
> -               initrd_start = start;
> -               initrd_end = start + size;
> +               phys_initrd_start = start;
> +               phys_initrd_size = size;
>         }
>         return 0;
>  }
> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>                 memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>         }
>
> -       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
> +       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>                 /*
>                  * Add back the memory we just removed if it results in the
>                  * initrd to become inaccessible via the linear mapping.
>                  * Otherwise, this is a no-op
>                  */
> -               u64 base = initrd_start & PAGE_MASK;
> -               u64 size = PAGE_ALIGN(initrd_end) - base;
> +               u64 base = phys_initrd_start & PAGE_MASK;
> +               u64 size = PAGE_ALIGN(phys_initrd_size);
>
>                 /*
>                  * We can only add back the initrd memory if we don't end up
> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>          */
>         memblock_reserve(__pa_symbol(_text), _end - _text);
>  #ifdef CONFIG_BLK_DEV_INITRD
> -       if (initrd_start) {
> -               memblock_reserve(initrd_start, initrd_end - initrd_start);
> -
> +       if (phys_initrd_size) {
>                 /* the generic initrd code expects virtual addresses */
> -               initrd_start = __phys_to_virt(initrd_start);
> -               initrd_end = __phys_to_virt(initrd_end);
> +               initrd_start = __phys_to_virt(phys_initrd_start);
> +               initrd_end = initrd_start + phys_initrd_size;
> +               initrd_below_start_ok = 0;

Where is this assignment coming from?

>         }
>  #endif
>
> --
> 2.17.1
>

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-11-05 20:39   ` Ard Biesheuvel
@ 2018-11-05 20:41     ` Florian Fainelli
  2018-11-05 20:44       ` Ard Biesheuvel
  0 siblings, 1 reply; 16+ messages in thread
From: Florian Fainelli @ 2018-11-05 20:41 UTC (permalink / raw)
  To: linux-arm-kernel

On 11/5/18 12:39 PM, Ard Biesheuvel wrote:
> Hi Florian,
> 
> On 31 October 2018 at 20:28, Florian Fainelli <f.fainelli@gmail.com> wrote:
>> ARM64 is the only architecture that re-defines
>> __early_init_dt_declare_initrd() in order for that function to populate
>> initrd_start/initrd_end with physical addresses instead of virtual
>> addresses. Instead of having an override we can leverage
>> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
>> populate those variables for us.
>>
>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>> ---
>>  arch/arm64/mm/init.c | 19 +++++++++----------
>>  1 file changed, 9 insertions(+), 10 deletions(-)
>>
>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>> index 3cf87341859f..00ef2166bb73 100644
>> --- a/arch/arm64/mm/init.c
>> +++ b/arch/arm64/mm/init.c
>> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>>         if (*endp == ',') {
>>                 size = memparse(endp + 1, NULL);
>>
>> -               initrd_start = start;
>> -               initrd_end = start + size;
>> +               phys_initrd_start = start;
>> +               phys_initrd_size = size;
>>         }
>>         return 0;
>>  }
>> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>>                 memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>>         }
>>
>> -       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
>> +       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>>                 /*
>>                  * Add back the memory we just removed if it results in the
>>                  * initrd to become inaccessible via the linear mapping.
>>                  * Otherwise, this is a no-op
>>                  */
>> -               u64 base = initrd_start & PAGE_MASK;
>> -               u64 size = PAGE_ALIGN(initrd_end) - base;
>> +               u64 base = phys_initrd_start & PAGE_MASK;
>> +               u64 size = PAGE_ALIGN(phys_initrd_size);
>>
>>                 /*
>>                  * We can only add back the initrd memory if we don't end up
>> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>>          */
>>         memblock_reserve(__pa_symbol(_text), _end - _text);
>>  #ifdef CONFIG_BLK_DEV_INITRD
>> -       if (initrd_start) {
>> -               memblock_reserve(initrd_start, initrd_end - initrd_start);
>> -
>> +       if (phys_initrd_size) {
>>                 /* the generic initrd code expects virtual addresses */
>> -               initrd_start = __phys_to_virt(initrd_start);
>> -               initrd_end = __phys_to_virt(initrd_end);
>> +               initrd_start = __phys_to_virt(phys_initrd_start);
>> +               initrd_end = initrd_start + phys_initrd_size;
>> +               initrd_below_start_ok = 0;
> 
> Where is this assignment coming from?

__early_init_dt_declare_initrd() sets initrd_below_start_ok to 1 though
after patch #5 this is not necessary any more.
-- 
Florian

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-11-05 20:41     ` Florian Fainelli
@ 2018-11-05 20:44       ` Ard Biesheuvel
  2018-11-05 20:51         ` Florian Fainelli
  0 siblings, 1 reply; 16+ messages in thread
From: Ard Biesheuvel @ 2018-11-05 20:44 UTC (permalink / raw)
  To: linux-arm-kernel

On 5 November 2018 at 21:41, Florian Fainelli <f.fainelli@gmail.com> wrote:
> On 11/5/18 12:39 PM, Ard Biesheuvel wrote:
>> Hi Florian,
>>
>> On 31 October 2018 at 20:28, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>> ARM64 is the only architecture that re-defines
>>> __early_init_dt_declare_initrd() in order for that function to populate
>>> initrd_start/initrd_end with physical addresses instead of virtual
>>> addresses. Instead of having an override we can leverage
>>> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
>>> populate those variables for us.
>>>
>>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>>> ---
>>>  arch/arm64/mm/init.c | 19 +++++++++----------
>>>  1 file changed, 9 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>>> index 3cf87341859f..00ef2166bb73 100644
>>> --- a/arch/arm64/mm/init.c
>>> +++ b/arch/arm64/mm/init.c
>>> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>>>         if (*endp == ',') {
>>>                 size = memparse(endp + 1, NULL);
>>>
>>> -               initrd_start = start;
>>> -               initrd_end = start + size;
>>> +               phys_initrd_start = start;
>>> +               phys_initrd_size = size;
>>>         }
>>>         return 0;
>>>  }
>>> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>>>                 memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>>>         }
>>>
>>> -       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
>>> +       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>>>                 /*
>>>                  * Add back the memory we just removed if it results in the
>>>                  * initrd to become inaccessible via the linear mapping.
>>>                  * Otherwise, this is a no-op
>>>                  */
>>> -               u64 base = initrd_start & PAGE_MASK;
>>> -               u64 size = PAGE_ALIGN(initrd_end) - base;
>>> +               u64 base = phys_initrd_start & PAGE_MASK;
>>> +               u64 size = PAGE_ALIGN(phys_initrd_size);
>>>
>>>                 /*
>>>                  * We can only add back the initrd memory if we don't end up
>>> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>>>          */
>>>         memblock_reserve(__pa_symbol(_text), _end - _text);
>>>  #ifdef CONFIG_BLK_DEV_INITRD
>>> -       if (initrd_start) {
>>> -               memblock_reserve(initrd_start, initrd_end - initrd_start);
>>> -
>>> +       if (phys_initrd_size) {
>>>                 /* the generic initrd code expects virtual addresses */
>>> -               initrd_start = __phys_to_virt(initrd_start);
>>> -               initrd_end = __phys_to_virt(initrd_end);
>>> +               initrd_start = __phys_to_virt(phys_initrd_start);
>>> +               initrd_end = initrd_start + phys_initrd_size;
>>> +               initrd_below_start_ok = 0;
>>
>> Where is this assignment coming from?
>
> __early_init_dt_declare_initrd() sets initrd_below_start_ok to 1 though
> after patch #5 this is not necessary any more.

Yes, but why? The original arm64 version of
__early_init_dt_declare_initrd() does not set it but now you set to 1
in the IS_ENABLED(CONFIG_ARM64) section in the generic code and set it
back to 0 here.

Or am I missing something?

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-11-05 20:44       ` Ard Biesheuvel
@ 2018-11-05 20:51         ` Florian Fainelli
  2018-11-05 21:00           ` Ard Biesheuvel
  0 siblings, 1 reply; 16+ messages in thread
From: Florian Fainelli @ 2018-11-05 20:51 UTC (permalink / raw)
  To: linux-arm-kernel

On 11/5/18 12:44 PM, Ard Biesheuvel wrote:
> On 5 November 2018 at 21:41, Florian Fainelli <f.fainelli@gmail.com> wrote:
>> On 11/5/18 12:39 PM, Ard Biesheuvel wrote:
>>> Hi Florian,
>>>
>>> On 31 October 2018 at 20:28, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>>> ARM64 is the only architecture that re-defines
>>>> __early_init_dt_declare_initrd() in order for that function to populate
>>>> initrd_start/initrd_end with physical addresses instead of virtual
>>>> addresses. Instead of having an override we can leverage
>>>> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
>>>> populate those variables for us.
>>>>
>>>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>>>> ---
>>>>  arch/arm64/mm/init.c | 19 +++++++++----------
>>>>  1 file changed, 9 insertions(+), 10 deletions(-)
>>>>
>>>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>>>> index 3cf87341859f..00ef2166bb73 100644
>>>> --- a/arch/arm64/mm/init.c
>>>> +++ b/arch/arm64/mm/init.c
>>>> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>>>>         if (*endp == ',') {
>>>>                 size = memparse(endp + 1, NULL);
>>>>
>>>> -               initrd_start = start;
>>>> -               initrd_end = start + size;
>>>> +               phys_initrd_start = start;
>>>> +               phys_initrd_size = size;
>>>>         }
>>>>         return 0;
>>>>  }
>>>> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>>>>                 memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>>>>         }
>>>>
>>>> -       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
>>>> +       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>>>>                 /*
>>>>                  * Add back the memory we just removed if it results in the
>>>>                  * initrd to become inaccessible via the linear mapping.
>>>>                  * Otherwise, this is a no-op
>>>>                  */
>>>> -               u64 base = initrd_start & PAGE_MASK;
>>>> -               u64 size = PAGE_ALIGN(initrd_end) - base;
>>>> +               u64 base = phys_initrd_start & PAGE_MASK;
>>>> +               u64 size = PAGE_ALIGN(phys_initrd_size);
>>>>
>>>>                 /*
>>>>                  * We can only add back the initrd memory if we don't end up
>>>> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>>>>          */
>>>>         memblock_reserve(__pa_symbol(_text), _end - _text);
>>>>  #ifdef CONFIG_BLK_DEV_INITRD
>>>> -       if (initrd_start) {
>>>> -               memblock_reserve(initrd_start, initrd_end - initrd_start);
>>>> -
>>>> +       if (phys_initrd_size) {
>>>>                 /* the generic initrd code expects virtual addresses */
>>>> -               initrd_start = __phys_to_virt(initrd_start);
>>>> -               initrd_end = __phys_to_virt(initrd_end);
>>>> +               initrd_start = __phys_to_virt(phys_initrd_start);
>>>> +               initrd_end = initrd_start + phys_initrd_size;
>>>> +               initrd_below_start_ok = 0;
>>>
>>> Where is this assignment coming from?
>>
>> __early_init_dt_declare_initrd() sets initrd_below_start_ok to 1 though
>> after patch #5 this is not necessary any more.
> 
> Yes, but why? The original arm64 version of
> __early_init_dt_declare_initrd() does not set it but now you set to 1
> in the IS_ENABLED(CONFIG_ARM64) section in the generic code and set it
> back to 0 here.

Humm, it is an if (!IS_ENABLED(CONFIG_ARM64)) condition, so we would not
be taking that branch on an ARM64 kernel.

If you are saying the assignment is not necessary anymore after patch #5
, that is true, though this can only be done a part of part #5, not as
part of patch #4 in order not to break initrd functionality in-between
patches.

> 
> Or am I missing something?
> 

Not sure, I could be too, it's Monday after all :)
-- 
Florian

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-11-05 20:51         ` Florian Fainelli
@ 2018-11-05 21:00           ` Ard Biesheuvel
  2018-11-05 21:05             ` Florian Fainelli
  0 siblings, 1 reply; 16+ messages in thread
From: Ard Biesheuvel @ 2018-11-05 21:00 UTC (permalink / raw)
  To: linux-arm-kernel

On 5 November 2018 at 21:51, Florian Fainelli <f.fainelli@gmail.com> wrote:
> On 11/5/18 12:44 PM, Ard Biesheuvel wrote:
>> On 5 November 2018 at 21:41, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>> On 11/5/18 12:39 PM, Ard Biesheuvel wrote:
>>>> Hi Florian,
>>>>
>>>> On 31 October 2018 at 20:28, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>>>> ARM64 is the only architecture that re-defines
>>>>> __early_init_dt_declare_initrd() in order for that function to populate
>>>>> initrd_start/initrd_end with physical addresses instead of virtual
>>>>> addresses. Instead of having an override we can leverage
>>>>> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
>>>>> populate those variables for us.
>>>>>
>>>>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>>>>> ---
>>>>>  arch/arm64/mm/init.c | 19 +++++++++----------
>>>>>  1 file changed, 9 insertions(+), 10 deletions(-)
>>>>>
>>>>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>>>>> index 3cf87341859f..00ef2166bb73 100644
>>>>> --- a/arch/arm64/mm/init.c
>>>>> +++ b/arch/arm64/mm/init.c
>>>>> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>>>>>         if (*endp == ',') {
>>>>>                 size = memparse(endp + 1, NULL);
>>>>>
>>>>> -               initrd_start = start;
>>>>> -               initrd_end = start + size;
>>>>> +               phys_initrd_start = start;
>>>>> +               phys_initrd_size = size;
>>>>>         }
>>>>>         return 0;
>>>>>  }
>>>>> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>>>>>                 memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>>>>>         }
>>>>>
>>>>> -       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
>>>>> +       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>>>>>                 /*
>>>>>                  * Add back the memory we just removed if it results in the
>>>>>                  * initrd to become inaccessible via the linear mapping.
>>>>>                  * Otherwise, this is a no-op
>>>>>                  */
>>>>> -               u64 base = initrd_start & PAGE_MASK;
>>>>> -               u64 size = PAGE_ALIGN(initrd_end) - base;
>>>>> +               u64 base = phys_initrd_start & PAGE_MASK;
>>>>> +               u64 size = PAGE_ALIGN(phys_initrd_size);
>>>>>
>>>>>                 /*
>>>>>                  * We can only add back the initrd memory if we don't end up
>>>>> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>>>>>          */
>>>>>         memblock_reserve(__pa_symbol(_text), _end - _text);
>>>>>  #ifdef CONFIG_BLK_DEV_INITRD
>>>>> -       if (initrd_start) {
>>>>> -               memblock_reserve(initrd_start, initrd_end - initrd_start);
>>>>> -
>>>>> +       if (phys_initrd_size) {
>>>>>                 /* the generic initrd code expects virtual addresses */
>>>>> -               initrd_start = __phys_to_virt(initrd_start);
>>>>> -               initrd_end = __phys_to_virt(initrd_end);
>>>>> +               initrd_start = __phys_to_virt(phys_initrd_start);
>>>>> +               initrd_end = initrd_start + phys_initrd_size;
>>>>> +               initrd_below_start_ok = 0;
>>>>
>>>> Where is this assignment coming from?
>>>
>>> __early_init_dt_declare_initrd() sets initrd_below_start_ok to 1 though
>>> after patch #5 this is not necessary any more.
>>
>> Yes, but why? The original arm64 version of
>> __early_init_dt_declare_initrd() does not set it but now you set to 1
>> in the IS_ENABLED(CONFIG_ARM64) section in the generic code and set it
>> back to 0 here.
>
> Humm, it is an if (!IS_ENABLED(CONFIG_ARM64)) condition, so we would not
> be taking that branch on an ARM64 kernel.
>

Right. So now that we are not setting it to 1 on arm64, there is no
longer a reason to set it to 0 again, no?

> If you are saying the assignment is not necessary anymore after patch #5
> , that is true, though this can only be done a part of part #5, not as
> part of patch #4 in order not to break initrd functionality in-between
> patches.
>
>>
>> Or am I missing something?
>>
>
> Not sure, I could be too, it's Monday after all :)

Yeah :-)

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-11-05 21:00           ` Ard Biesheuvel
@ 2018-11-05 21:05             ` Florian Fainelli
  2018-11-05 21:07               ` Ard Biesheuvel
  0 siblings, 1 reply; 16+ messages in thread
From: Florian Fainelli @ 2018-11-05 21:05 UTC (permalink / raw)
  To: linux-arm-kernel

On 11/5/18 1:00 PM, Ard Biesheuvel wrote:
> On 5 November 2018 at 21:51, Florian Fainelli <f.fainelli@gmail.com> wrote:
>> On 11/5/18 12:44 PM, Ard Biesheuvel wrote:
>>> On 5 November 2018 at 21:41, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>>> On 11/5/18 12:39 PM, Ard Biesheuvel wrote:
>>>>> Hi Florian,
>>>>>
>>>>> On 31 October 2018 at 20:28, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>>>>> ARM64 is the only architecture that re-defines
>>>>>> __early_init_dt_declare_initrd() in order for that function to populate
>>>>>> initrd_start/initrd_end with physical addresses instead of virtual
>>>>>> addresses. Instead of having an override we can leverage
>>>>>> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
>>>>>> populate those variables for us.
>>>>>>
>>>>>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>>>>>> ---
>>>>>>  arch/arm64/mm/init.c | 19 +++++++++----------
>>>>>>  1 file changed, 9 insertions(+), 10 deletions(-)
>>>>>>
>>>>>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>>>>>> index 3cf87341859f..00ef2166bb73 100644
>>>>>> --- a/arch/arm64/mm/init.c
>>>>>> +++ b/arch/arm64/mm/init.c
>>>>>> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>>>>>>         if (*endp == ',') {
>>>>>>                 size = memparse(endp + 1, NULL);
>>>>>>
>>>>>> -               initrd_start = start;
>>>>>> -               initrd_end = start + size;
>>>>>> +               phys_initrd_start = start;
>>>>>> +               phys_initrd_size = size;
>>>>>>         }
>>>>>>         return 0;
>>>>>>  }
>>>>>> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>>>>>>                 memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>>>>>>         }
>>>>>>
>>>>>> -       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
>>>>>> +       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>>>>>>                 /*
>>>>>>                  * Add back the memory we just removed if it results in the
>>>>>>                  * initrd to become inaccessible via the linear mapping.
>>>>>>                  * Otherwise, this is a no-op
>>>>>>                  */
>>>>>> -               u64 base = initrd_start & PAGE_MASK;
>>>>>> -               u64 size = PAGE_ALIGN(initrd_end) - base;
>>>>>> +               u64 base = phys_initrd_start & PAGE_MASK;
>>>>>> +               u64 size = PAGE_ALIGN(phys_initrd_size);
>>>>>>
>>>>>>                 /*
>>>>>>                  * We can only add back the initrd memory if we don't end up
>>>>>> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>>>>>>          */
>>>>>>         memblock_reserve(__pa_symbol(_text), _end - _text);
>>>>>>  #ifdef CONFIG_BLK_DEV_INITRD
>>>>>> -       if (initrd_start) {
>>>>>> -               memblock_reserve(initrd_start, initrd_end - initrd_start);
>>>>>> -
>>>>>> +       if (phys_initrd_size) {
>>>>>>                 /* the generic initrd code expects virtual addresses */
>>>>>> -               initrd_start = __phys_to_virt(initrd_start);
>>>>>> -               initrd_end = __phys_to_virt(initrd_end);
>>>>>> +               initrd_start = __phys_to_virt(phys_initrd_start);
>>>>>> +               initrd_end = initrd_start + phys_initrd_size;
>>>>>> +               initrd_below_start_ok = 0;
>>>>>
>>>>> Where is this assignment coming from?
>>>>
>>>> __early_init_dt_declare_initrd() sets initrd_below_start_ok to 1 though
>>>> after patch #5 this is not necessary any more.
>>>
>>> Yes, but why? The original arm64 version of
>>> __early_init_dt_declare_initrd() does not set it but now you set to 1
>>> in the IS_ENABLED(CONFIG_ARM64) section in the generic code and set it
>>> back to 0 here.
>>
>> Humm, it is an if (!IS_ENABLED(CONFIG_ARM64)) condition, so we would not
>> be taking that branch on an ARM64 kernel.
>>
> 
> Right. So now that we are not setting it to 1 on arm64, there is no
> longer a reason to set it to 0 again, no?

Correct, and in fact, this is not a problem either at patch #4 (which
has the custom __early_init_dt_declare_initrd()) or #5 (which removes
it), any other feedback you would like me to address before addressing
Rob's suggestion?

> 
>> If you are saying the assignment is not necessary anymore after patch #5
>> , that is true, though this can only be done a part of part #5, not as
>> part of patch #4 in order not to break initrd functionality in-between
>> patches.
>>
>>>
>>> Or am I missing something?
>>>
>>
>> Not sure, I could be too, it's Monday after all :)
> 
> Yeah :-)
> 


-- 
Florian

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

* [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size
  2018-11-05 21:05             ` Florian Fainelli
@ 2018-11-05 21:07               ` Ard Biesheuvel
  0 siblings, 0 replies; 16+ messages in thread
From: Ard Biesheuvel @ 2018-11-05 21:07 UTC (permalink / raw)
  To: linux-arm-kernel

On 5 November 2018 at 22:05, Florian Fainelli <f.fainelli@gmail.com> wrote:
> On 11/5/18 1:00 PM, Ard Biesheuvel wrote:
>> On 5 November 2018 at 21:51, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>> On 11/5/18 12:44 PM, Ard Biesheuvel wrote:
>>>> On 5 November 2018 at 21:41, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>>>> On 11/5/18 12:39 PM, Ard Biesheuvel wrote:
>>>>>> Hi Florian,
>>>>>>
>>>>>> On 31 October 2018 at 20:28, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>>>>>> ARM64 is the only architecture that re-defines
>>>>>>> __early_init_dt_declare_initrd() in order for that function to populate
>>>>>>> initrd_start/initrd_end with physical addresses instead of virtual
>>>>>>> addresses. Instead of having an override we can leverage
>>>>>>> drivers/of/fdt.c populating phys_initrd_start/phys_initrd_size to
>>>>>>> populate those variables for us.
>>>>>>>
>>>>>>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>>>>>>> ---
>>>>>>>  arch/arm64/mm/init.c | 19 +++++++++----------
>>>>>>>  1 file changed, 9 insertions(+), 10 deletions(-)
>>>>>>>
>>>>>>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>>>>>>> index 3cf87341859f..00ef2166bb73 100644
>>>>>>> --- a/arch/arm64/mm/init.c
>>>>>>> +++ b/arch/arm64/mm/init.c
>>>>>>> @@ -72,8 +72,8 @@ static int __init early_initrd(char *p)
>>>>>>>         if (*endp == ',') {
>>>>>>>                 size = memparse(endp + 1, NULL);
>>>>>>>
>>>>>>> -               initrd_start = start;
>>>>>>> -               initrd_end = start + size;
>>>>>>> +               phys_initrd_start = start;
>>>>>>> +               phys_initrd_size = size;
>>>>>>>         }
>>>>>>>         return 0;
>>>>>>>  }
>>>>>>> @@ -408,14 +408,14 @@ void __init arm64_memblock_init(void)
>>>>>>>                 memblock_add(__pa_symbol(_text), (u64)(_end - _text));
>>>>>>>         }
>>>>>>>
>>>>>>> -       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
>>>>>>> +       if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && phys_initrd_size) {
>>>>>>>                 /*
>>>>>>>                  * Add back the memory we just removed if it results in the
>>>>>>>                  * initrd to become inaccessible via the linear mapping.
>>>>>>>                  * Otherwise, this is a no-op
>>>>>>>                  */
>>>>>>> -               u64 base = initrd_start & PAGE_MASK;
>>>>>>> -               u64 size = PAGE_ALIGN(initrd_end) - base;
>>>>>>> +               u64 base = phys_initrd_start & PAGE_MASK;
>>>>>>> +               u64 size = PAGE_ALIGN(phys_initrd_size);
>>>>>>>
>>>>>>>                 /*
>>>>>>>                  * We can only add back the initrd memory if we don't end up
>>>>>>> @@ -460,12 +460,11 @@ void __init arm64_memblock_init(void)
>>>>>>>          */
>>>>>>>         memblock_reserve(__pa_symbol(_text), _end - _text);
>>>>>>>  #ifdef CONFIG_BLK_DEV_INITRD
>>>>>>> -       if (initrd_start) {
>>>>>>> -               memblock_reserve(initrd_start, initrd_end - initrd_start);
>>>>>>> -
>>>>>>> +       if (phys_initrd_size) {
>>>>>>>                 /* the generic initrd code expects virtual addresses */
>>>>>>> -               initrd_start = __phys_to_virt(initrd_start);
>>>>>>> -               initrd_end = __phys_to_virt(initrd_end);
>>>>>>> +               initrd_start = __phys_to_virt(phys_initrd_start);
>>>>>>> +               initrd_end = initrd_start + phys_initrd_size;
>>>>>>> +               initrd_below_start_ok = 0;
>>>>>>
>>>>>> Where is this assignment coming from?
>>>>>
>>>>> __early_init_dt_declare_initrd() sets initrd_below_start_ok to 1 though
>>>>> after patch #5 this is not necessary any more.
>>>>
>>>> Yes, but why? The original arm64 version of
>>>> __early_init_dt_declare_initrd() does not set it but now you set to 1
>>>> in the IS_ENABLED(CONFIG_ARM64) section in the generic code and set it
>>>> back to 0 here.
>>>
>>> Humm, it is an if (!IS_ENABLED(CONFIG_ARM64)) condition, so we would not
>>> be taking that branch on an ARM64 kernel.
>>>
>>
>> Right. So now that we are not setting it to 1 on arm64, there is no
>> longer a reason to set it to 0 again, no?
>
> Correct, and in fact, this is not a problem either at patch #4 (which
> has the custom __early_init_dt_declare_initrd()) or #5 (which removes
> it), any other feedback you would like me to address before addressing
> Rob's suggestion?
>

No, I think this is ok. The conditional on arm64 in generic code is a
bit nasty, and it would be nicer generally if we only have to record a
single memory range, but if this fixes the issue you were addressing
originally, I'm fine with it.

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

end of thread, other threads:[~2018-11-05 21:07 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-31 19:28 [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Florian Fainelli
2018-10-31 19:28 ` [PATCH v3 1/6] nds32: Remove phys_initrd_start and phys_initrd_size Florian Fainelli
2018-10-31 19:28 ` [PATCH v3 2/6] arch: Make phys_initrd_start and phys_initrd_size global variables Florian Fainelli
2018-10-31 19:28 ` [PATCH v3 3/6] of/fdt: Populate phys_initrd_start/phys_initrd_size from FDT Florian Fainelli
2018-10-31 19:28 ` [PATCH v3 4/6] arm64: Utilize phys_initrd_start/phys_initrd_size Florian Fainelli
2018-11-05 20:33   ` Rob Herring
2018-11-05 20:39   ` Ard Biesheuvel
2018-11-05 20:41     ` Florian Fainelli
2018-11-05 20:44       ` Ard Biesheuvel
2018-11-05 20:51         ` Florian Fainelli
2018-11-05 21:00           ` Ard Biesheuvel
2018-11-05 21:05             ` Florian Fainelli
2018-11-05 21:07               ` Ard Biesheuvel
2018-10-31 19:28 ` [PATCH v3 5/6] of/fdt: Remove custom __early_init_dt_declare_initrd() implementation Florian Fainelli
2018-10-31 19:28 ` [PATCH v3 6/6] arch: Move initrd= parsing into do_mounts_initrd.c Florian Fainelli
2018-11-05 20:31 ` [PATCH v3 0/6] arm64: Get rid of __early_init_dt_declare_initrd() Rob Herring

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).