Workloads consisting of a large number processes running the same program with a large shared data section may suffer from excessive numa balancing page migration of the pages in the shared data section. This shows up as high I/O wait time and degraded performance on machines with higher socket or node counts.
This patch skips shared copy-on-write pages in change_pte_range() for the numa balancing case. Signed-off-by: Henry Willard <[email protected]> Reviewed-by: HÃ¥kon Bugge <[email protected]> Reviewed-by: Steve Sistare [email protected] --- mm/mprotect.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mm/mprotect.c b/mm/mprotect.c index ec39f730a0bf..fbbb3ab70818 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -84,6 +84,11 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd, if (!page || PageKsm(page)) continue; + /* Also skip shared copy-on-write pages */ + if (is_cow_mapping(vma->vm_flags) && + page_mapcount(page) != 1) + continue; + /* Avoid TLB flush if possible */ if (pte_protnone(oldpte)) continue; -- 1.8.3.1

