diff mbox series

arm: export memblock_reserve()d regions via /proc/iomem

Message ID 1569070969-5168-1-git-send-email-33988979@163.com (mailing list archive)
State New, archived
Headers show
Series arm: export memblock_reserve()d regions via /proc/iomem | expand

Commit Message

Yu Chen Sept. 21, 2019, 1:02 p.m. UTC
From: Yu Chen <yu.chen3@zte.com.cn>

memblock reserved regions are not reported via /proc/iomem on ARM, kexec's
user-space doesn't know about memblock_reserve()d regions and thus
possible for kexec to overwrite with the new kernel or initrd.

[    0.000000] Booting Linux on physical CPU 0xf00
[    0.000000] Linux version 4.9.115-rt93-dirty (yuchen@localhost.localdomain) (gcc version 6.2.0 (ZTE Embsys-TSP V3.07.2
0) ) #62 SMP PREEMPT Fri Sep 20 10:39:29 CST 2019
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=30c5387d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt:Machine model: LS1021A TWR Board
[    0.000000] INITRD: 0x80f7f000+0x03695e40 overlaps in-use memory region - disabling initrd

Signed-off-by: Yu Chen <yu.chen3@zte.com.cn>
Reviewed-by: Junhua Huang <huang.junhua@zte.com.cn>
---
 arch/arm/kernel/setup.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

Comments

Russell King (Oracle) Sept. 21, 2019, 2:51 p.m. UTC | #1
On Sat, Sep 21, 2019 at 09:02:49PM +0800, Yu Chen wrote:
> From: Yu Chen <yu.chen3@zte.com.cn>
> 
> memblock reserved regions are not reported via /proc/iomem on ARM, kexec's
> user-space doesn't know about memblock_reserve()d regions and thus
> possible for kexec to overwrite with the new kernel or initrd.

Many reserved regions come from the kernel allocating memory during
boot.  We don't want to prevent kexec re-using those regions.

> [    0.000000] Booting Linux on physical CPU 0xf00
> [    0.000000] Linux version 4.9.115-rt93-dirty (yuchen@localhost.localdomain) (gcc version 6.2.0 (ZTE Embsys-TSP V3.07.2
> 0) ) #62 SMP PREEMPT Fri Sep 20 10:39:29 CST 2019
> [    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=30c5387d
> [    0.000000] CPU: div instructions available: patching division code
> [    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
> [    0.000000] OF: fdt:Machine model: LS1021A TWR Board
> [    0.000000] INITRD: 0x80f7f000+0x03695e40 overlaps in-use memory region - disabling initrd

Is the overlapping region one that is marked as reserved in DT?
Where is the reserved region that overlaps the initrd coming from?

Thanks.
kernel test robot Sept. 22, 2019, 8:36 a.m. UTC | #2
Hi Yu,

I love your patch! Yet something to improve:

[auto build test ERROR on arm/for-next]
[cannot apply to v5.3 next-20190920]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Yu-Chen/arm-export-memblock_reserve-d-regions-via-proc-iomem/20190921-214007
base:   git://git.armlinux.org.uk/~rmk/linux-arm.git for-next
config: arm-ixp4xx_defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=arm 
:::::: branch date: 3 hours ago
:::::: commit date: 3 hours ago

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   arch/arm/kernel/setup.c: In function 'reserve_memblock_reserved_regions':
>> arch/arm/kernel/setup.c:918:18: error: 'num_standard_resources' undeclared (first use in this function); did you mean 'request_standard_resources'?
     for (i = 0; i < num_standard_resources; ++i) {
                     ^~~~~~~~~~~~~~~~~~~~~~
                     request_standard_resources
   arch/arm/kernel/setup.c:918:18: note: each undeclared identifier is reported only once for each function it appears in
>> arch/arm/kernel/setup.c:919:27: error: 'standard_resources' undeclared (first use in this function); did you mean 'num_standard_resources'?
      struct resource *mem = &standard_resources[i];
                              ^~~~~~~~~~~~~~~~~~
                              num_standard_resources

# https://github.com/0day-ci/linux/commit/4d551f57b6f9f07cdff5690f541f76e78c656c68
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout 4d551f57b6f9f07cdff5690f541f76e78c656c68
vim +918 arch/arm/kernel/setup.c

^1da177e4c3f41 Linus Torvalds 2005-04-16  913  
4d551f57b6f9f0 Yu Chen        2019-09-21  914  static int __init reserve_memblock_reserved_regions(void)
4d551f57b6f9f0 Yu Chen        2019-09-21  915  {
4d551f57b6f9f0 Yu Chen        2019-09-21  916  	u64 i, j;
4d551f57b6f9f0 Yu Chen        2019-09-21  917  
4d551f57b6f9f0 Yu Chen        2019-09-21 @918  	for (i = 0; i < num_standard_resources; ++i) {
4d551f57b6f9f0 Yu Chen        2019-09-21 @919  		struct resource *mem = &standard_resources[i];
4d551f57b6f9f0 Yu Chen        2019-09-21  920  		phys_addr_t r_start, r_end, mem_size = resource_size(mem);
4d551f57b6f9f0 Yu Chen        2019-09-21  921  
4d551f57b6f9f0 Yu Chen        2019-09-21  922  		if (!memblock_is_region_reserved(mem->start, mem_size))
4d551f57b6f9f0 Yu Chen        2019-09-21  923  			continue;
4d551f57b6f9f0 Yu Chen        2019-09-21  924  
4d551f57b6f9f0 Yu Chen        2019-09-21  925  		for_each_reserved_mem_region(j, &r_start, &r_end) {
4d551f57b6f9f0 Yu Chen        2019-09-21  926  			resource_size_t start, end;
4d551f57b6f9f0 Yu Chen        2019-09-21  927  
4d551f57b6f9f0 Yu Chen        2019-09-21  928  			start = max(PFN_PHYS(PFN_DOWN(r_start)), mem->start);
4d551f57b6f9f0 Yu Chen        2019-09-21  929  			end = min(PFN_PHYS(PFN_UP(r_end)) - 1, mem->end);
4d551f57b6f9f0 Yu Chen        2019-09-21  930  
4d551f57b6f9f0 Yu Chen        2019-09-21  931  			if (start > mem->end || end < mem->start)
4d551f57b6f9f0 Yu Chen        2019-09-21  932  				continue;
4d551f57b6f9f0 Yu Chen        2019-09-21  933  
4d551f57b6f9f0 Yu Chen        2019-09-21  934  			reserve_region_with_split(mem, start, end, "reserved");
4d551f57b6f9f0 Yu Chen        2019-09-21  935  		}
4d551f57b6f9f0 Yu Chen        2019-09-21  936  	}
4d551f57b6f9f0 Yu Chen        2019-09-21  937  
4d551f57b6f9f0 Yu Chen        2019-09-21  938  	return 0;
4d551f57b6f9f0 Yu Chen        2019-09-21  939  }
4d551f57b6f9f0 Yu Chen        2019-09-21  940  arch_initcall(reserve_memblock_reserved_regions);
4d551f57b6f9f0 Yu Chen        2019-09-21  941  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox series

Patch

diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index d0a464e..606d1ac 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -911,6 +911,34 @@  static void __init request_standard_resources(const struct machine_desc *mdesc)
 		request_resource(&ioport_resource, &lp2);
 }
 
+static int __init reserve_memblock_reserved_regions(void)
+{
+	u64 i, j;
+
+	for (i = 0; i < num_standard_resources; ++i) {
+		struct resource *mem = &standard_resources[i];
+		phys_addr_t r_start, r_end, mem_size = resource_size(mem);
+
+		if (!memblock_is_region_reserved(mem->start, mem_size))
+			continue;
+
+		for_each_reserved_mem_region(j, &r_start, &r_end) {
+			resource_size_t start, end;
+
+			start = max(PFN_PHYS(PFN_DOWN(r_start)), mem->start);
+			end = min(PFN_PHYS(PFN_UP(r_end)) - 1, mem->end);
+
+			if (start > mem->end || end < mem->start)
+				continue;
+
+			reserve_region_with_split(mem, start, end, "reserved");
+		}
+	}
+
+	return 0;
+}
+arch_initcall(reserve_memblock_reserved_regions);
+
 #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE) || \
     defined(CONFIG_EFI)
 struct screen_info screen_info = {