Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp377257imm; Thu, 21 Jun 2018 20:58:43 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKb06YAUmZ9Kbnfbn0+4c49C0KUldcaJ/i6UTHudrXt0O6mnlRYjejNx3GD1Gek1dak6owB X-Received: by 2002:a17:902:e093:: with SMTP id cb19-v6mr31535783plb.189.1529639923015; Thu, 21 Jun 2018 20:58:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529639922; cv=none; d=google.com; s=arc-20160816; b=zvfHd8IY7VDigLyIQRjOEEti8gMtyJwO2RlHtpImtjJhX+yftwZqr4uwAhzos7qXN3 r9tNXycU/cEY0kcz8bwcBY3NEC3r+iNEXIfkB7qCApFO1E4LfPv2Dzpev6ZumD5ShFTL adeyY5eqqS8R7OLCZR8QceytNqRAKLBkFFeYI7j/7Uad5FrSryhCHzcAv2B50T/Lkzvp lzBfXU+yRU6Y02bSlkQYRwiFOR+hRhKTHUn7h+LtXeavAF2kioeSFMt9ndm5s9spS+JT cJYRNIFNol64GkN5WvXItc6n2m2nw9r3yOkyWdNRBM4FVbysL51c4m6MhLEd1f3ajcSE iGhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=hvTVvXPPBPzeGECAxcfKz0ja6MvVJEk0sVtAQLI16EM=; b=M92ZHImmlfEbSnbciDxtwqkOFffqS+FbLk40Fn+H8XDxAbb19c0f19hCL1dY0qczIY GYuNFPX0AeoUj4zm8QMkDSnKI1JBSc/15JnzOUFtqTtBnu1jrSCn/FzwhucsxQeLATL7 o8nBE53taxoKNi4/v4N50awgtScSSTn4LXxGI9uf4KPz2cenCWs5d8nEDmwq1C6zFA6P 1+TVXu7hN82iMlaqnnDt5adP4k2hsgCFzeJyaaaetoga1XhaJzDQFLp9pv+ydAV4cX1y gCxQLuZ6RqGlcV6WGb61IamLTskgIxTPhc9h/prF0lv+HwT6gbJ1igyjhztwEQ74MqOl 4Ycg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u2-v6si5296644pge.53.2018.06.21.20.58.28; Thu, 21 Jun 2018 20:58:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964794AbeFVD4l (ORCPT + 99 others); Thu, 21 Jun 2018 23:56:41 -0400 Received: from mga17.intel.com ([192.55.52.151]:9412 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934638AbeFVD4F (ORCPT ); Thu, 21 Jun 2018 23:56:05 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Jun 2018 20:56:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,255,1526367600"; d="scan'208";a="65335240" Received: from wanpingl-mobl.ccr.corp.intel.com (HELO yhuang6-ux31a.ccr.corp.intel.com) ([10.254.212.200]) by fmsmga004.fm.intel.com with ESMTP; 21 Jun 2018 20:56:03 -0700 From: "Huang, Ying" To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Huang Ying , "Kirill A. Shutemov" , Andrea Arcangeli , Michal Hocko , Johannes Weiner , Shaohua Li , Hugh Dickins , Minchan Kim , Rik van Riel , Dave Hansen , Naoya Horiguchi , Zi Yan , Daniel Jordan Subject: [PATCH -mm -v4 21/21] mm, THP: Avoid to split THP when reclaim MADV_FREE THP Date: Fri, 22 Jun 2018 11:51:51 +0800 Message-Id: <20180622035151.6676-22-ying.huang@intel.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20180622035151.6676-1-ying.huang@intel.com> References: <20180622035151.6676-1-ying.huang@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Huang Ying Previously, to reclaim MADV_FREE THP, the THP will be split firstly, then reclaim each sub-pages. This wastes cycles to split THP and unmap and free each sub-pages, and split THP even if it has been written since MADV_FREE. We have to do this because MADV_FREE THP reclaiming shares same try_to_unmap() calling with swap, while swap needs to split the PMD page mapping at that time. Now swap can process PMD mapping, this makes it easy to avoid to split THP when MADV_FREE THP is reclaimed. Signed-off-by: "Huang, Ying" Cc: "Kirill A. Shutemov" Cc: Andrea Arcangeli Cc: Michal Hocko Cc: Johannes Weiner Cc: Shaohua Li Cc: Hugh Dickins Cc: Minchan Kim Cc: Rik van Riel Cc: Dave Hansen Cc: Naoya Horiguchi Cc: Zi Yan Cc: Daniel Jordan --- mm/huge_memory.c | 41 ++++++++++++++++++++++++++++++++--------- mm/vmscan.c | 3 ++- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 195f24040b41..7c6edd897f15 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1671,6 +1671,15 @@ int do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t pmd) return 0; } +static inline void zap_deposited_table(struct mm_struct *mm, pmd_t *pmd) +{ + pgtable_t pgtable; + + pgtable = pgtable_trans_huge_withdraw(mm, pmd); + pte_free(mm, pgtable); + mm_dec_nr_ptes(mm); +} + #ifdef CONFIG_THP_SWAP void __split_huge_swap_pmd(struct vm_area_struct *vma, unsigned long haddr, @@ -1885,6 +1894,28 @@ bool set_pmd_swap_entry(struct page_vma_mapped_walk *pvmw, struct page *page, pmd_t swp_pmd; swp_entry_t entry = { .val = page_private(page) }; + if (unlikely(PageSwapBacked(page) != PageSwapCache(page))) { + WARN_ON_ONCE(1); + return false; + } + + /* MADV_FREE page check */ + if (!PageSwapBacked(page)) { + if (!PageDirty(page)) { + zap_deposited_table(mm, pvmw->pmd); + add_mm_counter(mm, MM_ANONPAGES, -HPAGE_PMD_NR); + goto out_remove_rmap; + } + + /* + * If the page was redirtied, it cannot be + * discarded. Remap the page to page table. + */ + set_pmd_at(mm, address, pvmw->pmd, pmdval); + SetPageSwapBacked(page); + return false; + } + if (swap_duplicate(&entry, true) < 0) { set_pmd_at(mm, address, pvmw->pmd, pmdval); return false; @@ -1902,21 +1933,13 @@ bool set_pmd_swap_entry(struct page_vma_mapped_walk *pvmw, struct page *page, swp_pmd = pmd_swp_mksoft_dirty(swp_pmd); set_pmd_at(mm, address, pvmw->pmd, swp_pmd); +out_remove_rmap: page_remove_rmap(page, true); put_page(page); return true; } #endif -static inline void zap_deposited_table(struct mm_struct *mm, pmd_t *pmd) -{ - pgtable_t pgtable; - - pgtable = pgtable_trans_huge_withdraw(mm, pmd); - pte_free(mm, pgtable); - mm_dec_nr_ptes(mm); -} - /* * Return true if we do MADV_FREE successfully on entire pmd page. * Otherwise, return false. diff --git a/mm/vmscan.c b/mm/vmscan.c index 891d3c7b8f21..80d0150dd028 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1137,7 +1137,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, /* Adding to swap updated mapping */ mapping = page_mapping(page); } - } else if (unlikely(PageTransHuge(page))) { + } else if (unlikely(PageTransHuge(page)) && + (!thp_swap_supported() || !PageAnon(page))) { /* Split file THP */ if (split_huge_page_to_list(page, page_list)) goto keep_locked; -- 2.16.4