From patchwork Tue Nov 20 08:54:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Ying" X-Patchwork-Id: 10689989 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 CBF6813AD for ; Tue, 20 Nov 2018 08:55:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BD03B2991D for ; Tue, 20 Nov 2018 08:55:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B05C929A1B; Tue, 20 Nov 2018 08:55:11 +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 2AD4B2991D for ; Tue, 20 Nov 2018 08:55:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AF98D6B1F35; Tue, 20 Nov 2018 03:55:08 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id A597E6B1F36; Tue, 20 Nov 2018 03:55:08 -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 8D5B26B1F37; Tue, 20 Nov 2018 03:55:08 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by kanga.kvack.org (Postfix) with ESMTP id 4A9866B1F35 for ; Tue, 20 Nov 2018 03:55:08 -0500 (EST) Received: by mail-pg1-f199.google.com with SMTP id l131so861174pga.2 for ; Tue, 20 Nov 2018 00:55:08 -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=rd+Rdvi1ikh/aGCw3CXR20dJILc6wIwORNlf/CuVXeI=; b=nhM0L+S6UVm0XaHhngl3F0qhk68O4K0ARMwWFyUAbPDUH8hudQ7pxinYnmIhTcB4kw g9mcURW7QrSCwxxrJrujPpVmWISZzPHGS3vsDWnEJPwrNLGTiB8KIsZojRd2jAPlAlEi 9UKKtd5Mx6xaPn1CoA+pgYvVuBBTnlA5rtmDmmL1XbCsZJ8wKD6UXBMemduTb+LhjyJG 0C+S1CYlvOQVij8HFSIVW+tEdQ0RT33i8sL6j6k0xJcAlwkm1uWvqPjvwxlAS6p4I9GO GRJKfB9Wn/DPxIXKw1sq3mErLE/KI8lVy1J025Wc9ywaJKcyrcvmwDAM7jEIrpzAHAhD r3Dg== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.88 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: AA+aEWb5rtTRWnzjiLZL+DGO4ox1g2lL47pgHwKNSRxZt1nLAVmWqXw5 74SchQcqMcINaqZmtrZjiLFXXmeVW8YTtC48BKXymUF8GtjbRn/5GBRCzk9XC19T7MOjsStrsE/ H8vbe1yM5cEl0F3V5SAy1TvaLBKAsB1/nblT3M0+1D4fm+8ifNPbHk+ySeYlWOGIuZg== X-Received: by 2002:a17:902:f20b:: with SMTP id gn11mr1259049plb.93.1542704107959; Tue, 20 Nov 2018 00:55:07 -0800 (PST) X-Google-Smtp-Source: AFSGD/Xqc8mnaXjdEXHwYeLZNcZnLkdhnJoLOTm6RJFd0+FxXtF9d+vSqkKAg4MkurMJQOAm2UKz X-Received: by 2002:a17:902:f20b:: with SMTP id gn11mr1258980plb.93.1542704106781; Tue, 20 Nov 2018 00:55:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542704106; cv=none; d=google.com; s=arc-20160816; b=jmyaQhZazKIjpEmUYjEc+abcuXNxurceRMn6ZPP8egB6OtQzFLDbw1qHqSwtgcajEc 5NGk8sw6YG6AVtlYp40wgabZ/5Lshetu0QjNK5sEPdnooT/TJ5nJZKmmvnhA+g7oei00 ZBAA+cf2cGIBqoE+oVz/8J0UKySN+qmP6mwat4evBhbeQ3Mm0I1PBV2gWE/7Pit5a6uK pmv4kfTrc26qJ+v1r3beW/r66fA7YysD+OqgMcu/DsicQF+sdbCH/OZAXyh5ipAe+YVW SQ/E+D3GIrRVKp6REAVzGFSeejFsqGk6IvxTWDVQryy45Pxn8PYCFXC5XohrljAjTV8Z GAXg== 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=rd+Rdvi1ikh/aGCw3CXR20dJILc6wIwORNlf/CuVXeI=; b=kVjw4xCXLeVKonaUxmYqwqiigII1dauh4KfxH3Ye185BD6B7SkjxBgx56Sy8CZ70HW Dc3gCn79N2lQg7yBkwjaIYwrYcCrC8hmAfYvWbwwLtGb8UJR5fqic44wPtMnTpYKq6Ty iRPLBdiMvpn42Db5T9mJszxFP8tFUrHVh1l9Pqn7gSZuq1sGTSFMKImR+FdHV+8JYAzk dRCRXBwe1Lix0XgRhx92gfPWglnKyH/lKal9PPwizJbE8GEYVYrLWkV/gAFJq361CdvZ ZBBFZpQCraS1mD/OPSPeBhSlTJtP+wohgq1ulz7HoFXgdwraVZsAFOe1+12Rhus3xlvg xX3g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.88 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga01.intel.com (mga01.intel.com. [192.55.52.88]) by mx.google.com with ESMTPS id b15si24149550plm.431.2018.11.20.00.55.06 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Nov 2018 00:55:06 -0800 (PST) Received-SPF: pass (google.com: domain of ying.huang@intel.com designates 192.55.52.88 as permitted sender) client-ip=192.55.52.88; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.88 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 fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Nov 2018 00:55:06 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,256,1539673200"; d="scan'208";a="106105770" Received: from yhuang-mobile.sh.intel.com ([10.239.197.245]) by fmsmga002.fm.intel.com with ESMTP; 20 Nov 2018 00:55:03 -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 04/21] swap: Support PMD swap mapping in put_swap_page() Date: Tue, 20 Nov 2018 16:54:32 +0800 Message-Id: <20181120085449.5542-5-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 Previously, during swapout, all PMD page mapping will be split and replaced with PTE swap mapping. And when clearing the SWAP_HAS_CACHE flag for the huge swap cluster in put_swap_page(), the huge swap cluster will be split. Now, during swapout, the PMD page mappings to the THP will be changed to PMD swap mappings to the corresponding swap cluster. So when clearing the SWAP_HAS_CACHE flag, the huge swap cluster will only be split if the PMD swap mapping count is 0. Otherwise, we will keep it as the huge swap cluster. So that we can swapin a THP in one piece later. 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/swapfile.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/mm/swapfile.c b/mm/swapfile.c index 37e20ce4983c..f30eed59c355 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1314,6 +1314,15 @@ void swap_free(swp_entry_t entry) /* * Called after dropping swapcache to decrease refcnt to swap entries. + * + * When a THP is added into swap cache, the SWAP_HAS_CACHE flag will + * be set in the swap_map[] of all swap entries in the huge swap + * cluster backing the THP. This huge swap cluster will not be split + * unless the THP is split even if its PMD swap mapping count dropped + * to 0. Later, when the THP is removed from swap cache, the + * SWAP_HAS_CACHE flag will be cleared in the swap_map[] of all swap + * entries in the huge swap cluster. And this huge swap cluster will + * be split if its PMD swap mapping count is 0. */ void put_swap_page(struct page *page, swp_entry_t entry) { @@ -1332,15 +1341,23 @@ void put_swap_page(struct page *page, swp_entry_t entry) ci = lock_cluster_or_swap_info(si, offset); if (size == SWAPFILE_CLUSTER) { - VM_BUG_ON(!cluster_is_huge(ci)); + VM_BUG_ON(!IS_ALIGNED(offset, size)); map = si->swap_map + offset; - for (i = 0; i < SWAPFILE_CLUSTER; i++) { - val = map[i]; - VM_BUG_ON(!(val & SWAP_HAS_CACHE)); - if (val == SWAP_HAS_CACHE) - free_entries++; + /* + * No PMD swap mapping, the swap cluster will be freed + * if all swap entries becoming free, otherwise the + * huge swap cluster will be split. + */ + if (!cluster_swapcount(ci)) { + for (i = 0; i < SWAPFILE_CLUSTER; i++) { + val = map[i]; + VM_BUG_ON(!(val & SWAP_HAS_CACHE)); + if (val == SWAP_HAS_CACHE) + free_entries++; + } + if (free_entries != SWAPFILE_CLUSTER) + cluster_clear_huge(ci); } - cluster_clear_huge(ci); if (free_entries == SWAPFILE_CLUSTER) { unlock_cluster_or_swap_info(si, ci); spin_lock(&si->lock);