diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 0d0ecc7df26005173a18aac7229f6c359624ca37..690db5b3eb53b392ee3cb92cbd90415218a53a09 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt @@ -880,6 +880,8 @@ HardwareCorrupted: 0 kB 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 @@ -970,6 +972,8 @@ VmallocTotal: total size of vmalloc memory area VmallocChunk: largest contiguous block of vmalloc area which is free 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 .............................................................................. diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c index edda898714eb7bb23585241dc6631800c6ba1dfb..883c5f53c303f94dbfa714b2bee57f9975574247 100644 --- a/fs/proc/meminfo.c +++ b/fs/proc/meminfo.c @@ -148,6 +148,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 b03108441e37a37f4b834c0ca717e0ff7c1e4227..31be68fac330b5fe61a0457d0ddd61843756cf88 100644 --- a/include/linux/mem_reliable.h +++ b/include/linux/mem_reliable.h @@ -18,6 +18,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) { @@ -58,6 +59,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 diff --git a/mm/mem_reliable.c b/mm/mem_reliable.c index 2e21839ca49fb4dfbb5b2d373f36489795190ea7..c03c77090cf5b46c4335e357044c9296dc88456d 100644 --- a/mm/mem_reliable.c +++ b/mm/mem_reliable.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include DEFINE_STATIC_KEY_FALSE(mem_reliable); @@ -76,3 +78,30 @@ void mem_reliable_init(bool has_unmirrored_mem, unsigned long *zone_movable_pfn) pr_info("init succeed, mirrored memory size(%lu)", atomic_long_read(&total_reliable_mem)); } + +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; +} + +void reliable_report_meminfo(struct seq_file *m) +{ + if (mem_reliable_is_enabled()) { + seq_printf(m, "ReliableTotal: %8lu kB\n", + total_reliable_mem_sz() >> 10); + seq_printf(m, "ReliableUsed: %8lu kB\n", + used_reliable_mem_sz() >> 10); + } +}