Skip to content

Commit

Permalink
mm: move memcmp_pages() and pages_identical()
Browse files Browse the repository at this point in the history
Patch series "THP aware uprobe", v13.

This patchset 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 PTE-mapped pages are
regrouped as huge PMD.

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

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

This patch (of 6):

Move memcmp_pages() to mm/util.c and pages_identical() to mm.h, so that we
can use them in other files.

Link: http://lkml.kernel.org/r/20190815164525.1848545-2-songliubraving@fb.com
Signed-off-by: Song Liu <songliubraving@fb.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Matthew Wilcox <matthew.wilcox@oracle.com>
Cc: William Kucharski <william.kucharski@oracle.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Song Liu authored and Linus Torvalds committed Sep 24, 2019
1 parent 87eaceb commit 010c164
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 18 deletions.
7 changes: 7 additions & 0 deletions include/linux/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -2868,5 +2868,12 @@ void __init setup_nr_node_ids(void);
static inline void setup_nr_node_ids(void) {}
#endif

extern int memcmp_pages(struct page *page1, struct page *page2);

static inline int pages_identical(struct page *page1, struct page *page2)
{
return !memcmp_pages(page1, page2);
}

#endif /* __KERNEL__ */
#endif /* _LINUX_MM_H */
18 changes: 0 additions & 18 deletions mm/ksm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1029,24 +1029,6 @@ static u32 calc_checksum(struct page *page)
return checksum;
}

static int memcmp_pages(struct page *page1, struct page *page2)
{
char *addr1, *addr2;
int ret;

addr1 = kmap_atomic(page1);
addr2 = kmap_atomic(page2);
ret = memcmp(addr1, addr2, PAGE_SIZE);
kunmap_atomic(addr2);
kunmap_atomic(addr1);
return ret;
}

static inline int pages_identical(struct page *page1, struct page *page2)
{
return !memcmp_pages(page1, page2);
}

static int write_protect_page(struct vm_area_struct *vma, struct page *page,
pte_t *orig_pte)
{
Expand Down
13 changes: 13 additions & 0 deletions mm/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -783,3 +783,16 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen)
out:
return res;
}

int memcmp_pages(struct page *page1, struct page *page2)
{
char *addr1, *addr2;
int ret;

addr1 = kmap_atomic(page1);
addr2 = kmap_atomic(page2);
ret = memcmp(addr1, addr2, PAGE_SIZE);
kunmap_atomic(addr2);
kunmap_atomic(addr1);
return ret;
}

0 comments on commit 010c164

Please sign in to comment.