From patchwork Fri Mar 8 09:27:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Barry Song <21cnbao@gmail.com> X-Patchwork-Id: 13586609 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 1D7B1C54E4A for ; Fri, 8 Mar 2024 09:27:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 63B916B0360; Fri, 8 Mar 2024 04:27:41 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5EBA16B0361; Fri, 8 Mar 2024 04:27:41 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4B3096B0362; Fri, 8 Mar 2024 04:27:41 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 3BAFA6B0360 for ; Fri, 8 Mar 2024 04:27:41 -0500 (EST) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 095A31C17EC for ; Fri, 8 Mar 2024 09:27:41 +0000 (UTC) X-FDA: 81873344322.17.0B2E8F7 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) by imf24.hostedemail.com (Postfix) with ESMTP id 65344180011 for ; Fri, 8 Mar 2024 09:27:39 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=LSr6ODpc; spf=pass (imf24.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.214.178 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1709890059; 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:references:dkim-signature; bh=ROBScL3zNq1ROLO+Gfcm3K4UycGbv1h+36uGZvQyywk=; b=M2pzv9WcUrBC3kL3XatCBSHArxk+xJokfg1+a/cMZBYTDPLxZJ/KvC46Uyjb17EtFcvA/0 wutRkm0lTykJGu23xEBtlZD4rF0/iebcv8DKIU5h0awhf4PK1Tp1f04XtuoSgU4/fu5Hne l7wIds2cANabApP3KGHQl4rstYE5o9A= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1709890059; a=rsa-sha256; cv=none; b=qTQWujVPZYVGSG0oxeThfZI6DcJbzDgJa/6czfOhlaSFgC9fthkwgNQeHHV/mRSUlR1+Ra BNdWvuOdPUUQLrcD2rBcEomMWlOCOFY3ac/gWM/S9CUl8M5TgQARVqqCL0lGlqj1WEaZwy 95K9nvKdWKLuS6vEbgLqaXjW6vGTx5A= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=LSr6ODpc; spf=pass (imf24.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.214.178 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1dd0d46ecc3so14010125ad.2 for ; Fri, 08 Mar 2024 01:27:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709890058; x=1710494858; darn=kvack.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=ROBScL3zNq1ROLO+Gfcm3K4UycGbv1h+36uGZvQyywk=; b=LSr6ODpcCvHp1mpmuYCn2xySmdNGACZezvfcmuq0Qbh3WLNe6SiZN2fgprLNjneYA7 rH3S5evBbmkzFxlWudCWABzIV0LlPCcTs9tb6aMQYxXYmZxLAaunOPTb8qE7RNYAYhJO DTw+VbaD3cAEpwnd9b0kngNeOgRBn3sgFJQduM/gayZYA/NZ/l+ExjPGgOyA2YR08Glm fC6Quc4fOFfVmL76KE4sCmsFDfh+PssTt4OCCfcHch8JOCYdNXb+kX5BYWcgyRH8S5iE BkT5MjgWAk5o6EbRS+G5MJ1nuthWtUAIDb50kpNCgF9mK8gPH73hMALrYITEkfNxqBrd JGjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709890058; x=1710494858; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ROBScL3zNq1ROLO+Gfcm3K4UycGbv1h+36uGZvQyywk=; b=HfZc0seQj1Eq6+cYl8T1msI7PPhRnvWt+uEqvtk2Z1MaRc6FTX3AkBeXN6Cy/pYJMm 7xBowwN0aldcw4IUiuxxmvksa33Ffly5V8+R9GltHnD87k6dPugakIJd10W/emgICFTb cLco5qv8TKzQgmW7syYOgeusJ/dCkWUB+iftnv3EHXNmF2i33rK75J9pbXSpcWVyW5C9 oh6Neu29eepR0mDEi7xugrb9K6beqYfMnNfLDZY/BrvGHymrOT60wRqQzfHhAEPKP0SK vXBo87CroUmASKGHnklgVGsdDwlKJAvJnOMuOj4xU/36+/g9dGbz72tNn4V3Oscpo+0W OnZw== X-Forwarded-Encrypted: i=1; AJvYcCV/5lJXcanaTBoTp68+i4nHi7/oOjfcYU5TxYosFjz+/diMou1Z4+NtZqPz8UBBzs85yFWVBb0zbaQEkGYlt5zypEo= X-Gm-Message-State: AOJu0Yz/0596hMQ2InrbJJQdJXxRfc+O7fg+PgVeJdPwu/yZA76FnXr+ YFk85FHvPvuVL3E0+Ze+mbOJe6a1Hu2fZ6eGXrZDe8KqIiGj0JKQ X-Google-Smtp-Source: AGHT+IGHwvDaRFM6AdGoHqI0EnKeNjpmwOATRfsUIVKV0DDSC98WZUboWqg2XZop7gHcvnNI7NdvbA== X-Received: by 2002:a17:903:2309:b0:1dc:cc01:7488 with SMTP id d9-20020a170903230900b001dccc017488mr13902041plh.25.1709890058085; Fri, 08 Mar 2024 01:27:38 -0800 (PST) Received: from localhost.localdomain ([2407:7000:8942:5500:aaa1:59ff:fe57:eb97]) by smtp.gmail.com with ESMTPSA id d6-20020a170902654600b001dccff4287csm16129557pln.202.2024.03.08.01.27.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Mar 2024 01:27:37 -0800 (PST) From: Barry Song <21cnbao@gmail.com> To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: minchan@kernel.org, fengwei.yin@intel.com, linux-kernel@vger.kernel.org, mhocko@suse.com, peterx@redhat.com, ryan.roberts@arm.com, shy828301@gmail.com, songmuchun@bytedance.com, wangkefeng.wang@huawei.com, xiehuan09@gmail.com, zokeefe@google.com, chrisl@kernel.org, yuzhao@google.com, Barry Song , David Hildenbrand , Lance Yang Subject: [PATCH v2] mm: prohibit the last subpage from reusing the entire large folio Date: Fri, 8 Mar 2024 22:27:21 +1300 Message-Id: <20240308092721.144735-1-21cnbao@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Stat-Signature: gcho878zr9ocuibrxjk1djge67ps71z4 X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 65344180011 X-Rspam-User: X-HE-Tag: 1709890059-489604 X-HE-Meta: U2FsdGVkX18aCFFb6mDwxi3Q4rWORifgx9hpbVnveTQpO8mg+rImJj+ERI0FlwGFGc1H0bCb0Gl1OqKjcUP53hGCsDv26+E7LqezhqVzXDqMT8fiFql4B7BTH/U7chlPYQxQy5yLNxz9yAIpA40k6KxrE0Z2DVb80iAW5CAZaieW/o2TptYHsy+3ZUihnFFZ+bwmdZ7yZaavrJbi5WFiCX2Rlzo95q1cbDL9aBbQgOn5fSRMM+cK0qWwc7c8SZl3Ec/30fnIdxVsLaRaeftCpN9IE80AYAH3zpVESfMpzUyIDlTTQjXLWO6vhkJIJtBPfL6c1lNGI0Nxf44ZiekCXLp9TCAGwuw4NnOzZErpNyw6S26Egbt+bon6ahrDfLQu4UfSEvRS0cH/BrE2hWsjWjiB3CysYpyVVTnOuhNQEhI81fvL5qsiPjg5NWFnKftObIrDSSrFoIZO0983JEvpPqdIak7mvOlU3LPxolM417gI/7+MLlgnHh6WMu6LVxC+B3kXI7QZNXPtnuuHozosz6r4IeBweH6JVO5BoTIBJeM9dbnayuIpN8xzBmsyQW3EdM5xoEIdURdUubVFQ6fv2uvZclDlwChn0WpvHBZQyfS3hjSpcnqv0/T/SBA2VX+CU5FFvpgxtCjtKk8Ho6u+vQwPYszRguVMHcNQ7zfzA1kWAEtPLLZBxUVmpGNslja79dxk1AIMcgkkq6hnhbFcarKAx2Op+v0lZBS5z7hoJSPSvaeZzLMp8aanY32gB2nrX9wcPJziPcd2tz4kllj6HHDagS7IjcteMBPLOydSBNibPCBmx8u4uCT1RWZBZwWbSqL6CkbL2888113VNGGIE7TJbsaG1lzXCY95a6arhJ/5rXsWPEfqFT8TPGo9hOJ7u4/ceC8KLEJkzryF7N1yMFIOrjyQPKFkWsaXEysl5ySTWzyMPaWnL9+eXhWdOAkv8hUcqAOPdMwmYicW5qD cWjllOVt PYZBK77+zRjbArizLJ3ly9h5DdBkRxEPZh9PlA/ib+8zqoyLHCXa6i+GyxmQZUuv3Br1T/024AXdtdNEpYou7MMxSXOlCNNDmfRQz29GF5t5ENsWuWmsTLPtLiA== 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: From: Barry Song In a Copy-on-Write (CoW) scenario, the last subpage will reuse the entire large folio, resulting in the waste of (nr_pages - 1) pages. This wasted memory remains allocated until it is either unmapped or memory reclamation occurs. The following small program can serve as evidence of this behavior main() { #define SIZE 1024 * 1024 * 1024UL void *p = malloc(SIZE); memset(p, 0x11, SIZE); if (fork() == 0) _exit(0); memset(p, 0x12, SIZE); printf("done\n"); while(1); } For example, using a 1024KiB mTHP by: echo always > /sys/kernel/mm/transparent_hugepage/hugepages-1024kB/enabled (1) w/o the patch, it takes 2GiB, Before running the test program, / # free -m total used free shared buff/cache available Mem: 5754 84 5692 0 17 5669 Swap: 0 0 0 / # /a.out & / # done After running the test program, / # free -m total used free shared buff/cache available Mem: 5754 2149 3627 0 19 3605 Swap: 0 0 0 (2) w/ the patch, it takes 1GiB only, Before running the test program, / # free -m total used free shared buff/cache available Mem: 5754 89 5687 0 17 5664 Swap: 0 0 0 / # /a.out & / # done After running the test program, / # free -m total used free shared buff/cache available Mem: 5754 1122 4655 0 17 4632 Swap: 0 0 0 This patch migrates the last subpage to a small folio and immediately returns the large folio to the system. It benefits both memory availability and anti-fragmentation. Cc: David Hildenbrand Cc: Ryan Roberts Cc: Lance Yang Signed-off-by: Barry Song --- -v2: * return at the 1st beginning for a large folio according to David's comment, thanks! -v1: https://lore.kernel.org/linux-mm/20240308085653.124180-1-21cnbao@gmail.com/ mm/memory.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mm/memory.c b/mm/memory.c index e17669d4f72f..f2bc6dd15eb8 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3498,6 +3498,16 @@ static vm_fault_t wp_page_shared(struct vm_fault *vmf, struct folio *folio) static bool wp_can_reuse_anon_folio(struct folio *folio, struct vm_area_struct *vma) { + /* + * We could currently only reuse a subpage of a large folio if no + * other subpages of the large folios are still mapped. However, + * let's just consistently not reuse subpages even if we could + * reuse in that scenario, and give back a large folio a bit + * sooner. + */ + if (folio_test_large(folio)) + return false; + /* * We have to verify under folio lock: these early checks are * just an optimization to avoid locking the folio and freeing