From patchwork Mon Feb 24 16:55:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 13988510 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 63C73C021BC for ; Mon, 24 Feb 2025 16:56:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6F6F5280007; Mon, 24 Feb 2025 11:56:48 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 67B17280002; Mon, 24 Feb 2025 11:56:48 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4CECF280007; Mon, 24 Feb 2025 11:56:48 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 2E652280002 for ; Mon, 24 Feb 2025 11:56:48 -0500 (EST) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id E6550B6E48 for ; Mon, 24 Feb 2025 16:56:47 +0000 (UTC) X-FDA: 83155442454.22.224FECC Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf13.hostedemail.com (Postfix) with ESMTP id 4F6D720013 for ; Mon, 24 Feb 2025 16:56:45 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=g5xHBKQv; spf=pass (imf13.hostedemail.com: domain of dhildenb@redhat.com designates 170.10.129.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=1740416205; 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=qrzeSAQepC6qjgZK5hS618fC1aWLshwTFA4Bvic/TRg=; b=O/CUvelHdqbN/+42VQobPCT5lBxQzvX0ITHfuNEkqVfqFLAqoKp6z6oTkJMMgeLiS7n0P8 SDoF8ETlgC3WByal9+QRFOC7K/SVASkHDudi1aAH+GWqQL8SSDvgLrNU0+nEfgFEHdzvgZ Zge+ICKDXA6QfMnLuRkIoXIFvFB8v1A= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=g5xHBKQv; spf=pass (imf13.hostedemail.com: domain of dhildenb@redhat.com designates 170.10.129.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=1740416205; a=rsa-sha256; cv=none; b=S5W1Q4SBP7BIQA2xjHS7Kq5vNSXegHZBrj1mwO1w8gWJXns1IEHj0eHMcpD+dSOB6iDOO7 Fp4JO9/dOv7MPRlaRSYxi7YrLgd6zdLoUktSpZJdCJqjKAwIDeD6w9l1SRDKZiHu39tRTB RT9sxpAej7BoJyw5DyfQWs8v/xv+GZA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1740416204; 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=qrzeSAQepC6qjgZK5hS618fC1aWLshwTFA4Bvic/TRg=; b=g5xHBKQvdkwgISSU+dIfZMZYJR8gFd/AXuF04vcX3LaaKeWq5eE10Ubf2krd5JnyVFL8PQ AQKgDBJ9sDN81vwrAbgT7zR6uJJxBx5Rtp4Dod+oxrl30VCSZDcoMCUldb9oV62MZx9wcB XFE4EbZR1jywW3uPFksa9zLF+KqDB0c= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-461-Bn2W3iKIPsKUDiq-QaLFNw-1; Mon, 24 Feb 2025 11:56:43 -0500 X-MC-Unique: Bn2W3iKIPsKUDiq-QaLFNw-1 X-Mimecast-MFC-AGG-ID: Bn2W3iKIPsKUDiq-QaLFNw_1740416202 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4393ed818ccso34921195e9.3 for ; Mon, 24 Feb 2025 08:56:43 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740416202; x=1741021002; 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=qrzeSAQepC6qjgZK5hS618fC1aWLshwTFA4Bvic/TRg=; b=e97BNKzbeH7uPOrScv3luBhxIruIYyOHdq4SS6G8cEpEmzPcl+Y6veFmjmewFPQliV jGGeYR86+cJHjb+qvAub4mndz5nfpyg3ifOxeL3g041RKsz30+sM+zYxlDSinT64gLZx 6chUxWqSaZkpysocIPm9JTnAIkYIEqq9xjB4P9flawehdJ213sBc+6Dfio+iYf0fwHMc 7bfjhGGqD47x+2tVwdrLdy9xjaU4T4DOfKX9/hEntnZS/bPgms6X7Tae5GkZ2HUp1/GV Mkk8pxxnloEqnBpfTjSmJQLfAlhW8CrImw/kQZB5b9+dO8xKDlXsoP3t600Qi+ZxLg4r hJ8Q== X-Forwarded-Encrypted: i=1; AJvYcCWYSLVfEfnH+rTBqIG2w9r8X58azCDpDCo0eHfLFzTrPBYrFKoYc+3QIVuPKVyXqifGn4OrR4CTUA==@kvack.org X-Gm-Message-State: AOJu0YxTs1QRQVOmQZplIe8V2iRScw6V7qwmDvXJ27LcuYn6ak/K5cNi 0RSihO96ojw9CFTTke7JV1kkxwZkpU/ll+JYv3B6TMvbRf5+6pHb/y0sWQBWxl3DEhos3kIlZ3q gvhsqCJEznrYsZ8RBp0qcZX0jLi4EPYxHoI4/8uCmROgig/Ks X-Gm-Gg: ASbGncuttfvsA8DepptSmHHfs0vpOOhmi18BlbQP8V0ftVQTMBXNeUCE3qQwkMpS1pq Apd6ze6XuSedQPRY30pezzKAm9vFqGIU66UVM1ul9vwP1u9jO3oO4G7l4O711v9ArO0rB+WPu2R ZylJqel5CY12DrMK4fMc25bC2sRC1GJH5I253vr3PZm7xJiwMiEfDcsrhVpqTTcO76KW0H5fPGR 0e5RDbrR0ZBm4rKQiqJo/1pvhl2lrUfoSde4/+EBnd299b99SONqNA96hPjdosfmt6muyQycwFg gLPWSghtwuE8iE8XIQiGEdwm5lAxOn9p4oZo12AUVg== X-Received: by 2002:a5d:588d:0:b0:38f:330a:acbc with SMTP id ffacd0b85a97d-38f6f0c743bmr12450062f8f.54.1740416202166; Mon, 24 Feb 2025 08:56:42 -0800 (PST) X-Google-Smtp-Source: AGHT+IHB6f6br0E5FryNlZozgeR2JsRbAfPcg+xWwWdf/YpxK+ukwffc3aXIkqUDyRFtyhNU8GNoFQ== X-Received: by 2002:a5d:588d:0:b0:38f:330a:acbc with SMTP id ffacd0b85a97d-38f6f0c743bmr12450037f8f.54.1740416201773; Mon, 24 Feb 2025 08:56:41 -0800 (PST) Received: from localhost (p4ff234b6.dip0.t-ipconnect.de. [79.242.52.182]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-38f259f8602sm32962279f8f.94.2025.02.24.08.56.40 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 24 Feb 2025 08:56:41 -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 17/20] fs/proc/task_mmu: remove per-page mapcount dependency for PM_MMAP_EXCLUSIVE (CONFIG_NO_PAGE_MAPCOUNT) Date: Mon, 24 Feb 2025 17:55:59 +0100 Message-ID: <20250224165603.1434404-18-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: 6Hk5i2fQK52iHkOTzbLOEyKnLZaxoxtRIQXnwgKfj9Q_1740416202 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true X-Rspam-User: X-Stat-Signature: fznm5q3nc914hmstoto4b557kx6k566j X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 4F6D720013 X-HE-Tag: 1740416205-102627 X-HE-Meta: U2FsdGVkX1+t/pXcUydb5TjqrMNtSSkybKbHFFN2nLuApvhIHYrFY5VUKbrij9F0BQDpfdII1WNasihEeOe43cOmUyrTsYHSRY9Q8MLNcxAcwD9FUEK3xJ/fMYfQravsk0i+aLfjhageqgpZ1AC29iD9rYZlM7Sxd6TYXHHbwhjUOu2meVhJvPhwf1SKXP2Ky2L7P+4waAsUTX7lR/1Tn8FTnYpj4e9rcpHt0b8n4uTM/aUs9NjJ+pOeLZECFuGcCHFJ9WF1qEHWlvZsk9fXCU+yD2vfmDmG9TP+6znH9FNDtRnX+bKuqb1y82cy8PQvcX4xaRbajToTFj+gboP+V+skHwhTi0yjWIN/H5Dy8fdgiZxdQPidrwyZFUdVvR3CbGx5KjfX41XQXBPaSpxDRJwZgBEfvJtV8Fo0YKqx0J0gIO1qOGaVJegLYaejocvEbf90tleloozoAW8X1S5UXPxMqgGOt849z5mue4ELprsYeduZ9HiI/uing9SOQWth1yhcn/3TnsKX3DOyvrfbj4wR7Mr/GiHQDqKYgBT9tFuoP6iWZtFzsZ2ptaU59OjxKMEQPRVMi7l6u8Y6efzR9luACOKdwIEb2M/RbTprZekcAUNgHV1N9wmemQT+wx6aQtOaMkpj8QJF/4tCSChsOGDIn0itLa5WP+yiBJccjraD0hKj+o+mA1lNj9L7Mzy7DZNRN/Dd2udrVKKhLuY+lJC5+KTvF9wpVBg4Ojf1lVQCem8u0qwwBOyCTw6eL7nd0nijsv5hh5gp9AlMhT6BQYFyJAQRH8UFX9w447sU9Sifcpr4D38GOBrFB57Og46gcVKqcjGZUfrNyAXG1SyhtdLZhXEXW7tdkB29lJ1Nj1MR9Xl8tfkd0k6QojngpabSLPvS7knmh1CqallasXaYNINZEUJW3b1/Lswq7t4xPih+7rb6PStihm4e9lNRcislALJisH0Juk1mmjnVO6R Oefd6sOx c8IZnOJ5E3KFh3SwIP0Q7ARPAx0jqILXM01aP149Gh/jMVEaH9wx+HWKjAZd4FZp0VWzDZVVg5ZEdKbFQd7wU7vlZiRUEuO0zbR2Vq/BVB6b0i357qu3JkzrLVqQOsFpCoVYJ8WZZkqjRbCXpmmG3iO1+adKp04VYfRL0xK9vjO4uECAEkKvR5na8ZubMG3ggZKWe0L5lrjAb5OI7zkZVfSLl6LpKCDz5/bc+L9A9rEdAgzXx9FqxnYzB90pWoxJW6J967CY76IRwsjJQuusUjvDSNuLQdW3zxLDDsA/y/ffgkZDUBiHYZ4lVQDSkcaVAJPVuQqpV/8O7yWV8D/cwnxMUhaGT5GfLH6OVvLpKcRk1x1ogAP1v4/RZqYChkUdumhyIinBNO7LCDzWFaTbfCzW1y2JOSjNrbbA+TChjq74IJCq0vjijllHzMbGEmeKI/7eGBDX3RchlLyx2sQN7sva/uZe2ZaxH4fX4syp75HxwhuyNqlfIqkrNQW9Tg5OFbNKm8pfBx/52rBiJarbb77NG/7Xl/G9HvcP+pzLcNwtTj7k= 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. PM_MMAP_EXCLUSIVE will now be set if folio_likely_mapped_shared() is true -- when the folio is considered "mapped shared", including when it once was "mapped shared" but no longer is, as documented. This might result in and under-indication of "exclusively mapped", which is considered better than over-indicating it: under-estimating the USS (Unique Set Size) is better than over-estimating it. As an alternative, we could simply remove that flag with CONFIG_NO_PAGE_MAPCOUNT completely, but there might be value to it. So, let's keep it like that and document the behavior. Signed-off-by: David Hildenbrand --- Documentation/admin-guide/mm/pagemap.rst | 9 +++++++++ fs/proc/task_mmu.c | 11 +++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Documentation/admin-guide/mm/pagemap.rst b/Documentation/admin-guide/mm/pagemap.rst index 49590306c61a0..131c86574c39a 100644 --- a/Documentation/admin-guide/mm/pagemap.rst +++ b/Documentation/admin-guide/mm/pagemap.rst @@ -37,6 +37,15 @@ There are four components to pagemap: precisely which pages are mapped (or in swap) and comparing mapped pages between processes. + Note that in some kernel configurations, all pages part of a larger + allocation (e.g., THP) might be considered "mapped shared" if the large + allocation is considered "mapped shared": if not all pages are exclusive to + the same process. Further, some kernel configurations might consider larger + allocations "mapped shared", if they were at one point considered + "mapped shared", even if they would now be considered "exclusively mapped". + Consequently, in these kernel configurations, bit 56 might be set although + the page is actually "exclusively mapped" + Efficient users of this interface will use ``/proc/pid/maps`` to determine which areas of memory are actually mapped and llseek to skip over unmapped regions. diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 2bddcea65cbf1..80839bbf9657f 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1651,6 +1651,13 @@ static int add_to_pagemap(pagemap_entry_t *pme, struct pagemapread *pm) return 0; } +static bool __folio_page_mapped_exclusively(struct folio *folio, struct page *page) +{ + if (IS_ENABLED(CONFIG_PAGE_MAPCOUNT)) + return folio_precise_page_mapcount(folio, page) == 1; + return !folio_maybe_mapped_shared(folio); +} + static int pagemap_pte_hole(unsigned long start, unsigned long end, __always_unused int depth, struct mm_walk *walk) { @@ -1739,7 +1746,7 @@ static pagemap_entry_t pte_to_pagemap_entry(struct pagemapread *pm, if (!folio_test_anon(folio)) flags |= PM_FILE; if ((flags & PM_PRESENT) && - folio_precise_page_mapcount(folio, page) == 1) + __folio_page_mapped_exclusively(folio, page)) flags |= PM_MMAP_EXCLUSIVE; } if (vma->vm_flags & VM_SOFTDIRTY) @@ -1814,7 +1821,7 @@ static int pagemap_pmd_range(pmd_t *pmdp, unsigned long addr, unsigned long end, pagemap_entry_t pme; if (folio && (flags & PM_PRESENT) && - folio_precise_page_mapcount(folio, page + idx) == 1) + __folio_page_mapped_exclusively(folio, page)) cur_flags |= PM_MMAP_EXCLUSIVE; pme = make_pme(frame, cur_flags);