From patchwork Tue Nov 20 08:54:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Ying" X-Patchwork-Id: 10690017 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 6BFFD13BB for ; Tue, 20 Nov 2018 08:56:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5B7B02991D for ; Tue, 20 Nov 2018 08:56:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4F8E529A1B; Tue, 20 Nov 2018 08:56:04 +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 E64262991D for ; Tue, 20 Nov 2018 08:56:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A61E56B1F54; Tue, 20 Nov 2018 03:55:54 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 9E4C06B1F56; Tue, 20 Nov 2018 03:55:54 -0500 (EST) 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 8AD4F6B1F57; Tue, 20 Nov 2018 03:55:54 -0500 (EST) 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 43F6B6B1F54 for ; Tue, 20 Nov 2018 03:55:54 -0500 (EST) Received: by mail-pf1-f200.google.com with SMTP id v79so1058257pfd.20 for ; Tue, 20 Nov 2018 00:55:54 -0800 (PST) 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=PneHrFIvBxeR39UtwCqcyYL55SkL1f0iPo6rjUY3mOU=; b=Ok4ibYdL57K8Zcy/+0ISC6Aiobtt01isQKaTojjNc8r220yN5hTMmP8nURFWT2bkLy 1RxYTlCXpRY9REEP9pttmUtHHuuQAzbQlGshqCxVD9f4DXlJ6w5Tm/yFnP9wuMc25S1w jPOVbxSA2y73mNQv2hGe9e4Dx/fDj9b/YfdrIZ4qtwEJcYPQp/NttK2Bgo7LbIhWrWcW ARC7Q0c5WqbIIfudNqmzZlvwUC8RGub0wR5WXqUhw2dneAZR28pqyf4zxxFnGHgNVkPy /eTBevqFlSRBbPEoI7pKQ4X57tnwdXd01S3hW3W4UlwDI+YpQFdQ6nGxceM6zkThTm1e qQ0g== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 134.134.136.126 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: AGRZ1gJ4YTAM2AEmyOTV2IHdPluwr3AlmVHyZ9m747E1L6p3ErF8zW3b aGP/uOFxu9XHpEo0AykoeE1x2aPZ7tWi8EXZDCjk6YkfHideY/v7LoukQxRft3Epz5RtZ5fxwOG bu1+U8UxR2T8+sVfU2fw+Qif8knbSNWjkkuyrdwl5URyJktlIfeWpw3OB2QGDgu8uLg== X-Received: by 2002:a62:15c3:: with SMTP id 186mr1344487pfv.240.1542704153939; Tue, 20 Nov 2018 00:55:53 -0800 (PST) X-Google-Smtp-Source: AJdET5cn3k+iwXa6aHfzp5h82bpBOgU7ybgi21jgj8Hk7BmmLcfLZ4jH49Ljuu2pDmt/Oh4TMUh+ X-Received: by 2002:a62:15c3:: with SMTP id 186mr1344436pfv.240.1542704152658; Tue, 20 Nov 2018 00:55:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542704152; cv=none; d=google.com; s=arc-20160816; b=NfznVRLcwcQkhCYUfQeHpzTId22vYp6O8T/8JrhO0F68sLcqeTDk0XaKSldeQmMVy+ 5sdL1671gWIdCRpY/6CL6uZ2H4orxHopX7o62tcQ0mGiQQ0lZT2YdC9xgjX2VVcMnwNt JpEcJax9Y0FmyxBDeZkc9/i5bqSxSqRiTmIXoGNcfjTaPLd7TTKGwyAcBV2QdmPyqpSb hD6nStRnJMUaHXDrXeLtqJBUHhbLqDYLTJRbhB99tTuIJW5/OBrUrDOEEHvCb4Fn66mD n76AjClkl49+g8iFa6eSnnDX//lKXEkuxnPAm+2YVn79TowYasbDsuGU1jK9IQtEBH2s yoaA== 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=PneHrFIvBxeR39UtwCqcyYL55SkL1f0iPo6rjUY3mOU=; b=fEgaK8j86hkqQoipxXUMD6fOKwHmOlxtonXElW6JPLTqlNmqavaU+luEunLEXW1/rG rVHSIxu5j+bTTFUEvD1LVwac3BEnsvJFuQiVXHku4MU7tKkEphmUmt3hCme4StpmxOHa R4DAH5gYxoyeziaVyswEA1DeE9yire2a/TPWK2/30L6e6QtCZ6ze8lJqfK48+uWpAJml gkxGY8vkQaqZu7UFST0MNZKK9VieombfiCAHTTKTvvgwJVaoWocpTZi6VO+BVE8eAc7b ztBL4PJwxoLK4USEU6Y62+LIbMT9H+Z/NYOIKrn8brP3ypgDoPtQWup7E3QPjaj9ojrC FVfw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 134.134.136.126 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga18.intel.com (mga18.intel.com. [134.134.136.126]) by mx.google.com with ESMTPS id u9si42237341pgu.570.2018.11.20.00.55.52 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Nov 2018 00:55:52 -0800 (PST) Received-SPF: pass (google.com: domain of ying.huang@intel.com designates 134.134.136.126 as permitted sender) client-ip=134.134.136.126; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 134.134.136.126 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 orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Nov 2018 00:55:51 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,256,1539673200"; d="scan'208";a="106105938" Received: from yhuang-mobile.sh.intel.com ([10.239.197.245]) by fmsmga002.fm.intel.com with ESMTP; 20 Nov 2018 00:55:46 -0800 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 -V7 RESEND 18/21] swap: Support PMD swap mapping in mincore() Date: Tue, 20 Nov 2018 16:54:46 +0800 Message-Id: <20181120085449.5542-19-ying.huang@intel.com> X-Mailer: git-send-email 2.18.1 In-Reply-To: <20181120085449.5542-1-ying.huang@intel.com> References: <20181120085449.5542-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 aa0e542569f9..1d861fac82ee 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;