From patchwork Mon Mar 10 14:35:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 14010107 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 A3CE4C28B2E for ; Mon, 10 Mar 2025 14:36:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 39D74280003; Mon, 10 Mar 2025 10:36:06 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3230C280001; Mon, 10 Mar 2025 10:36:06 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1505C280003; Mon, 10 Mar 2025 10:36:06 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id BA365280001 for ; Mon, 10 Mar 2025 10:36:05 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id DCDB81CACBF for ; Mon, 10 Mar 2025 14:36:05 +0000 (UTC) X-FDA: 83205891090.25.8936B6E Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf03.hostedemail.com (Postfix) with ESMTP id B5DB62000A for ; Mon, 10 Mar 2025 14:35:59 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=NUul7KRm; spf=none (imf03.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741617362; 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=WslRGGzaaI9HS/JpYja+Tlu6+ck+VQ836pJDNKbYwsM=; b=UtsB1ja1Cwuxr+EUgswiv8QeDF2Kn08Hj2dfg4Wo6X9PXz//jyMbgfrmXfkiyxJ5hq2W3g q3O+FeU7LecNTAILcinX60ERm7OOoGMuMDvi8wGYjqEziKLWxMUgeTP24ec7aFShKIYYv2 x31P3zOHjyUBeS4YmWg4Qz8uHdCEMfE= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=NUul7KRm; spf=none (imf03.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741617362; a=rsa-sha256; cv=none; b=FJViS4TQBRcRE8wXPDn79cOb/HMkBdTP9u0tSg4TqDnEAA31Icr4bs+tLXlLnbGjHPnZR/ QPNBuoHjgGfSJsV662NhvJED+wr6uANmutn5ScBQEBjYvkhcNhyaQ3YNMZZyVJgcxOUP7I bATMaLRCE4Xf8HXttQTmwodeMqCwH94= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:In-Reply-To:References; bh=WslRGGzaaI9HS/JpYja+Tlu6+ck+VQ836pJDNKbYwsM=; b=NUul7KRmOjLdxU5LJLR41epiJQ PDvs4LKC8v0gC4rhYhKaF6wmROM+7Vmx2dygOjkJT+qzhqnu/3/QyeQgYKc7AJi2y4mIAemSiuaWc PgXtPk0S2B1GAKFZzmyfptA2gVSbP6H73LGQB1b39RxeT6vxFcnNGVfzJU3V4FhYyAB9PZ1Im5gOo k+MwGorQqNh5SblaqEIafD9DpuF3RbNDNwK6LVwGHjrALdgFfpIz3N83SQLtBd572oSzOslrYHEcj 5Wh+wiYECSxbK30n3XsJkRbRRwVGQZdJgDV2kzUGl+SNTB7DA5r+vpu7OHQjiE3GTLkpx8bftCNYn f7Q/qotg==; Received: from willy by casper.infradead.org with local (Exim 4.98 #2 (Red Hat Linux)) id 1treES-000000056Vg-1EnE; Mon, 10 Mar 2025 14:35:52 +0000 From: "Matthew Wilcox (Oracle)" To: Andrew Morton Cc: "Matthew Wilcox (Oracle)" , netdev@vger.kernel.org, Vlastimil Babka , linux-mm@kvack.org, Hannes Reinecke Subject: [PATCH] mm: Decline to manipulate the refcount on a slab page Date: Mon, 10 Mar 2025 14:35:24 +0000 Message-ID: <20250310143544.1216127-1-willy@infradead.org> X-Mailer: git-send-email 2.48.1 MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: B5DB62000A X-Rspamd-Server: rspam03 X-Stat-Signature: zajgafx6eh9nuhhaykgrdww9kbieeryi X-HE-Tag: 1741617359-822554 X-HE-Meta: U2FsdGVkX1+1J9KvJpNtDMMhEqwEPNzanl/w+B4Jdg4x5HgA+PTOf9oREzesZ7vxfpSp1xB1NEWVF/z4i69D3egcrZkdhVCPeZOlVl/Nhx1KxUsvfzn9+Z76Q7oaun4cwvDZ+tzGzgfT1NR9TUWC4VkzJw/cY9rgd66r9W0CQ3cLF5A0MyMRpz0vP+zW+Skrg/wgBN7L8Wk2v/3YUTO3opfofDr1Qo37zKx4uazlbBQhSpIn3f6yRpzdIfV80TxyjrZOucnVf5b5VBwOvaklbcIeA/vxaWNCWb6NRTWXbfxJkc7unY5yJwfjOdXNHSC+z/TK8GON/Vk+igFRgZPvf84Izmtgfq00E2lJRUBwz9XgW6j3a0xwGjHG6FW9ICsuCa41lSaZPf8vdEwEFsWFxDBsFQmEA/mYTDTFqHMevjWKu2gGTNLBLUDHidS4KFd3UkSBhmqJrcgz2sYRBzPe0IO9XLLH8D4XNdRnQ6aAawLispcQNI9WUilw1E27M+Uv2hctFR98mDKc0+WgytsAvm6P59jCpgZK4VamjPFAn0eGKCdjSA9hQ9J4vsKuu/1HSI7sB5aOYY+0KPSEjNjEEafMIsdeG/h6DQcBZZS8249G55tQRT9KhMEAzfblvhmVAW//nELYzqzIptAr/LihWwetPhlpLyuks+sllArfrVsuATTELnmH4Ca0kOZFog8wt5IhRRci8aZ4SCjJcyblKZBpoqIZwCxnt/PyRIiq6/M4eLprHeOhwmPr3eXd2NvdMTdz4uQSSaAVzbPvW+Df2M6lnrvw28rxCo1YjT5LJMiv/AU8odSsF1wYuxzFCzb/dfyUlXvkdkb1jqN+GhP2B9ZGn7Xst2MkXISmsSG3LAJ7d3W7X/TrK4XHa0DxsXimdt+8te0JndoAjQHHnNXazbdvgrnDgvbADURFlZ9RwoXNDwgE8L3qLA4RwUAx1nEHvGnQZwff+xmmS32qu6u 9EutquNu TzGaj2Opm7SG7xIZVzTDNS9R1wSwqdn4fIHOwJrqfDvzuFUera9W+gyQoEtTtO/+RnVQYXR4S8+BUMbQagHSx4eIxq3iFkAvCg+5cqFLoM6Y88Jpp3T1zTuNccedrIF3dVROT8VdIPIQvdB/5ArIlsZYWBg0aXjGmwje/lzHksx+6qLLPel6Rx7IbqpHiXZfKn+FsTNR0tNV3arLe9mdpU+ltSB/Dii7AuSWVoPdqaRFXJTY= 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: Slab pages now have a refcount of 0, so nobody should be trying to manipulate the refcount on them. Doing so has little effect; the object could be freed and reallocated to a different purpose, although the slab itself would not be until the refcount was put making it behave rather like TYPESAFE_BY_RCU. Unfortunately, __iov_iter_get_pages_alloc() does take a refcount. Fix that to not change the refcount, and make put_page() silently not change the refcount. get_page() warns so that we can fix any other callers that need to be changed. Long-term, networking needs to stop taking a refcount on the pages that it uses and rely on the caller to hold whatever references are necessary to make the memory stable. In the medium term, more page types are going to hav a zero refcount, so we'll want to move get_page() and put_page() out of line. Reported-by: Hannes Reinecke Fixes: 9aec2fb0fd5e (slab: allocate frozen pages) Signed-off-by: Matthew Wilcox (Oracle) Acked-by: Vlastimil Babka --- include/linux/mm.h | 7 ++++++- lib/iov_iter.c | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 61de65c4e430..4e118cbe0556 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1539,7 +1539,10 @@ static inline void folio_get(struct folio *folio) static inline void get_page(struct page *page) { - folio_get(page_folio(page)); + struct folio *folio = page_folio(page); + if (WARN_ON_ONCE(folio_test_slab(folio))) + return; + folio_get(folio); } static inline __must_check bool try_get_page(struct page *page) @@ -1633,6 +1636,8 @@ static inline void put_page(struct page *page) { struct folio *folio = page_folio(page); + if (folio_test_slab(folio)) + return; folio_put(folio); } diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 65f550cb5081..8c7fdb7d8c8f 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -1190,8 +1190,12 @@ static ssize_t __iov_iter_get_pages_alloc(struct iov_iter *i, if (!n) return -ENOMEM; p = *pages; - for (int k = 0; k < n; k++) - get_page(p[k] = page + k); + for (int k = 0; k < n; k++) { + struct folio *folio = page_folio(page); + p[k] = page + k; + if (!folio_test_slab(folio)) + folio_get(folio); + } maxsize = min_t(size_t, maxsize, n * PAGE_SIZE - *start); i->count -= maxsize; i->iov_offset += maxsize;