[PATCH v6 0/6] THP aware uprobe

From: Song Liu
Date: Sun Jun 23 2019 - 01:48:49 EST


This set makes uprobe aware of THPs.

Currently, when uprobe is attached to text on THP, the page is split by
FOLL_SPLIT. As a result, uprobe eliminates the performance benefit of THP.

This set makes uprobe THP-aware. Instead of FOLL_SPLIT, we introduces
FOLL_SPLIT_PMD, which only split PMD for uprobe. After all uprobes within
the THP are removed, the PTEs are regrouped into huge PMD.

Note that, with uprobes attached, the process runs with PTEs for the huge
page. The performance benefit of THP is recovered _after_ all uprobes on
the huge page are detached.

This set (plus a few THP patches) is also available at

https://github.com/liu-song-6/linux/tree/uprobe-thp

Changes v5 => v6:
1. Enable khugepaged to collapse pmd for pte-mapped THP
(Kirill A. Shutemov).
2. uprobe asks khuagepaged to collaspe pmd. (Kirill A. Shutemov)

Note: Theast two patches in v6 the set apply _after_ v7 of set "Enable THP
for text section of non-shmem files"

Changes v4 => v5:
1. Propagate pte_alloc() error out of follow_pmd_mask().

Changes since v3:
1. Simplify FOLL_SPLIT_PMD case in follow_pmd_mask(), (Kirill A. Shutemov)
2. Fix try_collapse_huge_pmd() to match change in follow_pmd_mask().

Changes since v2:
1. For FOLL_SPLIT_PMD, populated the page table in follow_pmd_mask().
2. Simplify logic in uprobe_write_opcode. (Oleg Nesterov)
3. Fix page refcount handling with FOLL_SPLIT_PMD.
4. Much more testing, together with THP on ext4 and btrfs (sending in
separate set).
5. Rebased.

Changes since v1:
1. introduces FOLL_SPLIT_PMD, instead of modifying split_huge_pmd*();
2. reuse pages_identical() from ksm.c;
3. rewrite most of try_collapse_huge_pmd().

Song Liu (6):
mm: move memcmp_pages() and pages_identical()
uprobe: use original page when all uprobes are removed
mm, thp: introduce FOLL_SPLIT_PMD
uprobe: use FOLL_SPLIT_PMD instead of FOLL_SPLIT
khugepaged: enable collapse pmd for pte-mapped THP
uprobe: collapse THP pmd after removing all uprobes

include/linux/mm.h | 8 +++++
include/linux/pagemap.h | 1 +
kernel/events/uprobes.c | 55 ++++++++++++++++++++++++-------
mm/gup.c | 8 +++--
mm/khugepaged.c | 72 +++++++++++++++++++++++++++++++++--------
mm/ksm.c | 18 -----------
mm/util.c | 13 ++++++++
7 files changed, 130 insertions(+), 45 deletions(-)

--
2.17.1