From mboxrd@z Thu Jan 1 00:00:00 1970 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 002BAC54ED1 for ; Wed, 28 May 2025 02:29:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 61F0C6B0082; Tue, 27 May 2025 22:29:26 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5D0CB6B008C; Tue, 27 May 2025 22:29:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3D15C6B0089; Tue, 27 May 2025 22:29:26 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 194F16B0088 for ; Tue, 27 May 2025 22:29:26 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id B0A6CBFE96 for ; Wed, 28 May 2025 02:29:25 +0000 (UTC) X-FDA: 83490735090.07.2464DDB Received: from invmail4.hynix.com (exvmail4.skhynix.com [166.125.252.92]) by imf10.hostedemail.com (Postfix) with ESMTP id C8968C000C for ; Wed, 28 May 2025 02:29:23 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf10.hostedemail.com: domain of byungchul@sk.com designates 166.125.252.92 as permitted sender) smtp.mailfrom=byungchul@sk.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1748399364; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=jXGbD5PIb6MyV3q7jscXc7aG/zC8EhRNN4L05Q0CGCM=; b=l8otbN5zRe6z+aHsI160BhJRagMZgVfSuFnjK8O2vTVU1ehjrY3RVOm6EBqW5g4V9s32dd PrSYzjjkeaP/WbxounzxUhQStkUg4qTlHQUcnqmgl7MSIXiPSrFQ14Xq02NwNKCRMed8fE aJSFx8xCyI3R6LtvR98dnVX8m6nybrs= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf10.hostedemail.com: domain of byungchul@sk.com designates 166.125.252.92 as permitted sender) smtp.mailfrom=byungchul@sk.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748399364; a=rsa-sha256; cv=none; b=6RtiBLPxEZTOqTxw4bH5CzI4ab3/KyWkxLleg1kJ9XXArr4ibembGCrKPl8HkAbB9hXPFj LB/bP0WY1Ei11eOJG0glCad+ZlpZ1hYIm6KZZR0PtF2RsqWgmx6MFNNZH5MPww4dDCUZJo qBfXUgfFTBacZq5HvPxcEGbAycPbj/o= X-AuditID: a67dfc5b-669ff7000002311f-16-68367501819d From: Byungchul Park To: willy@infradead.org, netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, kernel_team@skhynix.com, kuba@kernel.org, almasrymina@google.com, ilias.apalodimas@linaro.org, harry.yoo@oracle.com, hawk@kernel.org, akpm@linux-foundation.org, davem@davemloft.net, john.fastabend@gmail.com, andrew+netdev@lunn.ch, asml.silence@gmail.com, toke@redhat.com, tariqt@nvidia.com, edumazet@google.com, pabeni@redhat.com, saeedm@nvidia.com, leon@kernel.org, ast@kernel.org, daniel@iogearbox.net, david@redhat.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, vbabka@suse.cz, rppt@kernel.org, surenb@google.com, mhocko@suse.com, horms@kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, vishal.moola@gmail.com Subject: [PATCH v2 00/16] Split netmem from struct page Date: Wed, 28 May 2025 11:28:55 +0900 Message-Id: <20250528022911.73453-1-byungchul@sk.com> X-Mailer: git-send-email 2.17.1 X-Brightmail-Tracker: H4sIAAAAAAAAAzWRa0hTYRzGfXfOzo7TwWFaHRWyBhWImora/0OYRtQLQRhBQUY28uCG25TN 67qpSeXQdRM0XTETl5fRZBOdImrTvFCkrYxlpTZRClNJ09RFponffjy3Lw9NiM1kIC1XZXJq lVQhoYSkcNa3Ogxlxcoiyrr2g8FipqBxJReeTdj5YGhoQfBr9ZMAFnv7KaipXibAMFREwpJl jYCpPrcAxk3TJHTcbiXAfXeAgtIiDwGF9joeDLfo+VC2VktAa/6EAN61GygYM6/zYdpRSsJg ZT0J4/p46DPuhOVXPxD0Wlp5sFzymIKHTiMFk0XjCJw9bhKqCvQILJ0uPnhWDFT8Xtxc/5GH 2yq/CLDRmoVtdSFY53IS2NpQTGHrwgMB/vyhg8IDFR4St9kXebj05hyFf06Nkni+c4TCluYR Er829grwonV3InNeeDiFU8izOfXBuEtCmalkSZBRGZc7Ob2C8lFtpA550ywTzTY+7Sa3uad6 5j9TzAHW5VolNtmfiWQX3f0bupAmmDk+O2Xw8HSIpv2YQ6zJjDczJLOPbenqQpssYmJY13wB tbUZzDY2dRObXZYZFbAV98v5W0YA+6LORd5DPkbk1YDEclW2UipXRIfL8lTy3PDL6Uor2vjQ dO1Pkh0tDJ9xIIZGEl8RboqRifnSbE2e0oFYmpD4iwqPxMrEohRpnpZTpyersxScxoGCaFKy SxS1nJMiZlKlmVwax2Vw6m2XR3sH5iOt7TefPp7wUjRkP5c79mStZF1bbg7od0QpggYk7vLr zhuOR/OhRs/75+7Z4JA94o7WiOY225WTSd/lHVzAZFuV3nkitYZOCD/lc+doTuGMUhu64+vZ wQvlQe3aUF9dVG2YrTgx+XTWN03xrQbdsYtv38wZ/a56pdlMg39VolSThNTIpJEhhFoj/QdY RR2pvwIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAAzWRXUhTcRyG/e+cnR1Xq+MSO5haTUUQMlfNflaYeNOfSIu6CLowVx7acn6w 6XJRMd00Ejczu4g5YSaaX7C1RKeI1hQ/KKg0Y5U1mTiCTC0/UCeUI7p7eN+H9+alCXENGUkr C4o5dYFcJaGEpDDrpOEQKklRJDvqI8Bq76SgY70Uns24+GBt70awsvFFAMvDoxQ0Na4RYH1r JGHVvknA3IhPAN4WPwn993sI8NWMUWAyBggod7XyYKhhnA/vus18eLzZTECPfkYAk31WCr51 /uGD320iYdzSRoLXnA4jtghYez2PYNjew4O16gYK6iZsFMwavQgmhnwk1JeZEdgHPHwIrFup dAnuavvEw72WrwJsc5bgF62JuMozQWBn+wMKO38/EuDpj/0UHnsSIHGva5mHTYYFCv+a+0zi xYEpCjd9X+Jhe9cUid/YhgUXwq4IT+VyKqWWUx9OyxEqWqpXBUWWtNJZ/zrSo2ZpFQqlWeYY O9T4gwwyxSSwHs8GEeRwRsou+0a3cyFNMAt8ds4a4FUhmt7DHGdbOnHQIZl4tntwEAVZxMhY z2IZ9W9zP9vheEk8RLQNhbSjcGWBNl+uVMmSNHkKXYGyNOl6Yb4Tbd/Ucner1oVWJs+4EUMj yU4RdsgUYr5cq9HluxFLE5JwUfnpFIVYlCvX3ebUhVfVJSpO40b7aFKyV3T2MpcjZm7Ii7k8 jivi1P9bHh0aqUeVlbGmzJGKCjS960jGh61bS+8zJq8dSDMa+jPDkiXRa5Fz83F9Im/0vaSw HDLbnC2Lt6iI1Na4AyG1zvOpK6+W9AFjZUyC4XnppSiA3sSin4t1KR3RB+9oYxWDpphOf4LU b0jOMpmi+Bd9Rx2x5A7z7oRB/VOR7sRN77kZl4TUKOTSREKtkf8FKMw2W6ICAAA= X-CFilter-Loop: Reflected X-Stat-Signature: pgqkjgjcophtwkw5j7dkqx6ztwom9hrf X-Rspamd-Queue-Id: C8968C000C X-Rspam-User: X-Rspamd-Server: rspam02 X-HE-Tag: 1748399363-205153 X-HE-Meta: U2FsdGVkX18vB87RBNq5Oio/RpSg6nAjvEF6nItGU2UmDTAQkVB864XcZeVWYxURdiyVZbt7Xyfzw3ETV+YiKRebjAq4N1+WWRMyEWwsKYyxq4m4MyAFm9y//JYOD4vLo0EmpE2RwxOZVflnpyukQA7o3rAtQBDnIjXvVdbq1RVqp2q3DK6TUog3nJJcw1g6EIOLTQL87vSSAnHMuHa1ggtX+RzfZuPxl/rJWAJBg0KTceylMrF1ltGXBW8XO96fBMDBlLw0PEfdPJQf4XhrySxtYt0oADVEV5QPdq25SxxzEkZI7g2LlTpUej0WCfb4n3NmbRApOBnOO366EP+nMxiR1UYKGoGpYSP3FC1NAtjLhpvL1b9AHNIoPeySmKjztHeM09Qhm4lEXyUHezFuosp0OJs6TbMblmV01K8V0MG3XrZWjiWn6/P76PV0PhUHD/vhMrgjldz6o4Wx8u3aIDXt6OaIBDMSYPqBh9iDo/RGitJO0wzg4+GulJ1kidRrwJPa1a1Ya3W7qJirfWPG3kUqdrlMy3lAnkOWAZvpdov7OzkTdHEPXFxc25C9G+BpQqmrkdD2vDcRvaEqGoGXF0Ydl6B/agjMlfx+krxKbNV2isiUUS17aHJMFypDH/GjgTYvIchsbxqA9gKKO+Sv+9gfKDsKbuFbZhTcksKJppMO9zyrMux6bgi5gbaIfh5kx7p05DgeZzxFUrlK41Zp5MfQ+Q7yKrxtdZVIA1SSk6k/IgrYN15wHF6e393XF/bDseNsDqeFDbQD5iTQbvbixB5Jo+8PkL7eo+KaUYkwHQkSQa43hwl+sq9YNCt2h9ogc4UdzsAEZbLQsd63MbgujAEo7KLxZr+n0eWCBTHSNfaZjn06aVNEPhaENmXwSF9snP5lGivVwzat5bMvVFuBHVczQWRumNEsd3Pjt9fVfsrG0ZzrXVoY2odZEsbs+PpAzdHHtWHmwteAZfiyibc HFgxKLZF hzvadpenvcYgJj9yxlwDWKGdRu7GH9raWR1BSTATFUFfl1gpcKzGv7S0JWd6KYanAQ0BzoWOpTU6F5RBrwWNGXiQNgLAIxd8/PlZDsQnLm6Syce9cVUobpQam1c14XDFrM2F3lG5mn5BQdi/jqrwegc9mRQ1VLfHZclIl98++5WZ4xwjKw6vFxNzkhg== 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: The MM subsystem is trying to reduce struct page to a single pointer. The first step towards that is splitting struct page by its individual users, as has already been done with folio and slab. This patchset does that for netmem which is used for page pools. Matthew Wilcox tried and stopped the same work, you can see in: https://lore.kernel.org/linux-mm/20230111042214.907030-1-willy@infradead.org/ Mina Almasry already has done a lot fo prerequisite works by luck, he said :). I stacked my patches on the top of his work e.i. netmem. I focused on removing the page pool members in struct page this time, not moving the allocation code of page pool from net to mm. It can be done later if needed. There are still a lot of works to do, to remove the dependency on struct page in the network subsystem. I will continue to work on this after this base patchset is merged. The final patch removing the page pool fields will be submitted once all the converting work of page to netmem are done: 1. converting of libeth_fqe by Tony Nguyen. 2. converting of mlx5 by Tariq Toukan. 3. converting of prueth_swdata (on me). 4. converting of freescale driver (on me). 5. making page_pool_page_is_pp() not access via page->pp_magic (on me). For our discussion, I'm sharing what the final patch looks like. Byungchul --8<-- commit 8e56edf5e4fcd614e951fa046a1479e7fc1c1f95 Author: Byungchul Park Date: Fri May 23 10:40:00 2025 +0900 mm, netmem: remove the page pool members in struct page Now that all the users of the page pool members in struct page have been gone, the members can be removed from struct page. However, since struct netmem_desc might still use the space in struct page, the size of struct netmem_desc should be checked, until struct netmem_desc has its own instance from slab, to avoid conficting with other members within struct page. Remove the page pool members in struct page and modify static checkers for the offsets and the size. Signed-off-by: Byungchul Park diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 56d07edd01f9..5a7864eb9d76 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -119,17 +119,6 @@ struct page { */ unsigned long private; }; - struct { /* page_pool used by netstack */ - /** - * @pp_magic: magic value to avoid recycling non - * page_pool allocated pages. - */ - unsigned long pp_magic; - struct page_pool *pp; - unsigned long _pp_mapping_pad; - unsigned long dma_addr; - atomic_long_t pp_ref_count; - }; struct { /* Tail pages of compound page */ unsigned long compound_head; /* Bit zero is set */ }; diff --git a/include/net/netmem.h b/include/net/netmem.h index 96472e56e8ee..4979bd33ba9d 100644 --- a/include/net/netmem.h +++ b/include/net/netmem.h @@ -81,19 +81,26 @@ struct net_iov_area { * }; * * We mirror the page_pool fields here so the page_pool can access these fields - * without worrying whether the underlying fields belong to a page or net_iov. + * without worrying whether the underlying fields belong to a page or, + * net_iov and netmem_desc. * * The non-net stack fields of struct page are private to the mm stack and must - * never be mirrored to net_iov. + * never be mirrored to net_iov and netmem_desc. */ -#define NET_IOV_ASSERT_OFFSET(pg, iov) \ +#define NETMEM_DESC_ASSERT_OFFSET(pg, ndesc) \ static_assert(offsetof(struct page, pg) == \ - offsetof(struct net_iov, iov)) -NET_IOV_ASSERT_OFFSET(pp_magic, pp_magic); -NET_IOV_ASSERT_OFFSET(pp, pp); -NET_IOV_ASSERT_OFFSET(dma_addr, dma_addr); -NET_IOV_ASSERT_OFFSET(pp_ref_count, pp_ref_count); -#undef NET_IOV_ASSERT_OFFSET + offsetof(struct netmem_desc, ndesc)) +NETMEM_DESC_ASSERT_OFFSET(flags, type); +NETMEM_DESC_ASSERT_OFFSET(lru, pp_magic); +NETMEM_DESC_ASSERT_OFFSET(mapping, owner); +#undef NETMEM_DESC_ASSERT_OFFSET + +/* XXX: The page pool fields in struct page have been removed but they + * might still use the space in struct page. Thus, the size of struct + * netmem_desc should be under control until struct netmem_desc has its + * own instance from slab. + */ +static_assert(sizeof(struct netmem_desc) <= offsetof(struct page, _refcount)); /* * Since struct netmem_desc uses the space in struct page, the size --- Changes from v1: 1. Rebase on net-next's main as of May 26. 2. Check checkpatch.pl, feedbacked by SJ Park. 3. Add converting of page to netmem in mt76. 4. Revert 'mlx5: use netmem descriptor and APIs for page pool' since it's on-going by Tariq Toukan. I will wait for his work to be done. 5. Revert 'page_pool: use netmem APIs to access page->pp_magic in page_pool_page_is_pp()' since we need more discussion. 6. Revert 'mm, netmem: remove the page pool members in struct page' since there are some prerequisite works to remove the page pool fields from struct page. I can submit this patch separatedly later. 7. Cancel relocating a page pool member in struct page. 8. Modify static assert for offests and size of struct netmem_desc. Changes from rfc: 1. Rebase on net-next's main branch. https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/ 2. Fix a build error reported by kernel test robot. https://lore.kernel.org/all/202505100932.uzAMBW1y-lkp@intel.com/ 3. Add given 'Reviewed-by's, thanks to Mina and Ilias. 4. Do static_assert() on the size of struct netmem_desc instead of placing place-holder in struct page, feedbacked by Matthew. 5. Do struct_group_tagged(netmem_desc) on struct net_iov instead of wholly renaming it to strcut netmem_desc, feedbacked by Mina and Pavel. Byungchul Park (16): netmem: introduce struct netmem_desc struct_group_tagged()'ed on struct net_iov netmem: introduce netmem alloc APIs to wrap page alloc APIs page_pool: use netmem alloc/put APIs in __page_pool_alloc_page_order() page_pool: rename __page_pool_alloc_page_order() to __page_pool_alloc_large_netmem() page_pool: use netmem alloc/put APIs in __page_pool_alloc_pages_slow() page_pool: rename page_pool_return_page() to page_pool_return_netmem() page_pool: use netmem put API in page_pool_return_netmem() page_pool: rename __page_pool_release_page_dma() to __page_pool_release_netmem_dma() page_pool: rename __page_pool_put_page() to __page_pool_put_netmem() page_pool: rename __page_pool_alloc_pages_slow() to __page_pool_alloc_netmems_slow() mlx4: use netmem descriptor and APIs for page pool netmem: use _Generic to cover const casting for page_to_netmem() netmem: remove __netmem_get_pp() page_pool: make page_pool_get_dma_addr() just wrap page_pool_get_dma_addr_netmem() netdevsim: use netmem descriptor and APIs for page pool mt76: use netmem descriptor and APIs for page pool drivers/net/ethernet/mellanox/mlx4/en_rx.c | 48 +++++---- drivers/net/ethernet/mellanox/mlx4/en_tx.c | 8 +- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 4 +- drivers/net/netdevsim/netdev.c | 19 ++-- drivers/net/netdevsim/netdevsim.h | 2 +- drivers/net/wireless/mediatek/mt76/dma.c | 6 +- drivers/net/wireless/mediatek/mt76/mt76.h | 12 +-- .../net/wireless/mediatek/mt76/sdio_txrx.c | 24 ++--- drivers/net/wireless/mediatek/mt76/usb.c | 10 +- include/net/netmem.h | 73 ++++++++----- include/net/page_pool/helpers.h | 7 +- net/core/page_pool.c | 101 +++++++++--------- 12 files changed, 170 insertions(+), 144 deletions(-) base-commit: d09a8a4ab57849d0401d7c0bc6583e367984d9f7 -- 2.17.1