From patchwork Thu Jul 4 11:24:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Baolin Wang X-Patchwork-Id: 13723641 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0CB0AC3271E for ; Thu, 4 Jul 2024 11:25:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2E4FF6B00E7; Thu, 4 Jul 2024 07:25:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 28BB96B00E8; Thu, 4 Jul 2024 07:25:27 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0DE386B00E9; Thu, 4 Jul 2024 07:25:27 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id E10996B00E7 for ; Thu, 4 Jul 2024 07:25:26 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 8907CC11D0 for ; Thu, 4 Jul 2024 11:25:26 +0000 (UTC) X-FDA: 82301839452.20.15EAFE0 Received: from out30-110.freemail.mail.aliyun.com (out30-110.freemail.mail.aliyun.com [115.124.30.110]) by imf13.hostedemail.com (Postfix) with ESMTP id 8DA462001C for ; Thu, 4 Jul 2024 11:25:24 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=linux.alibaba.com header.s=default header.b=rahRraVq; spf=pass (imf13.hostedemail.com: domain of baolin.wang@linux.alibaba.com designates 115.124.30.110 as permitted sender) smtp.mailfrom=baolin.wang@linux.alibaba.com; dmarc=pass (policy=none) header.from=linux.alibaba.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1720092300; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=dbFBoHDVwoZIsZWEIcvlBAvgPzWvo4rCLj+4qVnfJRg=; b=FQhv1ZGpeojqhrNiYwV3VufuxTeJPLb7rj/ZQcBDaQBfkf68ukHSOIWcvDa/TWNEmVOK6A YPDCo5OM74C0NKYBDS6o/cEO2nTVWThzPgu0XG7uQx7c21o29bSS6jhc6wyijpv1xCbG4b dSSoXzsOYYQmAf7ikuAP1xayxKuIgDQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1720092300; a=rsa-sha256; cv=none; b=b6PolzxBoHDR2FPhlS6SWtFMeB7rBlDPzDEZ1z200SKyuOPDxTcHOU8fj2MLuVvqC8e9+L OJe70P3fg9WoaGDseLPXasvfJe9ixLQ4YWl8dhRs7g+RAElVVaZtrQnXg+nT0Fm0Skz13y CQEFXH0KnmvkdpmsnKkOoLMxrFzEPWE= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=linux.alibaba.com header.s=default header.b=rahRraVq; spf=pass (imf13.hostedemail.com: domain of baolin.wang@linux.alibaba.com designates 115.124.30.110 as permitted sender) smtp.mailfrom=baolin.wang@linux.alibaba.com; dmarc=pass (policy=none) header.from=linux.alibaba.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1720092321; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=dbFBoHDVwoZIsZWEIcvlBAvgPzWvo4rCLj+4qVnfJRg=; b=rahRraVqHt0JvpZS3K8rdTtqhqlQd8VPlNtyDEvQc3rIWtNQQKzJiRkpGxDizbzu0dW/ZgObddbO175QUlviHudZedR5yNLYVkn2gy09R3Euh6zCS8zazvS9t0uUcBcmQx7q6LydK6cf3gTT3IulNOPrk4Yd7Un4DBQcqDF7QXI= X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R141e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=maildocker-contentspam033023225041;MF=baolin.wang@linux.alibaba.com;NM=1;PH=DS;RN=17;SR=0;TI=SMTPD_---0W9qjnPn_1720092317; Received: from localhost(mailfrom:baolin.wang@linux.alibaba.com fp:SMTPD_---0W9qjnPn_1720092317) by smtp.aliyun-inc.com; Thu, 04 Jul 2024 19:25:18 +0800 From: Baolin Wang To: akpm@linux-foundation.org, hughd@google.com Cc: willy@infradead.org, david@redhat.com, wangkefeng.wang@huawei.com, chrisl@kernel.org, ying.huang@intel.com, 21cnbao@gmail.com, ryan.roberts@arm.com, shy828301@gmail.com, ziy@nvidia.com, ioworker0@gmail.com, da.gomez@samsung.com, p.raghav@samsung.com, baolin.wang@linux.alibaba.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 10/10] mm: shmem: support large folio swap out Date: Thu, 4 Jul 2024 19:24:59 +0800 Message-Id: <99a38bff0f562fe4844162f8abbe3840d1fcbbdc.1720079976.git.baolin.wang@linux.alibaba.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: References: MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 8DA462001C X-Stat-Signature: qn5sk8yix8cennw7fjxhmswiuas3a36w X-HE-Tag: 1720092324-870072 X-HE-Meta: U2FsdGVkX1/ekpadbSuLU0fqWffg3qfwrj1Csc8qDI7ZkLsZ2KP/3LnTSNwdqzX88e03M5miSwNIKeM/+TU41LkCS7ckCMIjF/LD/KwbRTrRdBrnXQM+2Q3mLViPylGiZHsrd22fD3msMn/arJiE18cDM7ThbJqJvsvLlish7liDA32xoHtepvOqmyJ0vhPjrmr4dh3FNBtSP1GjuIo7C+z+gGnHvMoWK7G6vSH8ehbNmag29gCd0/pfpdVNPDZVa5nVuaxEqzoa8IozOAivXM6qAB9YrsIlg/k/rpd/UhPfM6HG5+8Qpc7++6TQpSVVqHGmKbW1OfXPspd/QtxV/PgN8NztGwEMqOLFK291fdL6BDMh9njzvsCftihJA2WMwNA1ktn/j5g4PjzCrwAqWRf2/40aZilPSybL2RlhinqBG8mmZ65EdLEhWrMkfBFiPcusJiZOCoJU+5oBe5cpS4GVIBp9D+K7EZ0S6jiP4Ri3iyGSowJh/Qf/YXWxPPt8+yDcF11MrqUXXXZh/RFXRGvA8auDA0Jm9X/UKFqExOPRh58VjzT9jmkq+FFxIYr3phkK1DviR2jnqQI5V+j7P9JrL9LSpEQ7/KIYvmFXx9K2AHbCBOLAmop8lhbzgLvM4YN0JuCTLtAd/QwfqjXLd8i8OSoIGmpsGEAUPw3OGVSP8uMlFf/jLD9V/KVv/CiIvNMcXM7EG3m6wUeG41YV+GOx5yFktTxCzFkqDFuGxiMV4J3f9ipyg2mV1ggv1OuJzrZxgQ+nqmE+VsZY76S+qP4tALU+8n1j6meRcrLwsPSx23SreKEd2iYAOIcGCJRpWEFmwNBJVpTLAdab41tX40TbVJkc0IVeBqb8pKTTTDgbPFFuzTrvU0uvIMUt6ILNQbag7UnNS2PT0P93u1ewI4YRPLIFfCLzYFERqkRArPsT6iruXxYGWjX0Q1aS+Rg0JTxsdByp5CIfdSgyqnk UIMA8gNp MW9bMIRJIzO4/3DKLYUJga2scVhQszSBdab4vfHXHN28qrOfcyTR3Fz+tKmO5vbNc7whzej4So7pz3QzKoBxy6yJ1KXwNuRP0QAETorZ1fy9ndexgFVoUT5t6TQ/GDP+LVC8I/9KXk5rTW67Ak/xF9/RP20IBe0paW3YOGfOiMRfWGzphyHj2g/nBeUO6jrWuVQ7pFDabJO9dkhiyUlG3Ai7GF5zcuzPTfJtfIwr4JPvfBCmJpErspivflYrffPImDGdyw6SeQ9/JU3s1Gm7MIJIOnr33f88H8ztTe10pa24aLMy+kSF+bEAuUprmfVoUykKJ 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: List-Subscribe: List-Unsubscribe: Shmem will support large folio allocation [1] [2] to get a better performance, however, the memory reclaim still splits the precious large folios when trying to swap out shmem, which may lead to the memory fragmentation issue and can not take advantage of the large folio for shmeme. Moreover, the swap code already supports for swapping out large folio without split, hence this patch set supports the large folio swap out for shmem. Note the i915_gem_shmem driver still need to be split when swapping, thus add a new flag 'split_large_folio' for writeback_control to indicate spliting the large folio. [1] https://lore.kernel.org/all/cover.1717495894.git.baolin.wang@linux.alibaba.com/ [2] https://lore.kernel.org/all/20240515055719.32577-1-da.gomez@samsung.com/ Signed-off-by: Baolin Wang --- drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 1 + include/linux/writeback.h | 1 + mm/shmem.c | 3 +-- mm/vmscan.c | 14 ++++++++++++-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c index c5e1c718a6d2..c66cb9c585e1 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c @@ -308,6 +308,7 @@ void __shmem_writeback(size_t size, struct address_space *mapping) .range_start = 0, .range_end = LLONG_MAX, .for_reclaim = 1, + .split_large_folio = 1, }; unsigned long i; diff --git a/include/linux/writeback.h b/include/linux/writeback.h index 112d806ddbe4..6f2599244ae0 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -63,6 +63,7 @@ struct writeback_control { unsigned range_cyclic:1; /* range_start is cyclic */ unsigned for_sync:1; /* sync(2) WB_SYNC_ALL writeback */ unsigned unpinned_netfs_wb:1; /* Cleared I_PINNING_NETFS_WB */ + unsigned split_large_folio:1; /* Split large folio for shmem writeback */ /* * When writeback IOs are bounced through async layers, only the diff --git a/mm/shmem.c b/mm/shmem.c index b4468076f0e9..d93efcc64c3d 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -786,7 +786,6 @@ static int shmem_add_to_page_cache(struct folio *folio, VM_BUG_ON_FOLIO(index != round_down(index, nr), folio); VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio); VM_BUG_ON_FOLIO(!folio_test_swapbacked(folio), folio); - VM_BUG_ON(expected && folio_test_large(folio)); folio_ref_add(folio, nr); folio->mapping = mapping; @@ -1473,7 +1472,7 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc) * "force", drivers/gpu/drm/i915/gem/i915_gem_shmem.c gets huge pages, * and its shmem_writeback() needs them to be split when swapping. */ - if (folio_test_large(folio)) { + if (wbc->split_large_folio && folio_test_large(folio)) { /* Ensure the subpages are still dirty */ folio_test_set_dirty(folio); if (split_huge_page(page) < 0) diff --git a/mm/vmscan.c b/mm/vmscan.c index 61465f92283f..fd503506262d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1245,8 +1245,12 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, if (!total_swap_pages) goto activate_locked; - /* Split shmem folio */ - if (split_folio_to_list(folio, folio_list)) + /* + * Only split shmem folio when CONFIG_THP_SWAP + * is not enabled. + */ + if (!IS_ENABLED(CONFIG_THP_SWAP) && + split_folio_to_list(folio, folio_list)) goto keep_locked; } @@ -1348,10 +1352,16 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, * starts and then write it out here. */ try_to_unmap_flush_dirty(); +try_pageout: switch (pageout(folio, mapping, &plug)) { case PAGE_KEEP: goto keep_locked; case PAGE_ACTIVATE: + if (shmem_mapping(mapping) && folio_test_large(folio) && + !split_folio_to_list(folio, folio_list)) { + nr_pages = 1; + goto try_pageout; + } goto activate_locked; case PAGE_SUCCESS: stat->nr_pageout += nr_pages;