Unverified Commit 42f28753 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!1293 Enable reliable memory for x86 platform

Merge Pull Request from: @x56Jason 
 
## Description
This PR is to enable reliable memory for x86 platform

## Issue
#I7HUWC 
#I7HV16

## Test
### Enablement
On x86 platform, configure memory mirroring in BIOS, then add "kernelcore=reliable" to kernel command line.

When boot up, we can see it is enabled:

```
[root@icx6 scripts]# dmesg|grep 'mem reliable'
[    0.018670] mem reliable: init succeed, mirrored memory size(22220410880)
[root@icx6 zengz]# cat /proc/meminfo|grep Reliable
ReliableTotal:    17717184 kB
ReliableUsed:      1715804 kB
ReliableTaskUsed:   672248 kB
ReliableBuddyMem: 16001380 kB
ReliableShmem:        2700 kB
ReliableFileCache:   668692 kB
```
### Process Test

Put bash into reliable memory, and then run qemu, we can see qemu are also put into reliable memory:

```
$ cat /proc/self/reliable
0 
# echo 1 > /proc/self/reliable
$ cat /proc/self/reliable
1

$ ./qemu.sh
......
$ ps -ef|grep qemu
root        2765    2535  0 08:43 pts/1    00:00:00 /bin/bash ./qemu.sh
root        2767    2765 57 08:43 pts/1    00:00:07 /home/zengz/qemu-8.0.1/build/qemu-system-x86_64 -machine q35 -accel kvm -m ......
zengz       2811    2570  0 08:43 pts/2    00:00:00 grep --color=auto qemu
$ cat /proc/2767/reliable
1
```

## Known Issue
N/A

## Default Config Change
Following config is added to x86 default config:
```
CONFIG_MEMORY_RELIABLE=y
```
 
 
Link:https://gitee.com/openeuler/kernel/pulls/1293

 

Reviewed-by: default avatarAichun Shi <aichun.shi@intel.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 7dd4206a 6dc7cbda
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4866,7 +4866,7 @@
			[KNL, SMP] Set scheduler's default relax_domain_level.
			See Documentation/admin-guide/cgroup-v1/cpusets.rst.

	reliable_debug=	[ARM64]
	reliable_debug=	[ARM64,X86-64]
			Format: [F][,S][,P]
			Only works with CONFIG_MEMORY_RELIABLE and
			"kernelcore=reliable" is configured.
+1 −0
Original line number Diff line number Diff line
@@ -1087,6 +1087,7 @@ CONFIG_ARCH_HAS_PKEYS=y
# CONFIG_READ_ONLY_THP_FOR_FS is not set
CONFIG_ARCH_HAS_PTE_SPECIAL=y
CONFIG_MAPPING_DIRTY_HELPERS=y
CONFIG_MEMORY_RELIABLE=y
# CONFIG_CLEAR_FREELIST_PAGE is not set

#
+5 −1
Original line number Diff line number Diff line
@@ -612,7 +612,7 @@ struct mm_struct {
		u32 pasid;
#endif

#ifdef CONFIG_MEMORY_RELIABLE
#if defined(CONFIG_MEMORY_RELIABLE) && !defined(CONFIG_X86_64)
		/* total used reliable pages */
		KABI_RENAME(atomic_long_t reserve_0, atomic_long_t reliable_nr_page);
#endif
@@ -640,7 +640,11 @@ struct mm_struct {
	KABI_RESERVE(2)
	KABI_RESERVE(3)
#endif
#if defined(CONFIG_X86_64) && defined(CONFIG_MEMORY_RELIABLE)
	KABI_USE(4, atomic_long_t reliable_nr_page)
#else
	KABI_RESERVE(4)
#endif
	KABI_RESERVE(5)
	KABI_RESERVE(6)
	KABI_RESERVE(7)
+1 −1
Original line number Diff line number Diff line
@@ -974,7 +974,7 @@ config PID_RESERVE
config MEMORY_RELIABLE
	bool "Support for memory reliable"
	depends on NEED_MULTIPLE_NODES
	depends on ARM64
	depends on ARM64 || X86_64
	default n
	help
	  Memory reliable is based on mirror memory. It has the following
+2 −2
Original line number Diff line number Diff line
@@ -2735,10 +2735,10 @@ static void *__init __alloc_bootmem_huge_page_inner(phys_addr_t size,
						    int nid)
{
	if (!mem_reliable_is_enabled())
		return memblock_alloc_try_nid_raw(size, align, max_addr,
		return memblock_alloc_try_nid_raw(size, align, min_addr,
						  max_addr, nid);

	return memblock_alloc_try_nid_raw_flags(size, align, max_addr, max_addr,
	return memblock_alloc_try_nid_raw_flags(size, align, min_addr, max_addr,
						nid, MEMBLOCK_NOMIRROR);
}