| From: xu xin <xu.xin16@zte.com.cn> |
| Subject: ksm: count zero pages for each process |
| Date: Fri, 30 Dec 2022 09:16:29 +0800 (CST) |
| |
| As the number of ksm zero pages is not included in ksm_merging_pages per |
| process when enabling use_zero_pages, it's unclear of how many actual |
| pages are merged by KSM. To let users accurately estimate their memory |
| demands when unsharing KSM zero-pages, it's necessary to show KSM zero- |
| pages per process. |
| |
| Since unsharing zero pages placed by KSM accurately is achieved, then |
| tracking empty pages merging and unmerging is not a difficult thing any |
| longer. |
| |
| Since we already have /proc/<pid>/ksm_stat, just add the information of |
| zero_pages_sharing in it. |
| |
| Link: https://lkml.kernel.org/r/202212300916292181912@zte.com.cn |
| Signed-off-by: xu xin <xu.xin16@zte.com.cn> |
| Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> |
| Cc: David Hildenbrand <david@redhat.com> |
| Cc: Xuexin Jiang <jiang.xuexin@zte.com.cn> |
| Cc: Xiaokai Ran <ran.xiaokai@zte.com.cn> |
| Cc: Yang Yang <yang.yang29@zte.com.cn> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| fs/proc/base.c | 1 + |
| include/linux/mm_types.h | 7 ++++++- |
| mm/ksm.c | 2 ++ |
| 3 files changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/fs/proc/base.c~ksm-count-zero-pages-for-each-process |
| +++ a/fs/proc/base.c |
| @@ -3207,6 +3207,7 @@ static int proc_pid_ksm_stat(struct seq_ |
| mm = get_task_mm(task); |
| if (mm) { |
| seq_printf(m, "ksm_rmap_items %lu\n", mm->ksm_rmap_items); |
| + seq_printf(m, "zero_pages_sharing %lu\n", mm->ksm_zero_pages_sharing); |
| mmput(mm); |
| } |
| |
| --- a/include/linux/mm_types.h~ksm-count-zero-pages-for-each-process |
| +++ a/include/linux/mm_types.h |
| @@ -740,7 +740,7 @@ struct mm_struct { |
| #ifdef CONFIG_KSM |
| /* |
| * Represent how many pages of this process are involved in KSM |
| - * merging. |
| + * merging (not including ksm_zero_pages_sharing). |
| */ |
| unsigned long ksm_merging_pages; |
| /* |
| @@ -748,6 +748,11 @@ struct mm_struct { |
| * including merged and not merged. |
| */ |
| unsigned long ksm_rmap_items; |
| + /* |
| + * Represent how many empty pages are merged with kernel zero |
| + * pages when enabling KSM use_zero_pages. |
| + */ |
| + unsigned long ksm_zero_pages_sharing; |
| #endif |
| #ifdef CONFIG_LRU_GEN |
| struct { |
| --- a/mm/ksm.c~ksm-count-zero-pages-for-each-process |
| +++ a/mm/ksm.c |
| @@ -794,6 +794,7 @@ static inline void clean_rmap_item_zero_ |
| { |
| if (rmap_item->address & ZERO_PAGE_FLAG) { |
| ksm_zero_pages_sharing--; |
| + rmap_item->mm->ksm_zero_pages_sharing--; |
| rmap_item->address &= PAGE_MASK; |
| } |
| } |
| @@ -2123,6 +2124,7 @@ static int try_to_merge_with_kernel_zero |
| if (!err) { |
| rmap_item->address |= ZERO_PAGE_FLAG; |
| ksm_zero_pages_sharing++; |
| + rmap_item->mm->ksm_zero_pages_sharing++; |
| } |
| } else { |
| /* If the vma is out of date, we do not need to continue. */ |
| _ |