From: Ma Wupeng mawupeng1@huawei.com
hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I4PM01 CVE: NA
--------------------------------
Add ReliMemTotal & ReliMemUsed in /proc/meminfo to show memory info about reliable memory.
- ReliableTotal: total reliable RAM
- ReliableUsed: thei used amount of reliable memory kernel
Signed-off-by: Ma Wupeng mawupeng1@huawei.com Reviewed-by: Kefeng Wang wangkefeng.wang@huawei.com Signed-off-by: Zheng Zengkai zhengzengkai@huawei.com --- Documentation/filesystems/proc.rst | 6 ++++++ fs/proc/meminfo.c | 2 ++ include/linux/mem_reliable.h | 2 ++ mm/mem_reliable.c | 25 +++++++++++++++++++++++++ 4 files changed, 35 insertions(+)
diff --git a/Documentation/filesystems/proc.rst b/Documentation/filesystems/proc.rst index 533c79e8d2cd..e1562bef4887 100644 --- a/Documentation/filesystems/proc.rst +++ b/Documentation/filesystems/proc.rst @@ -963,6 +963,8 @@ varies by architecture and compile options. The following is from a AnonHugePages: 49152 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB + ReliableTotal: 7340032 kB + ReliableUsed: 418824 kB
MemTotal Total usable RAM (i.e. physical RAM minus a few reserved @@ -1092,6 +1094,10 @@ VmallocChunk Percpu Memory allocated to the percpu allocator used to back percpu allocations. This stat excludes the cost of metadata. +ReliableTotal + Total reliable memory size +ReliableUsed + The used amount of reliable memory
vmallocinfo ~~~~~~~~~~~ diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c index 887a5532e449..e03212ddaddf 100644 --- a/fs/proc/meminfo.c +++ b/fs/proc/meminfo.c @@ -150,6 +150,8 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
arch_report_meminfo(m);
+ reliable_report_meminfo(m); + return 0; }
diff --git a/include/linux/mem_reliable.h b/include/linux/mem_reliable.h index 02f73a91058b..4add3803eb06 100644 --- a/include/linux/mem_reliable.h +++ b/include/linux/mem_reliable.h @@ -17,6 +17,7 @@ extern bool reliable_enabled; extern void add_reliable_mem_size(long sz); extern void mem_reliable_init(bool has_unmirrored_mem, unsigned long *zone_movable_pfn); +extern void reliable_report_meminfo(struct seq_file *m);
static inline bool mem_reliable_is_enabled(void) { @@ -57,6 +58,7 @@ static inline bool skip_none_movable_zone(gfp_t gfp, struct zoneref *z) { return false; } +static inline void reliable_report_meminfo(struct seq_file *m) {} #endif
#endif diff --git a/mm/mem_reliable.c b/mm/mem_reliable.c index 7914c76c1fcd..aa89c874890e 100644 --- a/mm/mem_reliable.c +++ b/mm/mem_reliable.c @@ -5,6 +5,8 @@ #include <linux/mm.h> #include <linux/memory.h> #include <linux/memory_hotplug.h> +#include <linux/seq_file.h> +#include <linux/mmzone.h>
DEFINE_STATIC_KEY_FALSE(mem_reliable);
@@ -22,6 +24,18 @@ static unsigned long total_reliable_mem_sz(void) return atomic_long_read(&total_reliable_mem); }
+static unsigned long used_reliable_mem_sz(void) +{ + unsigned long nr_page = 0; + struct zone *z; + + for_each_populated_zone(z) + if (zone_idx(z) < ZONE_MOVABLE) + nr_page += zone_page_state(z, NR_FREE_PAGES); + + return total_reliable_mem_sz() - nr_page * PAGE_SIZE; +} + static int reliable_mem_notifier(struct notifier_block *nb, unsigned long action, void *arg) { @@ -77,3 +91,14 @@ void mem_reliable_init(bool has_unmirrored_mem, unsigned long *zone_movable_pfn) pr_info("init succeed, mirrored memory size(%lu)\n", total_reliable_mem_sz()); } + +void reliable_report_meminfo(struct seq_file *m) +{ + if (!mem_reliable_is_enabled()) + return; + + seq_printf(m, "ReliableTotal: %8lu kB\n", + total_reliable_mem_sz() >> 10); + seq_printf(m, "ReliableUsed: %8lu kB\n", + used_reliable_mem_sz() >> 10); +}