FAILED: patch "[PATCH] mm/hugetlb: initialize hugetlb_usage in mm_init" failed to apply to 4.4-stable tree
Subsystems (5)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 13db8c50477d83ad3e3b9b0ae247e5cd833a7ae4 Mon Sep 17 00:00:00 2001
From: Liu Zixian <[email protected]>
Date: Wed, 8 Sep 2021 18:10:05 -0700
Subject: [PATCH] mm/hugetlb: initialize hugetlb_usage in mm_init
After fork, the child process will get incorrect (2x) hugetlb_usage. If a process uses 5 2MB hugetlb pages in an anonymous mapping,
HugetlbPages: 10240 kB
and then forks, the child will show,
HugetlbPages: 20480 kB
The reason for double the amount is because hugetlb_usage will be copied from the parent and then increased when we copy page tables from parent to child. Child will have 2x actual usage.
Fix this by adding hugetlb_count_init in mm_init.
include/linux/hugetlb.h +9 -0
@@ -858,6 +858,11 @@ static inline spinlock_t *huge_pte_lockptr(struct hstate *h,void hugetlb_report_usage (struct seq_file *m,struct mm_struct *mm); +static inline void hugetlb_count_init (struct mm_struct *mm) +{ +atomic_long_set (&mm->hugetlb_usage,0 ); +} +static inline void hugetlb_count_add (long l,struct mm_struct *mm) {atomic_long_add (l, &mm->hugetlb_usage);
@@ -1042,6 +1047,10 @@ static inline spinlock_t *huge_pte_lockptr(struct hstate *h,return &mm->page_table_lock; } +static inline void hugetlb_count_init (struct mm_struct *mm) +{ +} +static inline void hugetlb_report_usage (struct seq_file *f,struct mm_struct *m) { }
kernel/fork.c +1 -0
@@ -1063,6 +1063,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p, mm->pmd_huge_pte =NULL ;#endif mm_init_uprobes_state (mm); +hugetlb_count_init (mm);if (current->mm) { mm->flags = current->mm->flags &MMF_INIT_MASK ;