* [PATCH 01/12] ARM: kexec: fix crashkernel= handling
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
@ 2016-04-28 9:27 ` Russell King
[not found] ` <E1aviEe-0000if-VZ-eh5Bv4kxaXIANfyc6IWni62ZND6+EDdj@public.gmane.org>
2016-04-28 9:27 ` [PATCH 02/12] ARM: provide improved virt_to_idmap() functionality Russell King
` (12 subsequent siblings)
13 siblings, 1 reply; 50+ messages in thread
From: Russell King @ 2016-04-28 9:27 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
When the kernel crashkernel parameter is specified with just a size, we
are supposed to allocate a region from RAM to store the crashkernel.
However, ARM merely reserves physical address zero with no checking that
there is even RAM there.
Fix this by lifting similar code from x86, importing it to ARM with the
ARM specific parameters added. In the absence of any platform specific
information, we allocate the crashkernel region from the first 512MB of
physical memory.
Update the kdump documentation to reflect this change.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
Documentation/kdump/kdump.txt | 13 +++----------
arch/arm/kernel/setup.c | 29 +++++++++++++++++++++++++++++
2 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/Documentation/kdump/kdump.txt b/Documentation/kdump/kdump.txt
index bc4bd5a44b88..88ff63d5fde3 100644
--- a/Documentation/kdump/kdump.txt
+++ b/Documentation/kdump/kdump.txt
@@ -263,12 +263,6 @@ been removed from the machine.
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
range=start-[end]
-Please note, on arm, the offset is required.
- crashkernel=<range1>:<size1>[,<range2>:<size2>,...]@offset
- range=start-[end]
-
- 'start' is inclusive and 'end' is exclusive.
-
For example:
crashkernel=512M-2G:64M,2G-:128M
@@ -307,10 +301,9 @@ Boot into System Kernel
on the memory consumption of the kdump system. In general this is not
dependent on the memory size of the production system.
- On arm, use "crashkernel=Y@X". Note that the start address of the kernel
- will be aligned to 128MiB (0x08000000), so if the start address is not then
- any space below the alignment point may be overwritten by the dump-capture kernel,
- which means it is possible that the vmcore is not that precise as expected.
+ On arm, the use of "crashkernel=Y@X" is no longer necessary; the
+ kernel will automatically locate the crash kernel image within the
+ first 512MB of RAM if X is not given.
Load the Dump-capture Kernel
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 139791ed473d..77b54c461c52 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -938,6 +938,13 @@ static int __init init_machine_late(void)
late_initcall(init_machine_late);
#ifdef CONFIG_KEXEC
+/*
+ * The crash region must be aligned to 128MB to avoid
+ * zImage relocating below the reserved region.
+ */
+#define CRASH_ALIGN (128 << 20)
+#define CRASH_ADDR_MAX (PHYS_OFFSET + (512 << 20))
+
static inline unsigned long long get_total_mem(void)
{
unsigned long total;
@@ -965,6 +972,28 @@ static void __init reserve_crashkernel(void)
if (ret)
return;
+ if (crash_base <= 0) {
+ unsigned long long crash_max = CRASH_ADDR_MAX;
+ if (crash_max > (u32)~0)
+ crash_max = (u32)~0;
+ crash_base = memblock_find_in_range(CRASH_ALIGN, crash_max,
+ crash_size, CRASH_ALIGN);
+ if (!crash_base) {
+ pr_err("crashkernel reservation failed - No suitable area found.\n");
+ return;
+ }
+ } else {
+ unsigned long long start;
+
+ start = memblock_find_in_range(crash_base,
+ crash_base + crash_size,
+ crash_size, SECTION_SIZE);
+ if (start != crash_base) {
+ pr_err("crashkernel reservation failed - memory is in use.\n");
+ return;
+ }
+ }
+
ret = memblock_reserve(crash_base, crash_size);
if (ret < 0) {
pr_warn("crashkernel reservation failed - memory is in use (0x%lx)\n",
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 02/12] ARM: provide improved virt_to_idmap() functionality
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
2016-04-28 9:27 ` [PATCH 01/12] ARM: kexec: fix crashkernel= handling Russell King
@ 2016-04-28 9:27 ` Russell King
2016-04-28 9:27 ` [PATCH 03/12] ARM: kexec: remove 512MB restriction on kexec crashdump Russell King
` (11 subsequent siblings)
13 siblings, 0 replies; 50+ messages in thread
From: Russell King @ 2016-04-28 9:27 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
For kexec, we need more functionality from the IDMAP system. We need to
be able to convert physical addresses to their identity mappped versions
as well as virtual addresses.
Convert the existing arch_virt_to_idmap() to deal with physical
addresses instead.
Acked-by: Santosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/include/asm/memory.h | 33 ++++++++++++++++++++++++++-------
arch/arm/mach-keystone/keystone.c | 7 +------
arch/arm/mm/idmap.c | 2 +-
3 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
index 9427fd632552..ca208335fde6 100644
--- a/arch/arm/include/asm/memory.h
+++ b/arch/arm/include/asm/memory.h
@@ -288,19 +288,38 @@ static inline void *phys_to_virt(phys_addr_t x)
#define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x)))
#define pfn_to_kaddr(pfn) __va((phys_addr_t)(pfn) << PAGE_SHIFT)
-extern unsigned long (*arch_virt_to_idmap)(unsigned long x);
+extern long long arch_phys_to_idmap_offset;
/*
- * These are for systems that have a hardware interconnect supported alias of
- * physical memory for idmap purposes. Most cases should leave these
+ * These are for systems that have a hardware interconnect supported alias
+ * of physical memory for idmap purposes. Most cases should leave these
* untouched. Note: this can only return addresses less than 4GiB.
*/
+#define IDMAP_INVALID_ADDR ((u32)~0)
+
+static inline unsigned long phys_to_idmap(phys_addr_t addr)
+{
+ if (IS_ENABLED(CONFIG_MMU) && arch_phys_to_idmap_offset) {
+ addr += arch_phys_to_idmap_offset;
+ if (addr > (u32)~0)
+ addr = IDMAP_INVALID_ADDR;
+ }
+ return addr;
+}
+
+static inline phys_addr_t idmap_to_phys(unsigned long idmap)
+{
+ phys_addr_t addr = idmap;
+
+ if (IS_ENABLED(CONFIG_MMU) && arch_phys_to_idmap_offset)
+ addr -= arch_phys_to_idmap_offset;
+
+ return addr;
+}
+
static inline unsigned long __virt_to_idmap(unsigned long x)
{
- if (IS_ENABLED(CONFIG_MMU) && arch_virt_to_idmap)
- return arch_virt_to_idmap(x);
- else
- return __virt_to_phys(x);
+ return phys_to_idmap(__virt_to_phys(x));
}
#define virt_to_idmap(x) __virt_to_idmap((unsigned long)(x))
diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c
index e6b9cb1e6709..a33a296b00dc 100644
--- a/arch/arm/mach-keystone/keystone.c
+++ b/arch/arm/mach-keystone/keystone.c
@@ -63,11 +63,6 @@ static void __init keystone_init(void)
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
}
-static unsigned long keystone_virt_to_idmap(unsigned long x)
-{
- return (phys_addr_t)(x) - CONFIG_PAGE_OFFSET + KEYSTONE_LOW_PHYS_START;
-}
-
static long long __init keystone_pv_fixup(void)
{
long long offset;
@@ -91,7 +86,7 @@ static long long __init keystone_pv_fixup(void)
offset = KEYSTONE_HIGH_PHYS_START - KEYSTONE_LOW_PHYS_START;
/* Populate the arch idmap hook */
- arch_virt_to_idmap = keystone_virt_to_idmap;
+ arch_phys_to_idmap_offset = -offset;
return offset;
}
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c
index bd274a05b8ff..c1a48f88764e 100644
--- a/arch/arm/mm/idmap.c
+++ b/arch/arm/mm/idmap.c
@@ -15,7 +15,7 @@
* page tables.
*/
pgd_t *idmap_pgd;
-unsigned long (*arch_virt_to_idmap)(unsigned long x);
+long long arch_phys_to_idmap_offset;
#ifdef CONFIG_ARM_LPAE
static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end,
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 03/12] ARM: kexec: remove 512MB restriction on kexec crashdump
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
2016-04-28 9:27 ` [PATCH 01/12] ARM: kexec: fix crashkernel= handling Russell King
2016-04-28 9:27 ` [PATCH 02/12] ARM: provide improved virt_to_idmap() functionality Russell King
@ 2016-04-28 9:27 ` Russell King
2016-04-29 14:19 ` Pratyush Anand
2016-04-28 9:28 ` [PATCH 04/12] ARM: provide arm_has_idmap_alias() helper Russell King
` (10 subsequent siblings)
13 siblings, 1 reply; 50+ messages in thread
From: Russell King @ 2016-04-28 9:27 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/setup.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 77b54c461c52..d9317eec1eba 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -943,7 +943,6 @@ late_initcall(init_machine_late);
* zImage relocating below the reserved region.
*/
#define CRASH_ALIGN (128 << 20)
-#define CRASH_ADDR_MAX (PHYS_OFFSET + (512 << 20))
static inline unsigned long long get_total_mem(void)
{
@@ -973,9 +972,7 @@ static void __init reserve_crashkernel(void)
return;
if (crash_base <= 0) {
- unsigned long long crash_max = CRASH_ADDR_MAX;
- if (crash_max > (u32)~0)
- crash_max = (u32)~0;
+ unsigned long long crash_max = idmap_to_phys((u32)~0);
crash_base = memblock_find_in_range(CRASH_ALIGN, crash_max,
crash_size, CRASH_ALIGN);
if (!crash_base) {
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 03/12] ARM: kexec: remove 512MB restriction on kexec crashdump
2016-04-28 9:27 ` [PATCH 03/12] ARM: kexec: remove 512MB restriction on kexec crashdump Russell King
@ 2016-04-29 14:19 ` Pratyush Anand
[not found] ` <CAHB_GuqOvRof94QdHztPy2B2kKuyKzQ-9uxXHY_g+i5WxsexZg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 1 reply; 50+ messages in thread
From: Pratyush Anand @ 2016-04-29 14:19 UTC (permalink / raw)
To: Russell King
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Thu, Apr 28, 2016 at 2:57 PM, Russell King
<rmk+kernel@arm.linux.org.uk> wrote:
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> arch/arm/kernel/setup.c | 5 +----
> 1 file changed, 1 insertion(+), 4 deletions(-)
>
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 77b54c461c52..d9317eec1eba 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -943,7 +943,6 @@ late_initcall(init_machine_late);
> * zImage relocating below the reserved region.
> */
> #define CRASH_ALIGN (128 << 20)
> -#define CRASH_ADDR_MAX (PHYS_OFFSET + (512 << 20))
>
> static inline unsigned long long get_total_mem(void)
> {
> @@ -973,9 +972,7 @@ static void __init reserve_crashkernel(void)
> return;
>
> if (crash_base <= 0) {
> - unsigned long long crash_max = CRASH_ADDR_MAX;
> - if (crash_max > (u32)~0)
> - crash_max = (u32)~0;
> + unsigned long long crash_max = idmap_to_phys((u32)~0);
> crash_base = memblock_find_in_range(CRASH_ALIGN, crash_max,
> crash_size, CRASH_ALIGN);
> if (!crash_base) {
Reviewed-by: Pratyush Anand <panand@redhat.com>
Unrelated to these modification:
In function arch/arm/mm/init.c: arm_memblock_steal() may be following
would be more appropriate?
memblock_alloc_base(size, align, idmap_to_phys(MEMBLOCK_ALLOC_ANYWHERE));
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 04/12] ARM: provide arm_has_idmap_alias() helper
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (2 preceding siblings ...)
2016-04-28 9:27 ` [PATCH 03/12] ARM: kexec: remove 512MB restriction on kexec crashdump Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-29 14:21 ` Pratyush Anand
2016-04-28 9:28 ` [PATCH 05/12] ARM: kdump: advertise boot aliased crash kernel resource Russell King
` (9 subsequent siblings)
13 siblings, 1 reply; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
Provide a helper to indicate whether we need to perform special handling
for boot identity mapping aliases or not.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/include/asm/memory.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
index ca208335fde6..31c07a2cc100 100644
--- a/arch/arm/include/asm/memory.h
+++ b/arch/arm/include/asm/memory.h
@@ -295,6 +295,11 @@ extern long long arch_phys_to_idmap_offset;
* of physical memory for idmap purposes. Most cases should leave these
* untouched. Note: this can only return addresses less than 4GiB.
*/
+static inline bool arm_has_idmap_alias(void)
+{
+ return IS_ENABLED(CONFIG_MMU) && arch_phys_to_idmap_offset != 0;
+}
+
#define IDMAP_INVALID_ADDR ((u32)~0)
static inline unsigned long phys_to_idmap(phys_addr_t addr)
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 04/12] ARM: provide arm_has_idmap_alias() helper
2016-04-28 9:28 ` [PATCH 04/12] ARM: provide arm_has_idmap_alias() helper Russell King
@ 2016-04-29 14:21 ` Pratyush Anand
0 siblings, 0 replies; 50+ messages in thread
From: Pratyush Anand @ 2016-04-29 14:21 UTC (permalink / raw)
To: Russell King
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Thu, Apr 28, 2016 at 2:58 PM, Russell King
<rmk+kernel@arm.linux.org.uk> wrote:
> Provide a helper to indicate whether we need to perform special handling
> for boot identity mapping aliases or not.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> arch/arm/include/asm/memory.h | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h
> index ca208335fde6..31c07a2cc100 100644
> --- a/arch/arm/include/asm/memory.h
> +++ b/arch/arm/include/asm/memory.h
> @@ -295,6 +295,11 @@ extern long long arch_phys_to_idmap_offset;
> * of physical memory for idmap purposes. Most cases should leave these
> * untouched. Note: this can only return addresses less than 4GiB.
> */
> +static inline bool arm_has_idmap_alias(void)
> +{
> + return IS_ENABLED(CONFIG_MMU) && arch_phys_to_idmap_offset != 0;
> +}
> +
> #define IDMAP_INVALID_ADDR ((u32)~0)
>
> static inline unsigned long phys_to_idmap(phys_addr_t addr)
Reviewed-by: Pratyush Anand <panand@redhat.com>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 05/12] ARM: kdump: advertise boot aliased crash kernel resource
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (3 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 04/12] ARM: provide arm_has_idmap_alias() helper Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-28 9:28 ` [PATCH 06/12] ARM: kexec: advertise location of bootable RAM Russell King
` (8 subsequent siblings)
13 siblings, 0 replies; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
Advertise a resource which describes where the crash kernel is located
in the boot view of RAM. This allows kexec-tools to have this vital
information.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/setup.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index d9317eec1eba..19b25ad61385 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -1003,9 +1003,25 @@ static void __init reserve_crashkernel(void)
(unsigned long)(crash_base >> 20),
(unsigned long)(total_mem >> 20));
+ /* The crashk resource must always be located in normal mem */
crashk_res.start = crash_base;
crashk_res.end = crash_base + crash_size - 1;
insert_resource(&iomem_resource, &crashk_res);
+
+ if (arm_has_idmap_alias()) {
+ /*
+ * If we have a special RAM alias for use at boot, we
+ * need to advertise to kexec tools where the alias is.
+ */
+ static struct resource crashk_boot_res = {
+ .name = "Crash kernel (boot alias)",
+ .flags = IORESOURCE_BUSY | IORESOURCE_MEM,
+ };
+
+ crashk_boot_res.start = phys_to_idmap(crash_base);
+ crashk_boot_res.end = crashk_boot_res.start + crash_size - 1;
+ insert_resource(&iomem_resource, &crashk_boot_res);
+ }
}
#else
static inline void reserve_crashkernel(void) {}
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (4 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 05/12] ARM: kdump: advertise boot aliased crash kernel resource Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-29 14:56 ` Pratyush Anand
2016-04-28 9:28 ` [PATCH 07/12] ARM: keystone: dts: add psci command definition Russell King
` (7 subsequent siblings)
13 siblings, 1 reply; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
Advertise the location of bootable RAM to kexec-tools. kexec needs to
know where it can place the kernel in RAM, and so be executable when
the system needs to jump into it.
Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
tag.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/kernel/setup.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 19b25ad61385..7cf1c0d4f773 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -847,10 +847,29 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)
kernel_data.end = virt_to_phys(_end - 1);
for_each_memblock(memory, region) {
+ phys_addr_t start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
+ phys_addr_t end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
+ unsigned long boot_alias_start;
+
+ /*
+ * Some systems have a special memory alias which is only
+ * used for booting. We need to advertise this region to
+ * kexec-tools so they know where bootable RAM is located.
+ */
+ boot_alias_start = phys_to_idmap(start);
+ if (arm_has_idmap_alias() && boot_alias_start != INVALID_IDMAP_ADDR) {
+ res = memblock_virt_alloc(sizeof(*res), 0);
+ res->name = "System RAM (boot alias)";
+ res->start = boot_alias_start;
+ res->end = phys_to_idmap(end);
+ res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+ request_resource(&iomem_resource, res);
+ }
+
res = memblock_virt_alloc(sizeof(*res), 0);
res->name = "System RAM";
- res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
- res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
+ res->start = start;
+ res->end = end;
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
request_resource(&iomem_resource, res);
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-04-28 9:28 ` [PATCH 06/12] ARM: kexec: advertise location of bootable RAM Russell King
@ 2016-04-29 14:56 ` Pratyush Anand
2016-04-29 18:00 ` Russell King - ARM Linux
[not found] ` <CAHB_GurHc1aVfzJATpNW5yf5s5KkF=t5s09FbWq3+9+ZX39KUg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 2 replies; 50+ messages in thread
From: Pratyush Anand @ 2016-04-29 14:56 UTC (permalink / raw)
To: Russell King
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
Hi Russell,
On Thu, Apr 28, 2016 at 2:58 PM, Russell King
<rmk+kernel@arm.linux.org.uk> wrote:
> Advertise the location of bootable RAM to kexec-tools. kexec needs to
> know where it can place the kernel in RAM, and so be executable when
> the system needs to jump into it.
>
> Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
> tag.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Can you please also share git tree path of corresponding kexec-tools changes?
Could it be a better idea (if things in user space become simpler)
that in stead of patch 5 and 6, we pass arch_phys_to_idmap_offset to
user space, and then user space manipulates existing "Crash kernel"
and "System RAM" resources.
~Pratyush
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-04-29 14:56 ` Pratyush Anand
@ 2016-04-29 18:00 ` Russell King - ARM Linux
2016-04-30 3:27 ` Pratyush Anand
[not found] ` <CAHB_GurHc1aVfzJATpNW5yf5s5KkF=t5s09FbWq3+9+ZX39KUg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
1 sibling, 1 reply; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-04-29 18:00 UTC (permalink / raw)
To: Pratyush Anand
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 08:26:00PM +0530, Pratyush Anand wrote:
> Hi Russell,
>
> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
> <rmk+kernel@arm.linux.org.uk> wrote:
> > Advertise the location of bootable RAM to kexec-tools. kexec needs to
> > know where it can place the kernel in RAM, and so be executable when
> > the system needs to jump into it.
> >
> > Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
> > tag.
> >
> > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
>
> Can you please also share git tree path of corresponding kexec-tools changes?
>
> Could it be a better idea (if things in user space become simpler)
> that in stead of patch 5 and 6, we pass arch_phys_to_idmap_offset to
> user space, and then user space manipulates existing "Crash kernel"
> and "System RAM" resources.
Given that it's only _one_ platform right now, I don't think that
additional complexity is worth it. It means that we have to invent
some API to do it, and I don't see why userspace should even care
about having the delta exported - especially when the conversion
may not be as trivial.
The method I've implemented here keeps things completely independent
of whatever conversion between boot and running physical addresses
may be present on the kernel side as far as userspace is concerned.
--
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-04-29 18:00 ` Russell King - ARM Linux
@ 2016-04-30 3:27 ` Pratyush Anand
2016-04-30 8:20 ` Russell King - ARM Linux
0 siblings, 1 reply; 50+ messages in thread
From: Pratyush Anand @ 2016-04-30 3:27 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 11:30 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Fri, Apr 29, 2016 at 08:26:00PM +0530, Pratyush Anand wrote:
>> Hi Russell,
>>
>> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
>> <rmk+kernel@arm.linux.org.uk> wrote:
>> > Advertise the location of bootable RAM to kexec-tools. kexec needs to
>> > know where it can place the kernel in RAM, and so be executable when
>> > the system needs to jump into it.
>> >
>> > Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
>> > tag.
>> >
>> > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
>>
>> Can you please also share git tree path of corresponding kexec-tools changes?
>>
>> Could it be a better idea (if things in user space become simpler)
>> that in stead of patch 5 and 6, we pass arch_phys_to_idmap_offset to
>> user space, and then user space manipulates existing "Crash kernel"
>> and "System RAM" resources.
>
> Given that it's only _one_ platform right now, I don't think that
> additional complexity is worth it. It means that we have to invent
Probably, I could not communicate it well. I was not trying to have
*additional* complexity. Wanted to see if things could be simpler
rather. So this is what my understanding was:
-- We create one patch to pass arch_phys_to_idmap_offset to user space
(say in /sys/kernel/bootmem_idmap_offset)
-- We do not use patch 5,6,11 and 12 of this series. Probably few more
content of the series will go away.
-- In kexec-tools code , we read /sys/kernel/bootmem_idmap_offset and
add that value in "start" and "end" of "Crash Kernel" and "System RAM"
resources.
> some API to do it, and I don't see why userspace should even care
> about having the delta exported - especially when the conversion
> may not be as trivial.
>
Yes, I agree, if translation is not trivial like that of keystone,
then what I am proposing will not work.
Reviewed-by: Pratyush Anand <panand@redhat.com>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-04-30 3:27 ` Pratyush Anand
@ 2016-04-30 8:20 ` Russell King - ARM Linux
2016-05-02 7:34 ` Pratyush Anand
0 siblings, 1 reply; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-04-30 8:20 UTC (permalink / raw)
To: Pratyush Anand
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Sat, Apr 30, 2016 at 08:57:34AM +0530, Pratyush Anand wrote:
> On Fri, Apr 29, 2016 at 11:30 PM, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
> > On Fri, Apr 29, 2016 at 08:26:00PM +0530, Pratyush Anand wrote:
> >> Hi Russell,
> >>
> >> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
> >> <rmk+kernel@arm.linux.org.uk> wrote:
> >> > Advertise the location of bootable RAM to kexec-tools. kexec needs to
> >> > know where it can place the kernel in RAM, and so be executable when
> >> > the system needs to jump into it.
> >> >
> >> > Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
> >> > tag.
> >> >
> >> > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> >>
> >> Can you please also share git tree path of corresponding kexec-tools changes?
> >>
> >> Could it be a better idea (if things in user space become simpler)
> >> that in stead of patch 5 and 6, we pass arch_phys_to_idmap_offset to
> >> user space, and then user space manipulates existing "Crash kernel"
> >> and "System RAM" resources.
> >
> > Given that it's only _one_ platform right now, I don't think that
> > additional complexity is worth it. It means that we have to invent
>
> Probably, I could not communicate it well. I was not trying to have
> *additional* complexity. Wanted to see if things could be simpler
> rather. So this is what my understanding was:
> -- We create one patch to pass arch_phys_to_idmap_offset to user space
> (say in /sys/kernel/bootmem_idmap_offset)
> -- We do not use patch 5,6,11 and 12 of this series. Probably few more
> content of the series will go away.
Patches 11 and 12 don't go away with what you're suggesting. Patches
11 and 12 are necessary to allow the boot-view addresses to be passed
into the kernel through kexec, and to allow kexec to find appropriate
memory resources.
For example, from patch 11:
@@ -48,7 +48,8 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned
long entry,
- if ((entry < crashk_res.start) || (entry > crashk_res.end))
+ if ((entry < phys_to_boot_phys(crashk_res.start)) ||
+ (entry > phys_to_boot_phys(crashk_res.end)))
"entry" is limited to a 32-bit physical address as it is unsigned long,
and is the boot-view physical address. crashk_res.start is the
running-view physical address. Without this change, the rest will
always be true on Keystone 2.
@@ -229,8 +229,8 @@ int sanity_check_segment_list(struct kimage *image)
- if ((mstart < crashk_res.start) ||
- (mend > crashk_res.end))
+ if ((mstart < phys_to_boot_phys(crashk_res.start)) ||
+ (mend > phys_to_boot_phys(crashk_res.end)))
Same problem - mstart and mend are both 32-bit quantities. The result
is the segment list validation always fails.
@@ -354,7 +354,7 @@ static struct page *kimage_alloc_normal_control_pages(struct kimage *image,
- pfn = page_to_pfn(pages);
+ pfn = page_to_boot_pfn(pages);
The result without this change is that we allocate _all_ system memory
looking for a suitable page, never finding one because we never find
a page which matches. Without a previous patch, killing many
processes and taking the system down.
@@ -480,7 +480,7 @@ static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
- *image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
+ *image->entry = virt_to_boot_phys(ind_page) | IND_INDIRECTION;
The physical address would end up being truncated to 32-bits, but
would actually be larger than 4GiB. So, *image->entry would point
at the incorrect address, and kexec would fail.
@@ -535,13 +535,13 @@ void kimage_terminate(struct kimage *image)
#define for_each_kimage_entry(image, ptr, entry) \
for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
ptr = (entry & IND_INDIRECTION) ? \
- phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
+ boot_phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
"entry" is truncated to 32-bit, and so this passes an invalid
physical address which is not part of the lowmem mapping to
phys_to_virt(). The resulting virtual address is undefined.
- page = pfn_to_page(entry >> PAGE_SHIFT);
+ page = boot_pfn_to_page(entry >> PAGE_SHIFT);
Same, except the resulting struct page pointer is undefined.
... and so it goes on.
The only patches which get replaced are patches 5 and 6 with a new
userspace API.
--
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-04-30 8:20 ` Russell King - ARM Linux
@ 2016-05-02 7:34 ` Pratyush Anand
2016-05-02 10:10 ` Russell King - ARM Linux
0 siblings, 1 reply; 50+ messages in thread
From: Pratyush Anand @ 2016-05-02 7:34 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Sat, Apr 30, 2016 at 1:50 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Sat, Apr 30, 2016 at 08:57:34AM +0530, Pratyush Anand wrote:
>> On Fri, Apr 29, 2016 at 11:30 PM, Russell King - ARM Linux
>> <linux@arm.linux.org.uk> wrote:
>> > On Fri, Apr 29, 2016 at 08:26:00PM +0530, Pratyush Anand wrote:
>> >> Hi Russell,
>> >>
>> >> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
>> >> <rmk+kernel@arm.linux.org.uk> wrote:
>> >> > Advertise the location of bootable RAM to kexec-tools. kexec needs to
>> >> > know where it can place the kernel in RAM, and so be executable when
>> >> > the system needs to jump into it.
>> >> >
>> >> > Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
>> >> > tag.
>> >> >
>> >> > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
>> >>
>> >> Can you please also share git tree path of corresponding kexec-tools changes?
>> >>
>> >> Could it be a better idea (if things in user space become simpler)
>> >> that in stead of patch 5 and 6, we pass arch_phys_to_idmap_offset to
>> >> user space, and then user space manipulates existing "Crash kernel"
>> >> and "System RAM" resources.
>> >
>> > Given that it's only _one_ platform right now, I don't think that
>> > additional complexity is worth it. It means that we have to invent
>>
>> Probably, I could not communicate it well. I was not trying to have
>> *additional* complexity. Wanted to see if things could be simpler
>> rather. So this is what my understanding was:
>> -- We create one patch to pass arch_phys_to_idmap_offset to user space
>> (say in /sys/kernel/bootmem_idmap_offset)
>> -- We do not use patch 5,6,11 and 12 of this series. Probably few more
>> content of the series will go away.
>
> Patches 11 and 12 don't go away with what you're suggesting. Patches
> 11 and 12 are necessary to allow the boot-view addresses to be passed
> into the kernel through kexec, and to allow kexec to find appropriate
> memory resources.
But once we would have manipulated "start" and "end" of "Crash Kernel"
and "System RAM" resources in user space using
/sys/kernel/bootmem_idmap_offset , then kernel through kexec system
call would have already receive boot-view addresses, no?
~Pratyush
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-05-02 7:34 ` Pratyush Anand
@ 2016-05-02 10:10 ` Russell King - ARM Linux
2016-05-02 10:48 ` Pratyush Anand
0 siblings, 1 reply; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-05-02 10:10 UTC (permalink / raw)
To: Pratyush Anand
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Mon, May 02, 2016 at 01:04:28PM +0530, Pratyush Anand wrote:
> On Sat, Apr 30, 2016 at 1:50 PM, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
> > On Sat, Apr 30, 2016 at 08:57:34AM +0530, Pratyush Anand wrote:
> >> On Fri, Apr 29, 2016 at 11:30 PM, Russell King - ARM Linux
> >> <linux@arm.linux.org.uk> wrote:
> >> > On Fri, Apr 29, 2016 at 08:26:00PM +0530, Pratyush Anand wrote:
> >> >> Hi Russell,
> >> >>
> >> >> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
> >> >> <rmk+kernel@arm.linux.org.uk> wrote:
> >> >> > Advertise the location of bootable RAM to kexec-tools. kexec needs to
> >> >> > know where it can place the kernel in RAM, and so be executable when
> >> >> > the system needs to jump into it.
> >> >> >
> >> >> > Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
> >> >> > tag.
> >> >> >
> >> >> > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> >> >>
> >> >> Can you please also share git tree path of corresponding kexec-tools changes?
> >> >>
> >> >> Could it be a better idea (if things in user space become simpler)
> >> >> that in stead of patch 5 and 6, we pass arch_phys_to_idmap_offset to
> >> >> user space, and then user space manipulates existing "Crash kernel"
> >> >> and "System RAM" resources.
> >> >
> >> > Given that it's only _one_ platform right now, I don't think that
> >> > additional complexity is worth it. It means that we have to invent
> >>
> >> Probably, I could not communicate it well. I was not trying to have
> >> *additional* complexity. Wanted to see if things could be simpler
> >> rather. So this is what my understanding was:
> >> -- We create one patch to pass arch_phys_to_idmap_offset to user space
> >> (say in /sys/kernel/bootmem_idmap_offset)
> >> -- We do not use patch 5,6,11 and 12 of this series. Probably few more
> >> content of the series will go away.
> >
> > Patches 11 and 12 don't go away with what you're suggesting. Patches
> > 11 and 12 are necessary to allow the boot-view addresses to be passed
> > into the kernel through kexec, and to allow kexec to find appropriate
> > memory resources.
>
> But once we would have manipulated "start" and "end" of "Crash Kernel"
> and "System RAM" resources in user space using
> /sys/kernel/bootmem_idmap_offset , then kernel through kexec system
> call would have already receive boot-view addresses, no?
Correct, but that's still a problem for all the reasons I gave in the
email to which you replied to.
I'm not sure where the misunderstanding is.
Let me repeat: even if we do what you're suggesting, patches 11 and 12
do *not* go away. I've explained in detail why each of the changes are
necessary (which you have cut from your reply.)
In other words: exporting this offset via
/sys/kernel/bootmem_idmap_offset is technically inferior to the solution
I have come up with here, and it saves very little complexity and code.
--
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
2016-05-02 10:10 ` Russell King - ARM Linux
@ 2016-05-02 10:48 ` Pratyush Anand
0 siblings, 0 replies; 50+ messages in thread
From: Pratyush Anand @ 2016-05-02 10:48 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Mon, May 2, 2016 at 3:40 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Mon, May 02, 2016 at 01:04:28PM +0530, Pratyush Anand wrote:
>> On Sat, Apr 30, 2016 at 1:50 PM, Russell King - ARM Linux
>> <linux@arm.linux.org.uk> wrote:
>> > On Sat, Apr 30, 2016 at 08:57:34AM +0530, Pratyush Anand wrote:
>> >> On Fri, Apr 29, 2016 at 11:30 PM, Russell King - ARM Linux
>> >> <linux@arm.linux.org.uk> wrote:
>> >> > On Fri, Apr 29, 2016 at 08:26:00PM +0530, Pratyush Anand wrote:
>> >> >> Hi Russell,
>> >> >>
>> >> >> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
>> >> >> <rmk+kernel@arm.linux.org.uk> wrote:
>> >> >> > Advertise the location of bootable RAM to kexec-tools. kexec needs to
>> >> >> > know where it can place the kernel in RAM, and so be executable when
>> >> >> > the system needs to jump into it.
>> >> >> >
>> >> >> > Advertise these areas in /proc/iomem with a "System RAM (boot alias)"
>> >> >> > tag.
>> >> >> >
>> >> >> > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
>> >> >>
>> >> >> Can you please also share git tree path of corresponding kexec-tools changes?
>> >> >>
>> >> >> Could it be a better idea (if things in user space become simpler)
>> >> >> that in stead of patch 5 and 6, we pass arch_phys_to_idmap_offset to
>> >> >> user space, and then user space manipulates existing "Crash kernel"
>> >> >> and "System RAM" resources.
>> >> >
>> >> > Given that it's only _one_ platform right now, I don't think that
>> >> > additional complexity is worth it. It means that we have to invent
>> >>
>> >> Probably, I could not communicate it well. I was not trying to have
>> >> *additional* complexity. Wanted to see if things could be simpler
>> >> rather. So this is what my understanding was:
>> >> -- We create one patch to pass arch_phys_to_idmap_offset to user space
>> >> (say in /sys/kernel/bootmem_idmap_offset)
>> >> -- We do not use patch 5,6,11 and 12 of this series. Probably few more
>> >> content of the series will go away.
>> >
>> > Patches 11 and 12 don't go away with what you're suggesting. Patches
>> > 11 and 12 are necessary to allow the boot-view addresses to be passed
>> > into the kernel through kexec, and to allow kexec to find appropriate
>> > memory resources.
>>
>> But once we would have manipulated "start" and "end" of "Crash Kernel"
>> and "System RAM" resources in user space using
>> /sys/kernel/bootmem_idmap_offset , then kernel through kexec system
>> call would have already receive boot-view addresses, no?
>
> Correct, but that's still a problem for all the reasons I gave in the
> email to which you replied to.
>
> I'm not sure where the misunderstanding is.
No, no..there is no misunderstanding. I agreed to your implementation
because that will work for generic cases and for me complete series is
OK.
I just wanted to clarify my understanding, and so was the last argument.
>
> Let me repeat: even if we do what you're suggesting, patches 11 and 12
> do *not* go away. I've explained in detail why each of the changes are
> necessary (which you have cut from your reply.)
>
Again, it is just for clarifying myself.
I cut the reply because I understood that in patch 11 and 12, you
convert addresses passed by kexec tools from run time view to boot
view using different helpers like phys_to_boot_phys(). So, had kexec
system call passed boot view addresses, we would have not needed 11
and 12. This is what I wanted to clarify.
> In other words: exporting this offset via
> /sys/kernel/bootmem_idmap_offset is technically inferior to the solution
> I have come up with here, and it saves very little complexity and code.
I still have opinion that code will probably be more simple and reduce
significantly, however solution will siege to work the moment
idmap_offset is not a simple additive value.
Therefore, I am OK with your implementation.
~Pratyush
^ permalink raw reply [flat|nested] 50+ messages in thread
[parent not found: <CAHB_GurHc1aVfzJATpNW5yf5s5KkF=t5s09FbWq3+9+ZX39KUg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH 06/12] ARM: kexec: advertise location of bootable RAM
[not found] ` <CAHB_GurHc1aVfzJATpNW5yf5s5KkF=t5s09FbWq3+9+ZX39KUg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2016-05-03 10:29 ` Russell King - ARM Linux
0 siblings, 0 replies; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-05-03 10:29 UTC (permalink / raw)
To: Pratyush Anand
Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Mark Rutland,
devicetree-u79uwXL29TY76Z2rM5mHXA, Tony Luck,
linux-ia64-u79uwXL29TY76Z2rM5mHXA,
linux-doc-u79uwXL29TY76Z2rM5mHXA, Pawel Moll, Jonathan Corbet,
Ian Campbell, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Fenghua Yu,
Haren Myneni, Rob Herring, Eric Biederman, Santosh Shilimkar,
Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 08:26:00PM +0530, Pratyush Anand wrote:
> Can you please also share git tree path of corresponding kexec-tools changes?
On their way as a 32-patch series. I've found the userspace tools to be
in particularly poor shape, so some of the patches are fixing that up.
I can't believe that anyone uses these userspace tools, because there
are some fundamental bugs present in this code which go back years.
However, the repository does seem to be maintained, with the latest
commit within the last two months (or day when I started working on
this.)
They're based upon 2.0.12-rc1 (93d3a617) of the
git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
repository, which was the latest commit when I started working on this
back in March. Things may have moved forwards since then - I've not
been able to check yet. However, this set of changes should be
sufficient to get an idea of what's required on the userspace side.
Thanks.
--
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 07/12] ARM: keystone: dts: add psci command definition
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (5 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 06/12] ARM: kexec: advertise location of bootable RAM Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-28 9:28 ` [PATCH 08/12] kexec: don't invoke OOM-killer for control page allocation Russell King
` (6 subsequent siblings)
13 siblings, 0 replies; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
From: Vitaly Andrianov <vitalya@ti.com>
This commit adds definition for cpu_on, cpu_off and cpu_suspend commands.
These definitions must match the corresponding PSCI definitions in
boot monitor.
Having those command and corresponding PSCI support in boot monitor allows
run time CPU hot plugin.
Signed-off-by: Keerthy <j-keerthy@ti.com>
Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
This patch is already queued by Santosh, and only exists as part of this
series for completeness.
arch/arm/boot/dts/keystone.dtsi | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/arm/boot/dts/keystone.dtsi b/arch/arm/boot/dts/keystone.dtsi
index 3f272826f537..007648971744 100644
--- a/arch/arm/boot/dts/keystone.dtsi
+++ b/arch/arm/boot/dts/keystone.dtsi
@@ -59,6 +59,14 @@
<GIC_SPI 23 IRQ_TYPE_EDGE_RISING>;
};
+ psci {
+ compatible = "arm,psci";
+ method = "smc";
+ cpu_suspend = <0x84000001>;
+ cpu_off = <0x84000002>;
+ cpu_on = <0x84000003>;
+ };
+
soc {
#address-cells = <1>;
#size-cells = <1>;
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 08/12] kexec: don't invoke OOM-killer for control page allocation
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (6 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 07/12] ARM: keystone: dts: add psci command definition Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-29 14:57 ` Pratyush Anand
2016-04-28 9:28 ` [PATCH 09/12] kexec: ensure user memory sizes do not wrap Russell King
` (5 subsequent siblings)
13 siblings, 1 reply; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
If we are unable to find a suitable page when allocating the control
page, do not invoke the OOM-killer: killing processes probably isn't
going to help.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
include/linux/kexec.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index 2cc643c6e870..1b32ab587f66 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -41,7 +41,7 @@
#endif
#ifndef KEXEC_CONTROL_MEMORY_GFP
-#define KEXEC_CONTROL_MEMORY_GFP GFP_KERNEL
+#define KEXEC_CONTROL_MEMORY_GFP (GFP_KERNEL | __GFP_NORETRY)
#endif
#ifndef KEXEC_CONTROL_PAGE_SIZE
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 08/12] kexec: don't invoke OOM-killer for control page allocation
2016-04-28 9:28 ` [PATCH 08/12] kexec: don't invoke OOM-killer for control page allocation Russell King
@ 2016-04-29 14:57 ` Pratyush Anand
0 siblings, 0 replies; 50+ messages in thread
From: Pratyush Anand @ 2016-04-29 14:57 UTC (permalink / raw)
To: Russell King
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Thu, Apr 28, 2016 at 2:58 PM, Russell King
<rmk+kernel@arm.linux.org.uk> wrote:
> If we are unable to find a suitable page when allocating the control
> page, do not invoke the OOM-killer: killing processes probably isn't
> going to help.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> include/linux/kexec.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> index 2cc643c6e870..1b32ab587f66 100644
> --- a/include/linux/kexec.h
> +++ b/include/linux/kexec.h
> @@ -41,7 +41,7 @@
> #endif
>
> #ifndef KEXEC_CONTROL_MEMORY_GFP
> -#define KEXEC_CONTROL_MEMORY_GFP GFP_KERNEL
> +#define KEXEC_CONTROL_MEMORY_GFP (GFP_KERNEL | __GFP_NORETRY)
> #endif
>
> #ifndef KEXEC_CONTROL_PAGE_SIZE
Reviewed-by: Pratyush Anand <panand@redhat.com>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 09/12] kexec: ensure user memory sizes do not wrap
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (7 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 08/12] kexec: don't invoke OOM-killer for control page allocation Russell King
@ 2016-04-28 9:28 ` Russell King
[not found] ` <E1aviFK-0000jY-1S-eh5Bv4kxaXIANfyc6IWni62ZND6+EDdj@public.gmane.org>
2016-04-28 9:28 ` [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t Russell King
` (4 subsequent siblings)
13 siblings, 1 reply; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
Ensure that user memory sizes do not wrap around when validating the
user input, which can lead to the following input validation working
incorrectly.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
kernel/kexec_core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index 8d34308ea449..d719a4d0ef55 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -169,6 +169,8 @@ int sanity_check_segment_list(struct kimage *image)
mstart = image->segment[i].mem;
mend = mstart + image->segment[i].memsz;
+ if (mstart > mend)
+ return result;
if ((mstart & ~PAGE_MASK) || (mend & ~PAGE_MASK))
return result;
if (mend >= KEXEC_DESTINATION_MEMORY_LIMIT)
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (8 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 09/12] kexec: ensure user memory sizes do not wrap Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-29 15:06 ` Pratyush Anand
2016-04-28 9:28 ` [PATCH 11/12] kexec: allow architectures to override boot mapping Russell King
` (3 subsequent siblings)
13 siblings, 1 reply; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
On PAE systems (eg, ARM LPAE) the vmcore note may be located above
4GB physical on 32-bit architectures, so we need a wider type than
"unsigned long" here. Arrange for paddr_vmcoreinfo_note() to return
a phys_addr_t, thereby allowing it to be located above 4GB.
This makes no difference for kexec-tools, as they already assume a
64-bit type when reading from this file.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/ia64/kernel/machine_kexec.c | 2 +-
include/linux/kexec.h | 2 +-
kernel/kexec_core.c | 2 +-
kernel/ksysfs.c | 4 ++--
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c
index b72cd7a07222..599507bcec91 100644
--- a/arch/ia64/kernel/machine_kexec.c
+++ b/arch/ia64/kernel/machine_kexec.c
@@ -163,7 +163,7 @@ void arch_crash_save_vmcoreinfo(void)
#endif
}
-unsigned long paddr_vmcoreinfo_note(void)
+phys_addr_t paddr_vmcoreinfo_note(void)
{
return ia64_tpa((unsigned long)(char *)&vmcoreinfo_note);
}
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index 1b32ab587f66..52a3a221bcb2 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -235,7 +235,7 @@ void crash_unmap_reserved_pages(void);
void arch_crash_save_vmcoreinfo(void);
__printf(1, 2)
void vmcoreinfo_append_str(const char *fmt, ...);
-unsigned long paddr_vmcoreinfo_note(void);
+phys_addr_t paddr_vmcoreinfo_note(void);
#define VMCOREINFO_OSRELEASE(value) \
vmcoreinfo_append_str("OSRELEASE=%s\n", value)
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index d719a4d0ef55..f9847e5822e6 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -1377,7 +1377,7 @@ void vmcoreinfo_append_str(const char *fmt, ...)
void __weak arch_crash_save_vmcoreinfo(void)
{}
-unsigned long __weak paddr_vmcoreinfo_note(void)
+phys_addr_t __weak paddr_vmcoreinfo_note(void)
{
return __pa((unsigned long)(char *)&vmcoreinfo_note);
}
diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
index 152da4a48867..9f1920d2d0c6 100644
--- a/kernel/ksysfs.c
+++ b/kernel/ksysfs.c
@@ -128,8 +128,8 @@ KERNEL_ATTR_RW(kexec_crash_size);
static ssize_t vmcoreinfo_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
{
- return sprintf(buf, "%lx %x\n",
- paddr_vmcoreinfo_note(),
+ phys_addr_t vmcore_base = paddr_vmcoreinfo_note();
+ return sprintf(buf, "%pa %x\n", &vmcore_base,
(unsigned int)sizeof(vmcoreinfo_note));
}
KERNEL_ATTR_RO(vmcoreinfo);
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-04-28 9:28 ` [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t Russell King
@ 2016-04-29 15:06 ` Pratyush Anand
2016-04-29 15:16 ` Mark Rutland
2016-04-29 18:06 ` Russell King - ARM Linux
0 siblings, 2 replies; 50+ messages in thread
From: Pratyush Anand @ 2016-04-29 15:06 UTC (permalink / raw)
To: Russell King
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Thu, Apr 28, 2016 at 2:58 PM, Russell King
<rmk+kernel@arm.linux.org.uk> wrote:
> On PAE systems (eg, ARM LPAE) the vmcore note may be located above
> 4GB physical on 32-bit architectures, so we need a wider type than
> "unsigned long" here. Arrange for paddr_vmcoreinfo_note() to return
> a phys_addr_t, thereby allowing it to be located above 4GB.
>
> This makes no difference for kexec-tools, as they already assume a
> 64-bit type when reading from this file.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> arch/ia64/kernel/machine_kexec.c | 2 +-
> include/linux/kexec.h | 2 +-
> kernel/kexec_core.c | 2 +-
> kernel/ksysfs.c | 4 ++--
> 4 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c
> index b72cd7a07222..599507bcec91 100644
> --- a/arch/ia64/kernel/machine_kexec.c
> +++ b/arch/ia64/kernel/machine_kexec.c
> @@ -163,7 +163,7 @@ void arch_crash_save_vmcoreinfo(void)
> #endif
> }
>
> -unsigned long paddr_vmcoreinfo_note(void)
> +phys_addr_t paddr_vmcoreinfo_note(void)
> {
> return ia64_tpa((unsigned long)(char *)&vmcoreinfo_note);
> }
> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> index 1b32ab587f66..52a3a221bcb2 100644
> --- a/include/linux/kexec.h
> +++ b/include/linux/kexec.h
> @@ -235,7 +235,7 @@ void crash_unmap_reserved_pages(void);
> void arch_crash_save_vmcoreinfo(void);
> __printf(1, 2)
> void vmcoreinfo_append_str(const char *fmt, ...);
> -unsigned long paddr_vmcoreinfo_note(void);
> +phys_addr_t paddr_vmcoreinfo_note(void);
>
> #define VMCOREINFO_OSRELEASE(value) \
> vmcoreinfo_append_str("OSRELEASE=%s\n", value)
> diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
> index d719a4d0ef55..f9847e5822e6 100644
> --- a/kernel/kexec_core.c
> +++ b/kernel/kexec_core.c
> @@ -1377,7 +1377,7 @@ void vmcoreinfo_append_str(const char *fmt, ...)
> void __weak arch_crash_save_vmcoreinfo(void)
> {}
>
> -unsigned long __weak paddr_vmcoreinfo_note(void)
> +phys_addr_t __weak paddr_vmcoreinfo_note(void)
> {
> return __pa((unsigned long)(char *)&vmcoreinfo_note);
> }
> diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
> index 152da4a48867..9f1920d2d0c6 100644
> --- a/kernel/ksysfs.c
> +++ b/kernel/ksysfs.c
> @@ -128,8 +128,8 @@ KERNEL_ATTR_RW(kexec_crash_size);
> static ssize_t vmcoreinfo_show(struct kobject *kobj,
> struct kobj_attribute *attr, char *buf)
> {
> - return sprintf(buf, "%lx %x\n",
> - paddr_vmcoreinfo_note(),
> + phys_addr_t vmcore_base = paddr_vmcoreinfo_note();
> + return sprintf(buf, "%pa %x\n", &vmcore_base,
Why do we pass &vmcore_base? Shouldn't it be vmcore_base?
~Pratyush
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-04-29 15:06 ` Pratyush Anand
@ 2016-04-29 15:16 ` Mark Rutland
2016-04-29 15:47 ` Pratyush Anand
2016-04-29 18:06 ` Russell King - ARM Linux
1 sibling, 1 reply; 50+ messages in thread
From: Mark Rutland @ 2016-04-29 15:16 UTC (permalink / raw)
To: Pratyush Anand
Cc: Russell King, linux-arm-kernel, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 08:36:43PM +0530, Pratyush Anand wrote:
> > + phys_addr_t vmcore_base = paddr_vmcoreinfo_note();
> > + return sprintf(buf, "%pa %x\n", &vmcore_base,
>
> Why do we pass &vmcore_base? Shouldn't it be vmcore_base?
The %pa* printk format specifiers take the value by reference (as
phys_addr_t and friends are not necessarily the same width as a
pointer). Per Documentation/printk-formats.txt:
Physical addresses types phys_addr_t:
%pa[p] 0x01234567 or 0x0123456789abcdef
For printing a phys_addr_t type (and its derivatives, such as
resource_size_t) which can vary based on build options, regardless of
the width of the CPU data path. Passed by reference.
So the above prints the value of vmcore_base as expected.
Mark.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-04-29 15:16 ` Mark Rutland
@ 2016-04-29 15:47 ` Pratyush Anand
2016-05-03 4:24 ` Baoquan He
0 siblings, 1 reply; 50+ messages in thread
From: Pratyush Anand @ 2016-04-29 15:47 UTC (permalink / raw)
To: Mark Rutland
Cc: Russell King, linux-arm-kernel, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 8:46 PM, Mark Rutland <mark.rutland@arm.com> wrote:
> On Fri, Apr 29, 2016 at 08:36:43PM +0530, Pratyush Anand wrote:
>> > + phys_addr_t vmcore_base = paddr_vmcoreinfo_note();
>> > + return sprintf(buf, "%pa %x\n", &vmcore_base,
>>
>> Why do we pass &vmcore_base? Shouldn't it be vmcore_base?
>
> The %pa* printk format specifiers take the value by reference (as
> phys_addr_t and friends are not necessarily the same width as a
> pointer). Per Documentation/printk-formats.txt:
>
> Physical addresses types phys_addr_t:
>
> %pa[p] 0x01234567 or 0x0123456789abcdef
>
> For printing a phys_addr_t type (and its derivatives, such as
> resource_size_t) which can vary based on build options, regardless of
> the width of the CPU data path. Passed by reference.
>
> So the above prints the value of vmcore_base as expected.
Thanks a lot Mark for explaining :-)
Reviewed-by: Pratyush Anand <panand@redhat.com>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-04-29 15:47 ` Pratyush Anand
@ 2016-05-03 4:24 ` Baoquan He
2016-05-03 5:53 ` Pratyush Anand
[not found] ` <20160503042441.GA2518-ejN7fcUYdH/by3iVrkZq2A@public.gmane.org>
0 siblings, 2 replies; 50+ messages in thread
From: Baoquan He @ 2016-05-03 4:24 UTC (permalink / raw)
To: Pratyush Anand, Russell King
Cc: Mark Rutland, devicetree, Ian Campbell, Tony Luck, linux-ia64,
Pawel Moll, linux-doc, Jonathan Corbet, kexec, Fenghua Yu,
Vivek Goyal, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, linux-arm-kernel
This patch is clearly related to kdump. The prefix of subject should be
changed to kdump. Kexec doesn't need to handle vmcore things.
And patches realted to kexec/kdump should be CCed to Andrew, he usually
picks up and add them into akpm tree.
Hi Pratyush,
Could you please help tell why arm PAE kernel can be put above 4G?
Since the change is related to common code, I am curious about how
it's so different with other ARCHs.
Thanks
Baoquan
On 04/29/16 at 09:17pm, Pratyush Anand wrote:
> On Fri, Apr 29, 2016 at 8:46 PM, Mark Rutland <mark.rutland@arm.com> wrote:
> > On Fri, Apr 29, 2016 at 08:36:43PM +0530, Pratyush Anand wrote:
> >> > + phys_addr_t vmcore_base = paddr_vmcoreinfo_note();
> >> > + return sprintf(buf, "%pa %x\n", &vmcore_base,
> >>
> >> Why do we pass &vmcore_base? Shouldn't it be vmcore_base?
> >
> > The %pa* printk format specifiers take the value by reference (as
> > phys_addr_t and friends are not necessarily the same width as a
> > pointer). Per Documentation/printk-formats.txt:
> >
> > Physical addresses types phys_addr_t:
> >
> > %pa[p] 0x01234567 or 0x0123456789abcdef
> >
> > For printing a phys_addr_t type (and its derivatives, such as
> > resource_size_t) which can vary based on build options, regardless of
> > the width of the CPU data path. Passed by reference.
> >
> > So the above prints the value of vmcore_base as expected.
>
> Thanks a lot Mark for explaining :-)
>
> Reviewed-by: Pratyush Anand <panand@redhat.com>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-05-03 4:24 ` Baoquan He
@ 2016-05-03 5:53 ` Pratyush Anand
2016-05-03 9:01 ` Baoquan He
[not found] ` <20160503042441.GA2518-ejN7fcUYdH/by3iVrkZq2A@public.gmane.org>
1 sibling, 1 reply; 50+ messages in thread
From: Pratyush Anand @ 2016-05-03 5:53 UTC (permalink / raw)
To: Baoquan He
Cc: Russell King, Mark Rutland, devicetree, Ian Campbell, Tony Luck,
linux-ia64, Pawel Moll, linux-doc, Jonathan Corbet, kexec,
Fenghua Yu, Vivek Goyal, Haren Myneni, Rob Herring,
Eric Biederman, Santosh Shilimkar, Kumar Gala, linux-arm-kernel
Hi Baoquan,
On 03/05/2016:12:24:41 PM, Baoquan He wrote:
> Hi Pratyush,
>
> Could you please help tell why arm PAE kernel can be put above 4G?
PAE system can have physical addresses above 4G. So, if a CPU is supporting the
LPAE page table format then we should be able to access physical addresses
beyond 4G.
> Since the change is related to common code, I am curious about how
> it's so different with other ARCHs.
paddr_vmcoreinfo_note() returns a physical address, so returning phys_addr_t
seems most appropriate. So, kernel variable may land into above 4G locations,
even with the platform in other architecture (with PAE support), if start of RAM
is located very high,
So, in my opinion it would be safer to have these changes for other ARCHs as
well.
~Pratyush
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-05-03 5:53 ` Pratyush Anand
@ 2016-05-03 9:01 ` Baoquan He
0 siblings, 0 replies; 50+ messages in thread
From: Baoquan He @ 2016-05-03 9:01 UTC (permalink / raw)
To: Pratyush Anand
Cc: Mark Rutland, devicetree, Tony Luck, linux-ia64, Pawel Moll,
Ian Campbell, linux-doc, kexec, Fenghua Yu, Haren Myneni,
Rob Herring, Eric Biederman, Santosh Shilimkar, Russell King,
Jonathan Corbet, Kumar Gala, Vivek Goyal, linux-arm-kernel
On 05/03/16 at 11:23am, Pratyush Anand wrote:
> Hi Baoquan,
>
> On 03/05/2016:12:24:41 PM, Baoquan He wrote:
> > Hi Pratyush,
> >
> > Could you please help tell why arm PAE kernel can be put above 4G?
>
> PAE system can have physical addresses above 4G. So, if a CPU is supporting the
> LPAE page table format then we should be able to access physical addresses
> beyond 4G.
OK, after patient explanation from Pratush on irc, I finally understand on
arm LPAE there's PHYS_OFFSET which indicats the physical address of main
memory since arm could map some amount of device memory to cpu address space
below 4G. Then physical ram has to be started from above 4G form cpu
point of view. That's why kernel need be put above 4G. It's fair enough to
fix it in this patch. Certainly if this explanation is also added into
patch log, non arm developer will understand the change better.
Thanks
Baoquan
>
> > Since the change is related to common code, I am curious about how
> > it's so different with other ARCHs.
>
> paddr_vmcoreinfo_note() returns a physical address, so returning phys_addr_t
> seems most appropriate. So, kernel variable may land into above 4G locations,
> even with the platform in other architecture (with PAE support), if start of RAM
> is located very high,
>
> So, in my opinion it would be safer to have these changes for other ARCHs as
> well.
>
> ~Pratyush
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 50+ messages in thread
[parent not found: <20160503042441.GA2518-ejN7fcUYdH/by3iVrkZq2A@public.gmane.org>]
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
[not found] ` <20160503042441.GA2518-ejN7fcUYdH/by3iVrkZq2A@public.gmane.org>
@ 2016-05-03 10:12 ` Russell King - ARM Linux
2016-05-03 12:56 ` Baoquan He
0 siblings, 1 reply; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-05-03 10:12 UTC (permalink / raw)
To: Baoquan He
Cc: Pratyush Anand, Mark Rutland, devicetree-u79uwXL29TY76Z2rM5mHXA,
Ian Campbell, Tony Luck, linux-ia64-u79uwXL29TY76Z2rM5mHXA,
Pawel Moll, linux-doc-u79uwXL29TY76Z2rM5mHXA, Jonathan Corbet,
kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Fenghua Yu, Vivek Goyal,
Haren Myneni, Rob Herring, Eric Biederman, Santosh Shilimkar,
Kumar Gala, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On Tue, May 03, 2016 at 12:24:41PM +0800, Baoquan He wrote:
> Could you please help tell why arm PAE kernel can be put above 4G?
> Since the change is related to common code, I am curious about how
> it's so different with other ARCHs.
This is explained in the covering email to the series.
The explanation given by Pratyush was incomplete.
--
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-05-03 10:12 ` Russell King - ARM Linux
@ 2016-05-03 12:56 ` Baoquan He
0 siblings, 0 replies; 50+ messages in thread
From: Baoquan He @ 2016-05-03 12:56 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: Pratyush Anand, Mark Rutland, devicetree, Ian Campbell, Tony Luck,
linux-ia64, Pawel Moll, linux-doc, Jonathan Corbet, kexec,
Fenghua Yu, Vivek Goyal, Haren Myneni, Rob Herring,
Eric Biederman, Santosh Shilimkar, Kumar Gala, linux-arm-kernel
On 05/03/16 at 11:12am, Russell King - ARM Linux wrote:
> On Tue, May 03, 2016 at 12:24:41PM +0800, Baoquan He wrote:
> > Could you please help tell why arm PAE kernel can be put above 4G?
> > Since the change is related to common code, I am curious about how
> > it's so different with other ARCHs.
>
> This is explained in the covering email to the series.
>
> The explanation given by Pratyush was incomplete.
Yeah, he said non LPAE also has PHYS_OFFSET later to me. In fact this
patch is totally unharmful to other ARCHes, I just can't stand the
curiosity. Sorry about this.
>
> --
> RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
> FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
> according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-04-29 15:06 ` Pratyush Anand
2016-04-29 15:16 ` Mark Rutland
@ 2016-04-29 18:06 ` Russell King - ARM Linux
2016-04-30 3:30 ` Pratyush Anand
1 sibling, 1 reply; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-04-29 18:06 UTC (permalink / raw)
To: Pratyush Anand
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 08:36:43PM +0530, Pratyush Anand wrote:
> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
> <rmk+kernel@arm.linux.org.uk> wrote:
> > diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
> > index 152da4a48867..9f1920d2d0c6 100644
> > --- a/kernel/ksysfs.c
> > +++ b/kernel/ksysfs.c
> > @@ -128,8 +128,8 @@ KERNEL_ATTR_RW(kexec_crash_size);
> > static ssize_t vmcoreinfo_show(struct kobject *kobj,
> > struct kobj_attribute *attr, char *buf)
> > {
> > - return sprintf(buf, "%lx %x\n",
> > - paddr_vmcoreinfo_note(),
> > + phys_addr_t vmcore_base = paddr_vmcoreinfo_note();
> > + return sprintf(buf, "%pa %x\n", &vmcore_base,
>
> Why do we pass &vmcore_base? Shouldn't it be vmcore_base?
You seem to not know what the "%pa" format string means.
%p always takes a _pointer_ as per C standard, so the printf argument
must be a pointer. However, the kernel format strings are extended
with additional suffixes - in this case 'a', which means that we want
to print the contents of a _pointer_ to a phys_addr_t.
Full details in Documentation/printk-formats.txt in the kernel.
The code above is correct.
--
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t
2016-04-29 18:06 ` Russell King - ARM Linux
@ 2016-04-30 3:30 ` Pratyush Anand
0 siblings, 0 replies; 50+ messages in thread
From: Pratyush Anand @ 2016-04-30 3:30 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 11:36 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Fri, Apr 29, 2016 at 08:36:43PM +0530, Pratyush Anand wrote:
>> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
>> <rmk+kernel@arm.linux.org.uk> wrote:
>> > diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c
>> > index 152da4a48867..9f1920d2d0c6 100644
>> > --- a/kernel/ksysfs.c
>> > +++ b/kernel/ksysfs.c
>> > @@ -128,8 +128,8 @@ KERNEL_ATTR_RW(kexec_crash_size);
>> > static ssize_t vmcoreinfo_show(struct kobject *kobj,
>> > struct kobj_attribute *attr, char *buf)
>> > {
>> > - return sprintf(buf, "%lx %x\n",
>> > - paddr_vmcoreinfo_note(),
>> > + phys_addr_t vmcore_base = paddr_vmcoreinfo_note();
>> > + return sprintf(buf, "%pa %x\n", &vmcore_base,
>>
>> Why do we pass &vmcore_base? Shouldn't it be vmcore_base?
>
> You seem to not know what the "%pa" format string means.
Apologies, Yes, yes.. it was my negligence.
>
> %p always takes a _pointer_ as per C standard, so the printf argument
> must be a pointer. However, the kernel format strings are extended
> with additional suffixes - in this case 'a', which means that we want
> to print the contents of a _pointer_ to a phys_addr_t.
>
> Full details in Documentation/printk-formats.txt in the kernel.
Thanks for explaining :-)
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 11/12] kexec: allow architectures to override boot mapping
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (9 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 10/12] kexec: arrange for paddr_vmcoreinfo_note() to return phys_addr_t Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-29 15:14 ` Pratyush Anand
` (2 more replies)
2016-04-28 9:28 ` [PATCH 12/12] ARM: kexec: fix kexec for Keystone 2 Russell King
` (2 subsequent siblings)
13 siblings, 3 replies; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
kexec physical addresses are the boot-time view of the system. For
certain ARM systems (such as Keystone 2), the boot view of the system
does not match the kernel's view of the system: the boot view uses a
special alias in the lower 4GB of the physical address space.
To cater for these kinds of setups, we need to translate between the
boot view physical addresses and the normal kernel view physical
addresses. This patch extracts the current transation points into
linux/kexec.h, and allows an architecture to override the functions.
Due to the translations required, we unfortunately end up with six
translation functions, which are reduced down to four that the
architecture can override.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
include/linux/kexec.h | 38 ++++++++++++++++++++++++++++++++++++++
kernel/kexec.c | 3 ++-
kernel/kexec_core.c | 26 +++++++++++++-------------
3 files changed, 53 insertions(+), 14 deletions(-)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index 52a3a221bcb2..99cb9dac7909 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -318,6 +318,44 @@ int __weak arch_kexec_apply_relocations_add(const Elf_Ehdr *ehdr,
int __weak arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
unsigned int relsec);
+#ifndef page_to_boot_pfn
+static inline unsigned long page_to_boot_pfn(struct page *page)
+{
+ return page_to_pfn(page);
+}
+#endif
+
+#ifndef boot_pfn_to_page
+static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
+{
+ return pfn_to_page(boot_pfn);
+}
+#endif
+
+#ifndef phys_to_boot_phys
+static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
+{
+ return phys;
+}
+#endif
+
+#ifndef boot_phys_to_phys
+static inline phys_addr_t boot_phys_to_phys(unsigned long boot_phys)
+{
+ return boot_phys;
+}
+#endif
+
+static inline unsigned long virt_to_boot_phys(void *addr)
+{
+ return phys_to_boot_phys(__pa((unsigned long)addr));
+}
+
+static inline void *boot_phys_to_virt(unsigned long entry)
+{
+ return phys_to_virt(boot_phys_to_phys(entry));
+}
+
#else /* !CONFIG_KEXEC_CORE */
struct pt_regs;
struct task_struct;
diff --git a/kernel/kexec.c b/kernel/kexec.c
index ee70aef5cd81..dd49d572a5e2 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -48,7 +48,8 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
if (kexec_on_panic) {
/* Verify we have a valid entry point */
- if ((entry < crashk_res.start) || (entry > crashk_res.end))
+ if ((entry < phys_to_boot_phys(crashk_res.start)) ||
+ (entry > phys_to_boot_phys(crashk_res.end)))
return -EADDRNOTAVAIL;
}
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index f9847e5822e6..d04940ccc58d 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -229,8 +229,8 @@ int sanity_check_segment_list(struct kimage *image)
mstart = image->segment[i].mem;
mend = mstart + image->segment[i].memsz - 1;
/* Ensure we are within the crash kernel limits */
- if ((mstart < crashk_res.start) ||
- (mend > crashk_res.end))
+ if ((mstart < phys_to_boot_phys(crashk_res.start)) ||
+ (mend > phys_to_boot_phys(crashk_res.end)))
return result;
}
}
@@ -354,7 +354,7 @@ static struct page *kimage_alloc_normal_control_pages(struct kimage *image,
pages = kimage_alloc_pages(KEXEC_CONTROL_MEMORY_GFP, order);
if (!pages)
break;
- pfn = page_to_pfn(pages);
+ pfn = page_to_boot_pfn(pages);
epfn = pfn + count;
addr = pfn << PAGE_SHIFT;
eaddr = epfn << PAGE_SHIFT;
@@ -480,7 +480,7 @@ static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
return -ENOMEM;
ind_page = page_address(page);
- *image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
+ *image->entry = virt_to_boot_phys(ind_page) | IND_INDIRECTION;
image->entry = ind_page;
image->last_entry = ind_page +
((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
@@ -535,13 +535,13 @@ void kimage_terminate(struct kimage *image)
#define for_each_kimage_entry(image, ptr, entry) \
for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
ptr = (entry & IND_INDIRECTION) ? \
- phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
+ boot_phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
static void kimage_free_entry(kimage_entry_t entry)
{
struct page *page;
- page = pfn_to_page(entry >> PAGE_SHIFT);
+ page = boot_pfn_to_page(entry >> PAGE_SHIFT);
kimage_free_pages(page);
}
@@ -635,7 +635,7 @@ static struct page *kimage_alloc_page(struct kimage *image,
* have a match.
*/
list_for_each_entry(page, &image->dest_pages, lru) {
- addr = page_to_pfn(page) << PAGE_SHIFT;
+ addr = page_to_boot_pfn(page) << PAGE_SHIFT;
if (addr == destination) {
list_del(&page->lru);
return page;
@@ -650,12 +650,12 @@ static struct page *kimage_alloc_page(struct kimage *image,
if (!page)
return NULL;
/* If the page cannot be used file it away */
- if (page_to_pfn(page) >
+ if (page_to_boot_pfn(page) >
(KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
list_add(&page->lru, &image->unusable_pages);
continue;
}
- addr = page_to_pfn(page) << PAGE_SHIFT;
+ addr = page_to_boot_pfn(page) << PAGE_SHIFT;
/* If it is the destination page we want use it */
if (addr == destination)
@@ -678,7 +678,7 @@ static struct page *kimage_alloc_page(struct kimage *image,
struct page *old_page;
old_addr = *old & PAGE_MASK;
- old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
+ old_page = boot_pfn_to_page(old_addr >> PAGE_SHIFT);
copy_highpage(page, old_page);
*old = addr | (*old & ~PAGE_MASK);
@@ -734,7 +734,7 @@ static int kimage_load_normal_segment(struct kimage *image,
result = -ENOMEM;
goto out;
}
- result = kimage_add_page(image, page_to_pfn(page)
+ result = kimage_add_page(image, page_to_boot_pfn(page)
<< PAGE_SHIFT);
if (result < 0)
goto out;
@@ -795,7 +795,7 @@ static int kimage_load_crash_segment(struct kimage *image,
char *ptr;
size_t uchunk, mchunk;
- page = pfn_to_page(maddr >> PAGE_SHIFT);
+ page = boot_pfn_to_page(maddr >> PAGE_SHIFT);
if (!page) {
result = -ENOMEM;
goto out;
@@ -922,7 +922,7 @@ void __weak crash_free_reserved_phys_range(unsigned long begin,
unsigned long addr;
for (addr = begin; addr < end; addr += PAGE_SIZE)
- free_reserved_page(pfn_to_page(addr >> PAGE_SHIFT));
+ free_reserved_page(boot_pfn_to_page(addr >> PAGE_SHIFT));
}
int crash_shrink_memory(unsigned long new_size)
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 11/12] kexec: allow architectures to override boot mapping
2016-04-28 9:28 ` [PATCH 11/12] kexec: allow architectures to override boot mapping Russell King
@ 2016-04-29 15:14 ` Pratyush Anand
2016-04-29 18:08 ` Russell King - ARM Linux
2016-05-11 18:56 ` Russell King - ARM Linux
2016-05-12 6:26 ` Baoquan He
2 siblings, 1 reply; 50+ messages in thread
From: Pratyush Anand @ 2016-04-29 15:14 UTC (permalink / raw)
To: Russell King
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Thu, Apr 28, 2016 at 2:58 PM, Russell King
<rmk+kernel@arm.linux.org.uk> wrote:
> kexec physical addresses are the boot-time view of the system. For
> certain ARM systems (such as Keystone 2), the boot view of the system
> does not match the kernel's view of the system: the boot view uses a
> special alias in the lower 4GB of the physical address space.
>
> To cater for these kinds of setups, we need to translate between the
> boot view physical addresses and the normal kernel view physical
> addresses. This patch extracts the current transation points into
> linux/kexec.h, and allows an architecture to override the functions.
>
> Due to the translations required, we unfortunately end up with six
> translation functions, which are reduced down to four that the
> architecture can override.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
I must be missing something when I am thinking that, had we passed
arch_phys_to_idmap_offset to user space, this patch would not have
been needed, and things would have been more simpler. Please help me
to understand why passing arch_phys_to_idmap_offset to user space
would not be a good idea.
~Pratyush
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 11/12] kexec: allow architectures to override boot mapping
2016-04-29 15:14 ` Pratyush Anand
@ 2016-04-29 18:08 ` Russell King - ARM Linux
0 siblings, 0 replies; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-04-29 18:08 UTC (permalink / raw)
To: Pratyush Anand
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Fri, Apr 29, 2016 at 08:44:29PM +0530, Pratyush Anand wrote:
> On Thu, Apr 28, 2016 at 2:58 PM, Russell King
> <rmk+kernel@arm.linux.org.uk> wrote:
> > kexec physical addresses are the boot-time view of the system. For
> > certain ARM systems (such as Keystone 2), the boot view of the system
> > does not match the kernel's view of the system: the boot view uses a
> > special alias in the lower 4GB of the physical address space.
> >
> > To cater for these kinds of setups, we need to translate between the
> > boot view physical addresses and the normal kernel view physical
> > addresses. This patch extracts the current transation points into
> > linux/kexec.h, and allows an architecture to override the functions.
> >
> > Due to the translations required, we unfortunately end up with six
> > translation functions, which are reduced down to four that the
> > architecture can override.
> >
> > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
>
> I must be missing something when I am thinking that, had we passed
> arch_phys_to_idmap_offset to user space, this patch would not have
> been needed, and things would have been more simpler. Please help me
> to understand why passing arch_phys_to_idmap_offset to user space
> would not be a good idea.
Sorry, I disagree.
Even if we thought that passing the offset to userspace would be a
good idea, it does nothing to solve each site in this patch. This
patch would still be necessary.
--
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 11/12] kexec: allow architectures to override boot mapping
2016-04-28 9:28 ` [PATCH 11/12] kexec: allow architectures to override boot mapping Russell King
2016-04-29 15:14 ` Pratyush Anand
@ 2016-05-11 18:56 ` Russell King - ARM Linux
2016-05-12 6:26 ` Baoquan He
2 siblings, 0 replies; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-05-11 18:56 UTC (permalink / raw)
To: linux-arm-kernel
Cc: Mark Rutland, devicetree, Tony Luck, linux-ia64, linux-doc,
Pawel Moll, Jonathan Corbet, Ian Campbell, kexec, Fenghua Yu,
Haren Myneni, Rob Herring, Eric Biederman, Santosh Shilimkar,
Kumar Gala, Vivek Goyal
I was going to send the patches to Andrew, but then I noticed this
one has received no acks. What's the situation for this patch?
On Thu, Apr 28, 2016 at 10:28:40AM +0100, Russell King wrote:
> kexec physical addresses are the boot-time view of the system. For
> certain ARM systems (such as Keystone 2), the boot view of the system
> does not match the kernel's view of the system: the boot view uses a
> special alias in the lower 4GB of the physical address space.
>
> To cater for these kinds of setups, we need to translate between the
> boot view physical addresses and the normal kernel view physical
> addresses. This patch extracts the current transation points into
> linux/kexec.h, and allows an architecture to override the functions.
>
> Due to the translations required, we unfortunately end up with six
> translation functions, which are reduced down to four that the
> architecture can override.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
> include/linux/kexec.h | 38 ++++++++++++++++++++++++++++++++++++++
> kernel/kexec.c | 3 ++-
> kernel/kexec_core.c | 26 +++++++++++++-------------
> 3 files changed, 53 insertions(+), 14 deletions(-)
>
> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> index 52a3a221bcb2..99cb9dac7909 100644
> --- a/include/linux/kexec.h
> +++ b/include/linux/kexec.h
> @@ -318,6 +318,44 @@ int __weak arch_kexec_apply_relocations_add(const Elf_Ehdr *ehdr,
> int __weak arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
> unsigned int relsec);
>
> +#ifndef page_to_boot_pfn
> +static inline unsigned long page_to_boot_pfn(struct page *page)
> +{
> + return page_to_pfn(page);
> +}
> +#endif
> +
> +#ifndef boot_pfn_to_page
> +static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
> +{
> + return pfn_to_page(boot_pfn);
> +}
> +#endif
> +
> +#ifndef phys_to_boot_phys
> +static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
> +{
> + return phys;
> +}
> +#endif
> +
> +#ifndef boot_phys_to_phys
> +static inline phys_addr_t boot_phys_to_phys(unsigned long boot_phys)
> +{
> + return boot_phys;
> +}
> +#endif
> +
> +static inline unsigned long virt_to_boot_phys(void *addr)
> +{
> + return phys_to_boot_phys(__pa((unsigned long)addr));
> +}
> +
> +static inline void *boot_phys_to_virt(unsigned long entry)
> +{
> + return phys_to_virt(boot_phys_to_phys(entry));
> +}
> +
> #else /* !CONFIG_KEXEC_CORE */
> struct pt_regs;
> struct task_struct;
> diff --git a/kernel/kexec.c b/kernel/kexec.c
> index ee70aef5cd81..dd49d572a5e2 100644
> --- a/kernel/kexec.c
> +++ b/kernel/kexec.c
> @@ -48,7 +48,8 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
>
> if (kexec_on_panic) {
> /* Verify we have a valid entry point */
> - if ((entry < crashk_res.start) || (entry > crashk_res.end))
> + if ((entry < phys_to_boot_phys(crashk_res.start)) ||
> + (entry > phys_to_boot_phys(crashk_res.end)))
> return -EADDRNOTAVAIL;
> }
>
> diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
> index f9847e5822e6..d04940ccc58d 100644
> --- a/kernel/kexec_core.c
> +++ b/kernel/kexec_core.c
> @@ -229,8 +229,8 @@ int sanity_check_segment_list(struct kimage *image)
> mstart = image->segment[i].mem;
> mend = mstart + image->segment[i].memsz - 1;
> /* Ensure we are within the crash kernel limits */
> - if ((mstart < crashk_res.start) ||
> - (mend > crashk_res.end))
> + if ((mstart < phys_to_boot_phys(crashk_res.start)) ||
> + (mend > phys_to_boot_phys(crashk_res.end)))
> return result;
> }
> }
> @@ -354,7 +354,7 @@ static struct page *kimage_alloc_normal_control_pages(struct kimage *image,
> pages = kimage_alloc_pages(KEXEC_CONTROL_MEMORY_GFP, order);
> if (!pages)
> break;
> - pfn = page_to_pfn(pages);
> + pfn = page_to_boot_pfn(pages);
> epfn = pfn + count;
> addr = pfn << PAGE_SHIFT;
> eaddr = epfn << PAGE_SHIFT;
> @@ -480,7 +480,7 @@ static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
> return -ENOMEM;
>
> ind_page = page_address(page);
> - *image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
> + *image->entry = virt_to_boot_phys(ind_page) | IND_INDIRECTION;
> image->entry = ind_page;
> image->last_entry = ind_page +
> ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
> @@ -535,13 +535,13 @@ void kimage_terminate(struct kimage *image)
> #define for_each_kimage_entry(image, ptr, entry) \
> for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
> ptr = (entry & IND_INDIRECTION) ? \
> - phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
> + boot_phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
>
> static void kimage_free_entry(kimage_entry_t entry)
> {
> struct page *page;
>
> - page = pfn_to_page(entry >> PAGE_SHIFT);
> + page = boot_pfn_to_page(entry >> PAGE_SHIFT);
> kimage_free_pages(page);
> }
>
> @@ -635,7 +635,7 @@ static struct page *kimage_alloc_page(struct kimage *image,
> * have a match.
> */
> list_for_each_entry(page, &image->dest_pages, lru) {
> - addr = page_to_pfn(page) << PAGE_SHIFT;
> + addr = page_to_boot_pfn(page) << PAGE_SHIFT;
> if (addr == destination) {
> list_del(&page->lru);
> return page;
> @@ -650,12 +650,12 @@ static struct page *kimage_alloc_page(struct kimage *image,
> if (!page)
> return NULL;
> /* If the page cannot be used file it away */
> - if (page_to_pfn(page) >
> + if (page_to_boot_pfn(page) >
> (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
> list_add(&page->lru, &image->unusable_pages);
> continue;
> }
> - addr = page_to_pfn(page) << PAGE_SHIFT;
> + addr = page_to_boot_pfn(page) << PAGE_SHIFT;
>
> /* If it is the destination page we want use it */
> if (addr == destination)
> @@ -678,7 +678,7 @@ static struct page *kimage_alloc_page(struct kimage *image,
> struct page *old_page;
>
> old_addr = *old & PAGE_MASK;
> - old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
> + old_page = boot_pfn_to_page(old_addr >> PAGE_SHIFT);
> copy_highpage(page, old_page);
> *old = addr | (*old & ~PAGE_MASK);
>
> @@ -734,7 +734,7 @@ static int kimage_load_normal_segment(struct kimage *image,
> result = -ENOMEM;
> goto out;
> }
> - result = kimage_add_page(image, page_to_pfn(page)
> + result = kimage_add_page(image, page_to_boot_pfn(page)
> << PAGE_SHIFT);
> if (result < 0)
> goto out;
> @@ -795,7 +795,7 @@ static int kimage_load_crash_segment(struct kimage *image,
> char *ptr;
> size_t uchunk, mchunk;
>
> - page = pfn_to_page(maddr >> PAGE_SHIFT);
> + page = boot_pfn_to_page(maddr >> PAGE_SHIFT);
> if (!page) {
> result = -ENOMEM;
> goto out;
> @@ -922,7 +922,7 @@ void __weak crash_free_reserved_phys_range(unsigned long begin,
> unsigned long addr;
>
> for (addr = begin; addr < end; addr += PAGE_SIZE)
> - free_reserved_page(pfn_to_page(addr >> PAGE_SHIFT));
> + free_reserved_page(boot_pfn_to_page(addr >> PAGE_SHIFT));
> }
>
> int crash_shrink_memory(unsigned long new_size)
> --
> 2.1.0
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 11/12] kexec: allow architectures to override boot mapping
2016-04-28 9:28 ` [PATCH 11/12] kexec: allow architectures to override boot mapping Russell King
2016-04-29 15:14 ` Pratyush Anand
2016-05-11 18:56 ` Russell King - ARM Linux
@ 2016-05-12 6:26 ` Baoquan He
2016-05-12 8:22 ` Russell King - ARM Linux
2 siblings, 1 reply; 50+ messages in thread
From: Baoquan He @ 2016-05-12 6:26 UTC (permalink / raw)
To: Russell King
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On 04/28/16 at 10:28am, Russell King wrote:
> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> index 52a3a221bcb2..99cb9dac7909 100644
> --- a/include/linux/kexec.h
> +++ b/include/linux/kexec.h
> @@ -318,6 +318,44 @@ int __weak arch_kexec_apply_relocations_add(const Elf_Ehdr *ehdr,
> int __weak arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
> unsigned int relsec);
>
> +#ifndef page_to_boot_pfn
> +static inline unsigned long page_to_boot_pfn(struct page *page)
> +{
> + return page_to_pfn(page);
> +}
> +#endif
I am thinking if it's appropriate to introduce a new concept which only
exists in a certain system of a certain ARCH. Is it unavoidable? If have
to can we name it as kexec_page_to_pfn/kexec_pfn_to_page, etc? People
might not need to know about boot view physical address and kernel view
physical address things when they just want to understand kexec
implementation related to one ARCH except of ARM, even related to ARM
but not Keystone 2.
> +
> +#ifndef boot_pfn_to_page
> +static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
> +{
> + return pfn_to_page(boot_pfn);
> +}
> +#endif
> +
> +#ifndef phys_to_boot_phys
> +static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
> +{
> + return phys;
> +}
> +#endif
> +
> +#ifndef boot_phys_to_phys
> +static inline phys_addr_t boot_phys_to_phys(unsigned long boot_phys)
> +{
> + return boot_phys;
> +}
> +#endif
> +
> +static inline unsigned long virt_to_boot_phys(void *addr)
> +{
> + return phys_to_boot_phys(__pa((unsigned long)addr));
> +}
> +
> +static inline void *boot_phys_to_virt(unsigned long entry)
> +{
> + return phys_to_virt(boot_phys_to_phys(entry));
> +}
> +
> #else /* !CONFIG_KEXEC_CORE */
> struct pt_regs;
> struct task_struct;
> diff --git a/kernel/kexec.c b/kernel/kexec.c
> index ee70aef5cd81..dd49d572a5e2 100644
> --- a/kernel/kexec.c
> +++ b/kernel/kexec.c
> @@ -48,7 +48,8 @@ static int kimage_alloc_init(struct kimage **rimage, unsigned long entry,
>
> if (kexec_on_panic) {
> /* Verify we have a valid entry point */
> - if ((entry < crashk_res.start) || (entry > crashk_res.end))
> + if ((entry < phys_to_boot_phys(crashk_res.start)) ||
> + (entry > phys_to_boot_phys(crashk_res.end)))
> return -EADDRNOTAVAIL;
> }
>
> diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
> index f9847e5822e6..d04940ccc58d 100644
> --- a/kernel/kexec_core.c
> +++ b/kernel/kexec_core.c
> @@ -229,8 +229,8 @@ int sanity_check_segment_list(struct kimage *image)
> mstart = image->segment[i].mem;
> mend = mstart + image->segment[i].memsz - 1;
> /* Ensure we are within the crash kernel limits */
> - if ((mstart < crashk_res.start) ||
> - (mend > crashk_res.end))
> + if ((mstart < phys_to_boot_phys(crashk_res.start)) ||
> + (mend > phys_to_boot_phys(crashk_res.end)))
> return result;
> }
> }
> @@ -354,7 +354,7 @@ static struct page *kimage_alloc_normal_control_pages(struct kimage *image,
> pages = kimage_alloc_pages(KEXEC_CONTROL_MEMORY_GFP, order);
> if (!pages)
> break;
> - pfn = page_to_pfn(pages);
> + pfn = page_to_boot_pfn(pages);
> epfn = pfn + count;
> addr = pfn << PAGE_SHIFT;
> eaddr = epfn << PAGE_SHIFT;
> @@ -480,7 +480,7 @@ static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
> return -ENOMEM;
>
> ind_page = page_address(page);
> - *image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
> + *image->entry = virt_to_boot_phys(ind_page) | IND_INDIRECTION;
> image->entry = ind_page;
> image->last_entry = ind_page +
> ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
> @@ -535,13 +535,13 @@ void kimage_terminate(struct kimage *image)
> #define for_each_kimage_entry(image, ptr, entry) \
> for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
> ptr = (entry & IND_INDIRECTION) ? \
> - phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
> + boot_phys_to_virt((entry & PAGE_MASK)) : ptr + 1)
>
> static void kimage_free_entry(kimage_entry_t entry)
> {
> struct page *page;
>
> - page = pfn_to_page(entry >> PAGE_SHIFT);
> + page = boot_pfn_to_page(entry >> PAGE_SHIFT);
> kimage_free_pages(page);
> }
>
> @@ -635,7 +635,7 @@ static struct page *kimage_alloc_page(struct kimage *image,
> * have a match.
> */
> list_for_each_entry(page, &image->dest_pages, lru) {
> - addr = page_to_pfn(page) << PAGE_SHIFT;
> + addr = page_to_boot_pfn(page) << PAGE_SHIFT;
> if (addr == destination) {
> list_del(&page->lru);
> return page;
> @@ -650,12 +650,12 @@ static struct page *kimage_alloc_page(struct kimage *image,
> if (!page)
> return NULL;
> /* If the page cannot be used file it away */
> - if (page_to_pfn(page) >
> + if (page_to_boot_pfn(page) >
> (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
> list_add(&page->lru, &image->unusable_pages);
> continue;
> }
> - addr = page_to_pfn(page) << PAGE_SHIFT;
> + addr = page_to_boot_pfn(page) << PAGE_SHIFT;
>
> /* If it is the destination page we want use it */
> if (addr == destination)
> @@ -678,7 +678,7 @@ static struct page *kimage_alloc_page(struct kimage *image,
> struct page *old_page;
>
> old_addr = *old & PAGE_MASK;
> - old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
> + old_page = boot_pfn_to_page(old_addr >> PAGE_SHIFT);
> copy_highpage(page, old_page);
> *old = addr | (*old & ~PAGE_MASK);
>
> @@ -734,7 +734,7 @@ static int kimage_load_normal_segment(struct kimage *image,
> result = -ENOMEM;
> goto out;
> }
> - result = kimage_add_page(image, page_to_pfn(page)
> + result = kimage_add_page(image, page_to_boot_pfn(page)
> << PAGE_SHIFT);
> if (result < 0)
> goto out;
> @@ -795,7 +795,7 @@ static int kimage_load_crash_segment(struct kimage *image,
> char *ptr;
> size_t uchunk, mchunk;
>
> - page = pfn_to_page(maddr >> PAGE_SHIFT);
> + page = boot_pfn_to_page(maddr >> PAGE_SHIFT);
> if (!page) {
> result = -ENOMEM;
> goto out;
> @@ -922,7 +922,7 @@ void __weak crash_free_reserved_phys_range(unsigned long begin,
> unsigned long addr;
>
> for (addr = begin; addr < end; addr += PAGE_SIZE)
> - free_reserved_page(pfn_to_page(addr >> PAGE_SHIFT));
> + free_reserved_page(boot_pfn_to_page(addr >> PAGE_SHIFT));
> }
>
> int crash_shrink_memory(unsigned long new_size)
> --
> 2.1.0
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 11/12] kexec: allow architectures to override boot mapping
2016-05-12 6:26 ` Baoquan He
@ 2016-05-12 8:22 ` Russell King - ARM Linux
0 siblings, 0 replies; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-05-12 8:22 UTC (permalink / raw)
To: Baoquan He, Eric Biederman
Cc: Mark Rutland, devicetree, Ian Campbell, Tony Luck, linux-ia64,
Pawel Moll, linux-doc, Jonathan Corbet, kexec, Fenghua Yu,
Vivek Goyal, Haren Myneni, Rob Herring, Santosh Shilimkar,
Kumar Gala, linux-arm-kernel
On Thu, May 12, 2016 at 02:26:27PM +0800, Baoquan He wrote:
> On 04/28/16 at 10:28am, Russell King wrote:
> > diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> > index 52a3a221bcb2..99cb9dac7909 100644
> > --- a/include/linux/kexec.h
> > +++ b/include/linux/kexec.h
> > @@ -318,6 +318,44 @@ int __weak arch_kexec_apply_relocations_add(const Elf_Ehdr *ehdr,
> > int __weak arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
> > unsigned int relsec);
> >
> > +#ifndef page_to_boot_pfn
> > +static inline unsigned long page_to_boot_pfn(struct page *page)
> > +{
> > + return page_to_pfn(page);
> > +}
> > +#endif
>
> I am thinking if it's appropriate to introduce a new concept which only
> exists in a certain system of a certain ARCH. Is it unavoidable? If have
> to can we name it as kexec_page_to_pfn/kexec_pfn_to_page, etc? People
> might not need to know about boot view physical address and kernel view
> physical address things when they just want to understand kexec
> implementation related to one ARCH except of ARM, even related to ARM
> but not Keystone 2.
Well, what do you suggest we do instead?
Eric, please get involved in this discussion, as this was your idea.
--
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* [PATCH 12/12] ARM: kexec: fix kexec for Keystone 2
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (10 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 11/12] kexec: allow architectures to override boot mapping Russell King
@ 2016-04-28 9:28 ` Russell King
2016-04-28 23:04 ` [PATCH 00/12] Fixing TI Keystone2 kexec Simon Horman
2016-05-11 8:29 ` Dave Young
13 siblings, 0 replies; 50+ messages in thread
From: Russell King @ 2016-04-28 9:28 UTC (permalink / raw)
To: linux-arm-kernel
Cc: devicetree, Eric Biederman, Fenghua Yu, Haren Myneni,
Ian Campbell, Jonathan Corbet, kexec, Kumar Gala, linux-doc,
linux-ia64, Mark Rutland, Pawel Moll, Rob Herring,
Santosh Shilimkar, Tony Luck, Vivek Goyal
Provide kexec with the boot view of memory by overriding the normal
kexec translation functions added in a previous patch. We also need
to fix a call to memblock in machine_kexec_prepare() so that we
provide it with a running-view physical address rather than a boot-
view physical address.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
arch/arm/include/asm/kexec.h | 24 ++++++++++++++++++++++++
arch/arm/kernel/machine_kexec.c | 2 +-
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/kexec.h b/arch/arm/include/asm/kexec.h
index c2b9b4bdec00..1869af6bac5c 100644
--- a/arch/arm/include/asm/kexec.h
+++ b/arch/arm/include/asm/kexec.h
@@ -53,6 +53,30 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
/* Function pointer to optional machine-specific reinitialization */
extern void (*kexec_reinit)(void);
+static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
+{
+ return phys_to_idmap(phys);
+}
+#define phys_to_boot_phys phys_to_boot_phys
+
+static inline phys_addr_t boot_phys_to_phys(unsigned long entry)
+{
+ return idmap_to_phys(entry);
+}
+#define boot_phys_to_phys boot_phys_to_phys
+
+static inline unsigned long page_to_boot_pfn(struct page *page)
+{
+ return page_to_pfn(page) + (arch_phys_to_idmap_offset >> PAGE_SHIFT);
+}
+#define page_to_boot_pfn page_to_boot_pfn
+
+static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
+{
+ return pfn_to_page(boot_pfn - (arch_phys_to_idmap_offset >> PAGE_SHIFT));
+}
+#define boot_pfn_to_page boot_pfn_to_page
+
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_KEXEC */
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c
index 59fd0e24c56b..b18c1ea56bed 100644
--- a/arch/arm/kernel/machine_kexec.c
+++ b/arch/arm/kernel/machine_kexec.c
@@ -57,7 +57,7 @@ int machine_kexec_prepare(struct kimage *image)
for (i = 0; i < image->nr_segments; i++) {
current_segment = &image->segment[i];
- if (!memblock_is_region_memory(current_segment->mem,
+ if (!memblock_is_region_memory(idmap_to_phys(current_segment->mem),
current_segment->memsz))
return -EINVAL;
--
2.1.0
^ permalink raw reply related [flat|nested] 50+ messages in thread
* Re: [PATCH 00/12] Fixing TI Keystone2 kexec
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (11 preceding siblings ...)
2016-04-28 9:28 ` [PATCH 12/12] ARM: kexec: fix kexec for Keystone 2 Russell King
@ 2016-04-28 23:04 ` Simon Horman
2016-05-11 8:29 ` Dave Young
13 siblings, 0 replies; 50+ messages in thread
From: Simon Horman @ 2016-04-28 23:04 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
Hi Russell,
On Thu, Apr 28, 2016 at 10:26:44AM +0100, Russell King - ARM Linux wrote:
> These changes are required for TI Keystone2 kexec to be functional. TI
> Keystone2 has the run-time view of physical memory above 4GiB, but with
> a boot time alias below 4GiB which can only be used during the early
> boot.
>
> This means we need to translate run-time physical addresses (which the
> kernel uses) to boot-time physical addresses, which, having discussed
> with Eric, is what the kexec tools and kexec kernel API requires.
>
> We publish a special set of boot time resources in /proc/iomem, which
> the (modified) kexec tools look for in preference to the normal resources.
> Hence, if these are found, the kexec tools make use of these resources,
> and thus kexec tools use the boot-time view of physical memory.
>
> The first three patches have been sitting in linux-next for a while.
> I'm going to put the next ARM specific three into linux-next next week.
>
> I've sent Eric over a month ago all the patches, including the kexec
> tools patches, but I've heard nothing back. I'm at a loss how to
> make progress on these patches - and as I'm being hassled about this,
> I'm going to be hassling the community about it, possibly with regular
> re-posts until there is some progress.
My experience is that usually Andrew Morton takes kexec patches
and that this has been the situation for many years now.
With regards to any kexec-tools patches that are appropriate for upstream:
please send them to the kexec mailing list with me CCed and I will see
about including them in the next release. If you have done so already then
I apologise for having missed them.
> Documentation/kdump/kdump.txt | 13 ++------
> arch/arm/boot/dts/keystone.dtsi | 8 +++++
> arch/arm/include/asm/kexec.h | 24 +++++++++++++++
> arch/arm/include/asm/memory.h | 38 ++++++++++++++++++-----
> arch/arm/kernel/machine_kexec.c | 2 +-
> arch/arm/kernel/setup.c | 65 +++++++++++++++++++++++++++++++++++++--
> arch/arm/mach-keystone/keystone.c | 7 +----
> arch/arm/mm/idmap.c | 2 +-
> arch/ia64/kernel/machine_kexec.c | 2 +-
> include/linux/kexec.h | 42 +++++++++++++++++++++++--
> kernel/kexec.c | 3 +-
> kernel/kexec_core.c | 30 +++++++++---------
> kernel/ksysfs.c | 4 +--
> 13 files changed, 193 insertions(+), 47 deletions(-)
>
> --
> RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
> FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
> according to speedtest.net.
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 00/12] Fixing TI Keystone2 kexec
2016-04-28 9:26 [PATCH 00/12] Fixing TI Keystone2 kexec Russell King - ARM Linux
` (12 preceding siblings ...)
2016-04-28 23:04 ` [PATCH 00/12] Fixing TI Keystone2 kexec Simon Horman
@ 2016-05-11 8:29 ` Dave Young
2016-05-11 8:52 ` Russell King - ARM Linux
13 siblings, 1 reply; 50+ messages in thread
From: Dave Young @ 2016-05-11 8:29 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
Hi, Russell
On 04/28/16 at 10:26am, Russell King - ARM Linux wrote:
> These changes are required for TI Keystone2 kexec to be functional. TI
> Keystone2 has the run-time view of physical memory above 4GiB, but with
> a boot time alias below 4GiB which can only be used during the early
> boot.
>
> This means we need to translate run-time physical addresses (which the
> kernel uses) to boot-time physical addresses, which, having discussed
> with Eric, is what the kexec tools and kexec kernel API requires.
>
> We publish a special set of boot time resources in /proc/iomem, which
> the (modified) kexec tools look for in preference to the normal resources.
> Hence, if these are found, the kexec tools make use of these resources,
> and thus kexec tools use the boot-time view of physical memory.
I think getting memory ranges from device tree will be better than
adding more stuff to /proc/iomem. Geoff's arm64 kexec patches is using dtb
you can refer to the patchset.
Thanks
Dave
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 00/12] Fixing TI Keystone2 kexec
2016-05-11 8:29 ` Dave Young
@ 2016-05-11 8:52 ` Russell King - ARM Linux
2016-05-11 9:13 ` Dave Young
0 siblings, 1 reply; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-05-11 8:52 UTC (permalink / raw)
To: Dave Young
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Wed, May 11, 2016 at 04:29:23PM +0800, Dave Young wrote:
> Hi, Russell
>
> On 04/28/16 at 10:26am, Russell King - ARM Linux wrote:
> > These changes are required for TI Keystone2 kexec to be functional. TI
> > Keystone2 has the run-time view of physical memory above 4GiB, but with
> > a boot time alias below 4GiB which can only be used during the early
> > boot.
> >
> > This means we need to translate run-time physical addresses (which the
> > kernel uses) to boot-time physical addresses, which, having discussed
> > with Eric, is what the kexec tools and kexec kernel API requires.
> >
> > We publish a special set of boot time resources in /proc/iomem, which
> > the (modified) kexec tools look for in preference to the normal resources.
> > Hence, if these are found, the kexec tools make use of these resources,
> > and thus kexec tools use the boot-time view of physical memory.
>
> I think getting memory ranges from device tree will be better than
> adding more stuff to /proc/iomem. Geoff's arm64 kexec patches is using dtb
> you can refer to the patchset.
I think you're confusing things. DT doesn't contain the boot alias
memory ranges - it's not a separate chunk of memory. It's an alias
of the same physical address space found higher in the physical
address range.
If we put it in DT, then we need a way to also describe that it is an
alias of some other bit of physical memory.
--
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 00/12] Fixing TI Keystone2 kexec
2016-05-11 8:52 ` Russell King - ARM Linux
@ 2016-05-11 9:13 ` Dave Young
2016-05-11 9:32 ` Russell King - ARM Linux
0 siblings, 1 reply; 50+ messages in thread
From: Dave Young @ 2016-05-11 9:13 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On 05/11/16 at 09:52am, Russell King - ARM Linux wrote:
> On Wed, May 11, 2016 at 04:29:23PM +0800, Dave Young wrote:
> > Hi, Russell
> >
> > On 04/28/16 at 10:26am, Russell King - ARM Linux wrote:
> > > These changes are required for TI Keystone2 kexec to be functional. TI
> > > Keystone2 has the run-time view of physical memory above 4GiB, but with
> > > a boot time alias below 4GiB which can only be used during the early
> > > boot.
> > >
> > > This means we need to translate run-time physical addresses (which the
> > > kernel uses) to boot-time physical addresses, which, having discussed
> > > with Eric, is what the kexec tools and kexec kernel API requires.
> > >
> > > We publish a special set of boot time resources in /proc/iomem, which
> > > the (modified) kexec tools look for in preference to the normal resources.
> > > Hence, if these are found, the kexec tools make use of these resources,
> > > and thus kexec tools use the boot-time view of physical memory.
> >
> > I think getting memory ranges from device tree will be better than
> > adding more stuff to /proc/iomem. Geoff's arm64 kexec patches is using dtb
> > you can refer to the patchset.
>
> I think you're confusing things. DT doesn't contain the boot alias
> memory ranges - it's not a separate chunk of memory. It's an alias
> of the same physical address space found higher in the physical
> address range.
Hmm, if we forget about kexec how does the 1st kernel get boot memory?
not from DT?
>
> If we put it in DT, then we need a way to also describe that it is an
> alias of some other bit of physical memory.
I may missed the background, I just want kexec to get infomation just like
the normal kernel.
>
> --
> RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
> FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
> according to speedtest.net.
Thanks
Dave
^ permalink raw reply [flat|nested] 50+ messages in thread
* Re: [PATCH 00/12] Fixing TI Keystone2 kexec
2016-05-11 9:13 ` Dave Young
@ 2016-05-11 9:32 ` Russell King - ARM Linux
[not found] ` <20160511093255.GO19428-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
0 siblings, 1 reply; 50+ messages in thread
From: Russell King - ARM Linux @ 2016-05-11 9:32 UTC (permalink / raw)
To: Dave Young
Cc: linux-arm-kernel, Mark Rutland, devicetree, Tony Luck, linux-ia64,
linux-doc, Pawel Moll, Jonathan Corbet, Ian Campbell, kexec,
Fenghua Yu, Haren Myneni, Rob Herring, Eric Biederman,
Santosh Shilimkar, Kumar Gala, Vivek Goyal
On Wed, May 11, 2016 at 05:13:38PM +0800, Dave Young wrote:
> On 05/11/16 at 09:52am, Russell King - ARM Linux wrote:
> > I think you're confusing things. DT doesn't contain the boot alias
> > memory ranges - it's not a separate chunk of memory. It's an alias
> > of the same physical address space found higher in the physical
> > address range.
>
> Hmm, if we forget about kexec how does the 1st kernel get boot memory?
> not from DT?
Just like any other ARM system, it pulls itself up by its shoe laces.
The kernel assumes that it has been placed into RAM with at least 32KiB
of writable memory below it, which it uses for the initial page tables.
It "guesses" that the executing address, rounded down to I-forget-what-
boundary gives the base address of physical memory.
It sets the page table up using that assumption. The kernel gets going
with C code, and only _then_ parses the DTB.
If we then find that we're running on TI Keystone 2, part of the early
platform initialisation specifies to the ARM core code that the kernel
is to switch a high physical address space > 4GiB, and this provokes
a "dance" where we tear the MMU back down, run some more assembly code
to fix up the page tables, and re-initialise the MMU before returning
to the kernel C code, this time running in the high physical address
space. This break-modify-make is an architecture requirement. We
also record the physical address delta between the original physical
address space and the high physical address space so that we can reverse
the translation for code which needs identity mapping (eg, SMP bringup.)
The DTB only contains the high physical address space memory information,
and the kernel now parses the DTB, and sets the page tables up properly
for the running system.
> > If we put it in DT, then we need a way to also describe that it is an
> > alias of some other bit of physical memory.
>
> I may missed the background, I just want kexec to get infomation just like
> the normal kernel.
See above. What you're asking for isn't really possible.
--
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
^ permalink raw reply [flat|nested] 50+ messages in thread