From patchwork Tue Sep 25 07:13:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Ying" X-Patchwork-Id: 10613535 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4B1C7161F for ; Tue, 25 Sep 2018 07:14:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3A58029B12 for ; Tue, 25 Sep 2018 07:14:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2E27A29B17; Tue, 25 Sep 2018 07:14:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9155C29B12 for ; Tue, 25 Sep 2018 07:14:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 759908E007B; Tue, 25 Sep 2018 03:14:31 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 6E1C68E0072; Tue, 25 Sep 2018 03:14:31 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4BBEF8E007B; Tue, 25 Sep 2018 03:14:31 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by kanga.kvack.org (Postfix) with ESMTP id 08EEA8E0072 for ; Tue, 25 Sep 2018 03:14:31 -0400 (EDT) Received: by mail-pf1-f200.google.com with SMTP id u13-v6so11750977pfm.8 for ; Tue, 25 Sep 2018 00:14:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=Z6mo2vxKIVbzzmAj4hoPlPERZonwoLdPejVwkVbv0hY=; b=iWYdsQUvICaqpfzBFjbKj7ra3KKq+/D7Sqd9Awc0AH+X+SqJVGaPBtSVfwzGy94LLP Y2pkMogitm+myTANnH5rRycTBCW8uyvHu9qlwvcOWVSmK52AVEO9F2yTajtWM+xJOWSP Ex/PqezU0WaB1V1MAML/wDyOQt1WWVvP9VrwN1EtqAIMUFsK1tEEfF2gX2EIp4nEaq8Y 5eqr3yo0hDMhBH1nDSKSz/Mj2LLk+turqX8Euitg8A3AjKQqJxoBvIxyoJQGS3yybw3N HosRGFJTrUgqM9N7dvqwtbk0eQ3IwMrjVOhxJ1hg8PIBrfu4Q3HyWPK8m5Yxt0r1WCiE pJRQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: ABuFfoioTrOty8262E4xn9INzTLHNQpXjTfETAyv57wS6JxLVvb880nw A8GeVnZlAIQS0QfhA84IvhDaO2/WbGM4/tmgw4cZJGAeR/fy8k3rM7ji200cmaQQsof6Ddb679h PwWW65MPZGM89OpljQulp6VAaGqZfLOTyLcxwliEbhEjo6wJ5pto/nTN4Op7j+6kv3g== X-Received: by 2002:a17:902:162:: with SMTP id 89-v6mr2156848plb.91.1537859670705; Tue, 25 Sep 2018 00:14:30 -0700 (PDT) X-Google-Smtp-Source: ACcGV60n2HgG/MjwWH7ghC1y6Qd8dlhkEPeWlSykUVBw9pBfZFX/jdlruRFvt20GW45dJYo2CWN9 X-Received: by 2002:a17:902:162:: with SMTP id 89-v6mr2156705plb.91.1537859668678; Tue, 25 Sep 2018 00:14:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537859668; cv=none; d=google.com; s=arc-20160816; b=PV40tVUvc7IzZ1q+k1FBXZQM0lXHVo2LYZb4IDeCwFrJl6I5UZHSqOT0pGjeym62Eq Dv7h7VmORdenp2hyk8pk/CTAk0bWcJZ/mzl0FKooFogs9zIomtd4aysmM/JjJb4f2avU Rd7wSmuuYdF79G7Wun7+O5JYsmVGlx12Ifd24EBYiv+1YDPpBnfFlByzS7DC6+oHCKhb FY46vkjnlsc/tdpaSfbdtT86wmVuFP37an+FVqvV7PL1Hs8oxPPt0JCPk8gPBUeGxThV cI8rKwbO+y1UL/PtPVsWdGLKAVgAg3o8JIdP7xX8tWfIC+iHMgbYL6hfRHMqwIu6+kEg s43g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=Z6mo2vxKIVbzzmAj4hoPlPERZonwoLdPejVwkVbv0hY=; b=wnc+xjA7hAqOqW4wHHKXDxJSDlMuPN02R7oZ0+xLLTCE2nCBMLwJPsaojFEpbB++fH 1ldSDrl8VdW2ZxGW6q/0UsmlNZjee3dIT2T6X4uq0FyqortJw/hIoU/dieXhcWakSp5v 3VftqnN8WoLFk5hqh6LTEwT7VYmvjE0TTsbPLRxdzvFJ9TCfX/bDFXYVzlaKu/0oJPYA 9NnVMBz1HXixrzZd9zjTPoodVcXyP2tr/aZU3R6cQzG9PMNFrox5D5ZvEZW8pGtFrYd+ I98kyrDsMItAm/GGG2r0SxtGJG9SCA8Y8U6HW8rW+E29X4SkOU4IlsJVNhZTiUBMI5SN +z8w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga14.intel.com (mga14.intel.com. [192.55.52.115]) by mx.google.com with ESMTPS id a1-v6si1378544pgw.9.2018.09.25.00.14.28 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Sep 2018 00:14:28 -0700 (PDT) Received-SPF: pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) client-ip=192.55.52.115; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Sep 2018 00:14:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,301,1534834800"; d="scan'208";a="89093673" Received: from yhuang-mobile.sh.intel.com ([10.239.198.87]) by fmsmga002.fm.intel.com with ESMTP; 25 Sep 2018 00:14:24 -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 -V5 RESEND 18/21] swap: Support PMD swap mapping in mincore() Date: Tue, 25 Sep 2018 15:13:45 +0800 Message-Id: <20180925071348.31458-19-ying.huang@intel.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20180925071348.31458-1-ying.huang@intel.com> References: <20180925071348.31458-1-ying.huang@intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP During mincore(), for PMD swap mapping, swap cache will be looked up. If the resulting page isn't compound page, the PMD swap mapping will be split and fallback to PTE swap mapping processing. 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/mincore.c | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/mm/mincore.c b/mm/mincore.c index a66f2052c7b1..a2a66c3c8c6a 100644 --- a/mm/mincore.c +++ b/mm/mincore.c @@ -48,7 +48,8 @@ static int mincore_hugetlb(pte_t *pte, unsigned long hmask, unsigned long addr, * and is up to date; i.e. that no page-in operation would be required * at this time if an application were to map and access this page. */ -static unsigned char mincore_page(struct address_space *mapping, pgoff_t pgoff) +static unsigned char mincore_page(struct address_space *mapping, pgoff_t pgoff, + bool *compound) { unsigned char present = 0; struct page *page; @@ -86,6 +87,8 @@ static unsigned char mincore_page(struct address_space *mapping, pgoff_t pgoff) #endif if (page) { present = PageUptodate(page); + if (compound) + *compound = PageCompound(page); put_page(page); } @@ -103,7 +106,8 @@ static int __mincore_unmapped_range(unsigned long addr, unsigned long end, pgoff = linear_page_index(vma, addr); for (i = 0; i < nr; i++, pgoff++) - vec[i] = mincore_page(vma->vm_file->f_mapping, pgoff); + vec[i] = mincore_page(vma->vm_file->f_mapping, + pgoff, NULL); } else { for (i = 0; i < nr; i++) vec[i] = 0; @@ -127,14 +131,36 @@ static int mincore_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, pte_t *ptep; unsigned char *vec = walk->private; int nr = (end - addr) >> PAGE_SHIFT; + swp_entry_t entry; ptl = pmd_trans_huge_lock(pmd, vma); if (ptl) { - memset(vec, 1, nr); + unsigned char val = 1; + bool compound; + + if (IS_ENABLED(CONFIG_THP_SWAP) && is_swap_pmd(*pmd)) { + entry = pmd_to_swp_entry(*pmd); + if (!non_swap_entry(entry)) { + val = mincore_page(swap_address_space(entry), + swp_offset(entry), + &compound); + /* + * The huge swap cluster has been + * split under us + */ + if (!compound) { + __split_huge_swap_pmd(vma, addr, pmd); + spin_unlock(ptl); + goto fallback; + } + } + } + memset(vec, val, nr); spin_unlock(ptl); goto out; } +fallback: if (pmd_trans_unstable(pmd)) { __mincore_unmapped_range(addr, end, vma, vec); goto out; @@ -150,8 +176,7 @@ static int mincore_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, else if (pte_present(pte)) *vec = 1; else { /* pte is a swap entry */ - swp_entry_t entry = pte_to_swp_entry(pte); - + entry = pte_to_swp_entry(pte); if (non_swap_entry(entry)) { /* * migration or hwpoison entries are always @@ -161,7 +186,7 @@ static int mincore_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, } else { #ifdef CONFIG_SWAP *vec = mincore_page(swap_address_space(entry), - swp_offset(entry)); + swp_offset(entry), NULL); #else WARN_ON(1); *vec = 1;