Commit f385cb85 authored by Song Liu's avatar Song Liu Committed by Linus Torvalds

uprobe: collapse THP pmd after removing all uprobes

After all uprobes are removed from the huge page (with PTE pgtable), it is
possible to collapse the pmd and benefit from THP again.  This patch does
the collapse by calling collapse_pte_mapped_thp().

Link: http://lkml.kernel.org/r/20190815164525.1848545-7-songliubraving@fb.comSigned-off-by: default avatarSong Liu <songliubraving@fb.com>
Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Reported-by: default avatarkbuild test robot <lkp@intel.com>
Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 27e1f827
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/percpu-rwsem.h> #include <linux/percpu-rwsem.h>
#include <linux/task_work.h> #include <linux/task_work.h>
#include <linux/shmem_fs.h> #include <linux/shmem_fs.h>
#include <linux/khugepaged.h>
#include <linux/uprobes.h> #include <linux/uprobes.h>
...@@ -472,6 +473,7 @@ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm, ...@@ -472,6 +473,7 @@ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm,
struct page *old_page, *new_page; struct page *old_page, *new_page;
struct vm_area_struct *vma; struct vm_area_struct *vma;
int ret, is_register, ref_ctr_updated = 0; int ret, is_register, ref_ctr_updated = 0;
bool orig_page_huge = false;
is_register = is_swbp_insn(&opcode); is_register = is_swbp_insn(&opcode);
uprobe = container_of(auprobe, struct uprobe, arch); uprobe = container_of(auprobe, struct uprobe, arch);
...@@ -529,6 +531,9 @@ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm, ...@@ -529,6 +531,9 @@ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm,
/* let go new_page */ /* let go new_page */
put_page(new_page); put_page(new_page);
new_page = NULL; new_page = NULL;
if (PageCompound(orig_page))
orig_page_huge = true;
} }
put_page(orig_page); put_page(orig_page);
} }
...@@ -547,6 +552,10 @@ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm, ...@@ -547,6 +552,10 @@ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm,
if (ret && is_register && ref_ctr_updated) if (ret && is_register && ref_ctr_updated)
update_ref_ctr(uprobe, mm, -1); update_ref_ctr(uprobe, mm, -1);
/* try collapse pmd for compound page */
if (!ret && orig_page_huge)
collapse_pte_mapped_thp(mm, vaddr);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment