From patchwork Mon Feb 24 16:55:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 13988509 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 1DDCDC021BB for ; Mon, 24 Feb 2025 16:56:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 326D3280006; Mon, 24 Feb 2025 11:56:46 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 2AB6F280002; Mon, 24 Feb 2025 11:56:46 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 061AE280006; Mon, 24 Feb 2025 11:56:45 -0500 (EST) 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 D3E2F280002 for ; Mon, 24 Feb 2025 11:56:45 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 9435F1C988F for ; Mon, 24 Feb 2025 16:56:45 +0000 (UTC) X-FDA: 83155442370.28.B320FDF Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf24.hostedemail.com (Postfix) with ESMTP id 4A23718000C for ; Mon, 24 Feb 2025 16:56:43 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=SpfcU5I8; spf=pass (imf24.hostedemail.com: domain of dhildenb@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhildenb@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740416203; 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-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=I7/ovFwFtUshRpZfEG8TPamCJVjib0AvdCdidGnTX/0=; b=YXA5NNuh3ykKIGJRYvj9pxP/GElub+PIlH6Hrqpu/WvkrIbEGAsR7PcOBuPv9e5Tkc8gwt npEIZO8ta2WLN88DSqHXscPEbQbWyC9/nFPxvQjLYTApUyjWzHG6qzw+iLm/ZtdOwPfHUO EBu4G0FkHpXnhnlx4kxD8rkpDt4hC4M= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=SpfcU5I8; spf=pass (imf24.hostedemail.com: domain of dhildenb@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhildenb@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740416203; a=rsa-sha256; cv=none; b=q8q7878dYvNv3g/H9GLul+xV+ILwm2IKdDSbTfh33zAC/yVn+E1LvMm/32wJ+pC5sUtlGj vk1mHDn1lfyWkd9hR3qgb5QQPlGCoph10hw+kM6A5xjglUFt8a4q4mOEj+qMBW1DFVqI0Y 64hrVebryQnwfpEJO6VWcCfOFoCQWHA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1740416202; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=I7/ovFwFtUshRpZfEG8TPamCJVjib0AvdCdidGnTX/0=; b=SpfcU5I88Xk+/K0JQ5hYodIX/U4qcaUpe2MpqlKEq4QGZ9UEDn8+WWUsG1xg0mzrUlHFd+ 8Z5IPRjJbZ2GsWvW2tQZtMU7E0e9Z5tIQos5kaJSv34gLE6Y9OrmmB0+nbffEV5UDThbg7 DwJvt+Uh0apTHtFuD+Ek9wjuo9Wtsfs= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-280-RxofC5BNOW6OeR1Jmv-_AQ-1; Mon, 24 Feb 2025 11:56:41 -0500 X-MC-Unique: RxofC5BNOW6OeR1Jmv-_AQ-1 X-Mimecast-MFC-AGG-ID: RxofC5BNOW6OeR1Jmv-_AQ_1740416200 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-38f34b3f9f1so3474966f8f.0 for ; Mon, 24 Feb 2025 08:56:41 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740416200; x=1741021000; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I7/ovFwFtUshRpZfEG8TPamCJVjib0AvdCdidGnTX/0=; b=Z8pVFq6D/kFNv5NLJUmMG51f8NikDkx2E435NPDfShs6IWoetux70QCB4KnaUms6Q9 EPMi1GY5XOCr+fxNvB/h+yvoPxbVoVB87IYYNg9jH7HVLK5SlUOwE2IshQsQNAjCCt35 EMd3D0CBbVt9CoTQ3B7g8CXMkIVUijwbxsqOAlM2+UnKkTGjmb3tJ+53spKyLVUEskCr nlI8tGzNB8a4KIZhiJPLzHKCvvXfwLU+VLBX9TWcDohAR7SEwWWk1w0E3EWL2sdLBzYX BeRa+5ccYn9SuNRSlG3ddZ1ca3rzr2xQ90VD7GlorySjuBYCKjIEFo7ln0Q9CDvrjiBN aAug== X-Forwarded-Encrypted: i=1; AJvYcCUkEciGycSMCYVuQ7lNRYH7Fl8HedBhm2pIQdMubuGm5Wu0HTGW71IbcMrlnRuy9gJsHXceLf1cfQ==@kvack.org X-Gm-Message-State: AOJu0Yw3B4mJBdZ4YtBGJ8Dcoi0pHHi0dAXNX+SCbF3TwZJUPS14EHTT 7xKnd/MyX0Sa3ZDgY2iy/jGbBKEcPij/X0taqgio+TAIji7LyeKJQwWbk4s0jdguBekcRgNTipy NsIgXNGAX6PBWY5PmKyv4AU6wuOUoTFIei1NE++il/S/T64IU X-Gm-Gg: ASbGnctnAYeHvBzWcV9NJYAnAp/XfufTeWYFQ4BXL5Y5RkSiveQoaCMJZGLdUDnjKhu w6zJvFEfv4Bd/IXR2J7XylTZUMY6Fl8qY0nUnxkk0GxIMtcAxrp+BN2/cbOVrlgy6BbdWhASCM+ CF1/myuwcwlyrDtvpIvD3Pnck1dxTDuKEDxCal7oFy+ajSCOi7Zx0+mptKb1Dun4JGAiLpuETkr 7l+P7houcqr+E8oQAIy29/C9C1vwCwrhb5GLRuffCcr0J2mTagrEl8zdIxfb7IQc4LR+805ZZkO 9fMuK7HTW3nNBpqVM0G31RJEwvfaleYF5P45rJfjIA== X-Received: by 2002:a5d:588d:0:b0:38f:330a:acbc with SMTP id ffacd0b85a97d-38f6f0c743bmr12449964f8f.54.1740416200265; Mon, 24 Feb 2025 08:56:40 -0800 (PST) X-Google-Smtp-Source: AGHT+IFfMgOxaCcP3QUPAwnlgJXjUNV21VqnGE//pcrHn7Js38XBMUq8lKiO2xorUlCAe/uWbu52qQ== X-Received: by 2002:a5d:588d:0:b0:38f:330a:acbc with SMTP id ffacd0b85a97d-38f6f0c743bmr12449918f8f.54.1740416199872; Mon, 24 Feb 2025 08:56:39 -0800 (PST) Received: from localhost (p4ff234b6.dip0.t-ipconnect.de. [79.242.52.182]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-38f259f8121sm31621452f8f.88.2025.02.24.08.56.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 24 Feb 2025 08:56:39 -0800 (PST) From: David Hildenbrand To: linux-kernel@vger.kernel.org Cc: linux-doc@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, David Hildenbrand , Andrew Morton , "Matthew Wilcox (Oracle)" , Tejun Heo , Zefan Li , Johannes Weiner , =?utf-8?q?Michal_Koutn=C3=BD?= , Jonathan Corbet , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , Muchun Song , "Liam R. Howlett" , Lorenzo Stoakes , Vlastimil Babka , Jann Horn Subject: [PATCH v2 16/20] fs/proc/page: remove per-page mapcount dependency for /proc/kpagecount (CONFIG_NO_PAGE_MAPCOUNT) Date: Mon, 24 Feb 2025 17:55:58 +0100 Message-ID: <20250224165603.1434404-17-david@redhat.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250224165603.1434404-1-david@redhat.com> References: <20250224165603.1434404-1-david@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: XkoYpkgQsPFFRN0myMT-6JKlzVvfCxVSlWTvf-t3gKQ_1740416200 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true X-Rspam-User: X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 4A23718000C X-Stat-Signature: howbfca7agc89yzqhz7p6kc86r9j34ma X-HE-Tag: 1740416203-161957 X-HE-Meta: U2FsdGVkX19O4toe8bS61MnF/crElU3NtqaGI4+tUeJDE80qh01SzaJSvUS143OEWub/ut3I6j/WC694RJf1UJqHBk7IMFZtGrTvaMnonUCPu1l6jtdJHSHmMAj5H8MZqv/8MOmhfwZwUTmtkMNmso/mNc3Arsf9do2104sKykIdOWFLuxtHb5PLh47Bo3LlxtWbVmxSuwX7wejfYC7QRHT49jwwsCrMj//dzRdzPD3saGyHkcD4p43wuAWj2bDv/GENKsXZRQzgYohTTs1qtsWLA0M7+03qiyCRPcCFqYQ03NMu8ktllf74uRvoyy73C8ufGumj6RJiTETJqlg7kd/63tSqIPFkNumezVB26FXZh8o/9r3KjAk5i/2lUYlMsOUnBNazOOFrlpOQSvN2oniPbcRAbQPoT+bhQcexdFMBng2R9YoCJM9HX8S6U273BnG6Fb7AMnQCA3Gj7WfKG5K70yLetMPmY9Gk4bN6RhUBRvn+/V7rolbSiO8Ve+q4rYiESwDvmWQqecdEutnumh9BfPAFnytgMKWvX6022H28CKgG8mOScptdCUYAG5E/ubkrYSHpXYxzLfU1RKbcENpXcAncQRpuOhl0/19OCRZa/AqG/WvPbtpaCmaUSAlhF3/lryeVfSoHAKvJptO6xatRgxjRQZL3z3OCmIE/g+lJFFglY0snMNZb/bx0+AGJlqJsBzhXzsmcNVo9pJrQYS2JM16OXhLwA7Ffi2PlmXi8e63vdwyBVQIxY9lspMvBZRGbR9Af5Oet6ChCq3X8mkVEC99JGcWIskBnDM0MTEz4iyzeIOiwMzEpo96jKdpbNpruqalJj3ZP0vndiPxN4gkGIN4l8vWh4r6sr3jS9NNzPCxX0rsgidTbsDV+8J7QfaEgZHu2TG4+Tn1RxBikb6PQy88L74ftbz02aL3tufWnsJRhfCIubWwn9Uv7+r316GxI/fep2t6lcFtBMO9 qebxatuQ XIODpUTA/3lmjDczNt0I0n8uzRwts2C0CQ7IBZjpsKakrWLznE13um6L8dUkuElbVAbyPNct6mMApsr9saeUmOAQ2UJ1T7pcyRRG1VG7povI3lOuXaSBsrZeacpGWw+7/qD67WxMUHf2e0acF7y+Y7zfM61U/GFRniPQj3MGeyp2RV4mqCheAc+p5XyN06P/poO33CWUG9ifvcWG+4W0TMhM7OQfQdm+YkjBQ0GCcyg3raMAyNrLQr1Q39d5/mJbzJSL4s3nsmaVN5xFIwRfeZ0JvCDK6VjZHgPeGYcZuMh9waZLNJeiKWroreEYW/4eNrR8jDVd1GVmBdOOn209ICSnL6k1K3xBuP3tjh8NRUorvbxiTXGOe/AdAh7OwuXeVEFu/waURQfJsZZXpUOeoYoW1xRGf0SjiAi6ZWLvkHkTT9Ixa6r5cBysjyGqmdqpwMUIJ27bLDYPz2PwrajNJ3LkGOSjJwuBvUCXWNfBgAn4ncl+JWwJCKt4rkKgfI48ubw9hfIIH1L0W4XX+X08j+bxMFipyx5s4yIDdXemEwirXdrWpRk76xgJPq1hYmO6owcKAr8YBhYNcNAM= 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: Let's implement an alternative when per-page mapcounts in large folios are no longer maintained -- soon with CONFIG_NO_PAGE_MAPCOUNT. For large folios, we'll return the per-page average mapcount within the folio, except when the average is 0 but the folio is mapped: then we return 1. For hugetlb folios and for large folios that are fully mapped into all address spaces, there is no change. As an alternative, we could simply return 0 for non-hugetlb large folios, or disable this legacy interface with CONFIG_NO_PAGE_MAPCOUNT. But the information exposed by this interface can still be valuable, and frequently we deal with fully-mapped large folios where the average corresponds to the actual page mapcount. So we'll leave it like this for now and document the new behavior. Note: this interface is likely not very relevant for performance. If ever required, we could try doing a rather expensive rmap walk to collect precisely how often this folio page is mapped. Signed-off-by: David Hildenbrand --- Documentation/admin-guide/mm/pagemap.rst | 7 +++++- fs/proc/internal.h | 31 ++++++++++++++++++++++++ fs/proc/page.c | 19 ++++++++++++--- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Documentation/admin-guide/mm/pagemap.rst b/Documentation/admin-guide/mm/pagemap.rst index caba0f52dd36c..49590306c61a0 100644 --- a/Documentation/admin-guide/mm/pagemap.rst +++ b/Documentation/admin-guide/mm/pagemap.rst @@ -42,7 +42,12 @@ There are four components to pagemap: skip over unmapped regions. * ``/proc/kpagecount``. This file contains a 64-bit count of the number of - times each page is mapped, indexed by PFN. + times each page is mapped, indexed by PFN. Some kernel configurations do + not track the precise number of times a page part of a larger allocation + (e.g., THP) is mapped. In these configurations, the average number of + mappings per page in this larger allocation is returned instead. However, + if any page of the large allocation is mapped, the returned value will + be at least 1. The page-types tool in the tools/mm directory can be used to query the number of times a page is mapped. diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 1695509370b88..16aa1fd260771 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -174,6 +174,37 @@ static inline int folio_precise_page_mapcount(struct folio *folio, return mapcount; } +/** + * folio_average_page_mapcount() - Average number of mappings per page in this + * folio + * @folio: The folio. + * + * The average number of present user page table entries that reference each + * page in this folio as tracked via the RMAP: either referenced directly + * (PTE) or as part of a larger area that covers this page (e.g., PMD). + * + * Returns: The average number of mappings per page in this folio. 0 for + * folios that are not mapped to user space or are not tracked via the RMAP + * (e.g., shared zeropage). + */ +static inline int folio_average_page_mapcount(struct folio *folio) +{ + int mapcount, entire_mapcount; + unsigned int adjust; + + if (!folio_test_large(folio)) + return atomic_read(&folio->_mapcount) + 1; + + mapcount = folio_large_mapcount(folio); + entire_mapcount = folio_entire_mapcount(folio); + if (mapcount <= entire_mapcount) + return entire_mapcount; + mapcount -= entire_mapcount; + + adjust = folio_large_nr_pages(folio) / 2; + return ((mapcount + adjust) >> folio_large_order(folio)) + + entire_mapcount; +} /* * array.c */ diff --git a/fs/proc/page.c b/fs/proc/page.c index a55f5acefa974..4d3290cc69667 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -67,9 +67,22 @@ static ssize_t kpagecount_read(struct file *file, char __user *buf, * memmaps that were actually initialized. */ page = pfn_to_online_page(pfn); - if (page) - mapcount = folio_precise_page_mapcount(page_folio(page), - page); + if (page) { + struct folio *folio = page_folio(page); + + if (IS_ENABLED(CONFIG_PAGE_MAPCOUNT)) { + mapcount = folio_precise_page_mapcount(folio, page); + } else { + /* + * Indicate the per-page average, but at least "1" for + * mapped folios. + */ + mapcount = folio_average_page_mapcount(folio); + if (!mapcount && folio_test_large(folio) && + folio_mapped(folio)) + mapcount = 1; + } + } if (put_user(mapcount, out)) { ret = -EFAULT;