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 66129C5AD49 for ; Wed, 4 Jun 2025 02:53:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F212A6B0549; Tue, 3 Jun 2025 22:53:03 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id EA9696B054A; Tue, 3 Jun 2025 22:53:03 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CFAD76B054C; Tue, 3 Jun 2025 22:53:03 -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 B23906B0548 for ; Tue, 3 Jun 2025 22:53:03 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 24E101D7E94 for ; Wed, 4 Jun 2025 02:53:03 +0000 (UTC) X-FDA: 83516196246.14.0F4B400 Received: from invmail4.hynix.com (exvmail4.skhynix.com [166.125.252.92]) by imf08.hostedemail.com (Postfix) with ESMTP id 52AD0160002 for ; Wed, 4 Jun 2025 02:53:00 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf08.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=1749005581; 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:in-reply-to: references:references; bh=bb2ntXN9kSluy1ue6zOt5L/KtZgRZS4qcq1nl9jgHSU=; b=ilLXaZGQqThYjYDltzzQPnZImjZiwahpcksi+5Ut8zmBoYEiKvqfB6NFbrWWg2fgEIUudY kr+9icZZHKIKUEizt5zRzgZthHjN5qpmNfG6e9PD7GnpSd+E1naz4zzq+8YfX0SGfFd+m3 JC5a78pN3TOG8XXC+qEdsM3fUqyCVqQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749005581; a=rsa-sha256; cv=none; b=KpNm+9X/FZ2s6IL6fW1wYbVkl2uwXVxoUEfX7RRKiM0rX6jGT0uowRj/+ItE39fsh78LhL F9AsH4XYXXwShwwRG6+7agktYVuupdXBp8OON2VEzBNoJsEo3ZtAKLkrZ+GqR2s73Xj8h6 Atr8v93dV75vIpSwICeb+6KslbFpOVM= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf08.hostedemail.com: domain of byungchul@sk.com designates 166.125.252.92 as permitted sender) smtp.mailfrom=byungchul@sk.com X-AuditID: a67dfc5b-681ff7000002311f-c4-683fb509066e 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: [RFC v4 01/18] netmem: introduce struct netmem_desc mirroring struct page Date: Wed, 4 Jun 2025 11:52:29 +0900 Message-Id: <20250604025246.61616-2-byungchul@sk.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250604025246.61616-1-byungchul@sk.com> References: <20250604025246.61616-1-byungchul@sk.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWRbUhTYRiGe3fenXMcDg7L8mSltIzKPhWL50dYEOELBVmBPwrKQx7acM65 mWkQrTKq0TQsqNaMSaVTq9VaukrMljVLo/nZzJmy0l+pmPm5oJzVv4vnvu/rz8NSiiYcw6q1 eaJeK2iUtAzLhiPLN0Q83a7aPGGOA6vjPg010wVQOeCWgrW6FsHPmV4Gxpu8NNwpn6TA+rEI w4RjloLBt0EG+iuGMNRfqKMgWNJMg7koRMFZt10CvtpiKVybvUdBnXGAgY7nVhq+3P8thSGP GcM7SxWG/uId8Na2GCZbviNoctRJYPJyGQ1X2200fC3qR9D+Oojh1pliBI4GvxRC01Z6xwri quqRkGeWPobYnMfJE3sCMfnbKeKsvkQT549ShgS662nSfCOEyTP3uISYz43QZGzwMyajDV00 cbi6MGm1NTFk3Bmbxh2UbcsUNep8Ub8pJUOmav0WpHS3VxdUTmUZUU+sCUWwPJfM1ztb0H92 NY5RYaa51bzfPzPPUVwiPx70YhOSsRQ3IuUHrSFJOFjI7ectJV10mDG3ig94K6VhlnNb+IoZ H/NXGsfXPGqcF0VwW/nAyPX5rWKuY3Z3UmEpzw0zfMmTqX+DJfwrux9fQXIbWlCNFGptfrag 1iRvVBVq1QUbj+ZkO9HcbytO/TrkRj98BzyIY5EyUu4OpKgUUiHfUJjtQTxLKaPkcWvnTvJM ofCkqM85oj+uEQ0etJTFymh50uSJTAV3TMgTs0RRJ+r/pxI2IsaI7J983c3dOqbMsD01K/qS qWxWiL9rvBm41mnxfUhf4Tqre/zRm/Kid0Fj607rosjR1OXv15fsikuzF+9+tfJX0cTpNoIb jlr2PXwzuiZ+VW5OufEh855dP/Z4Q2dGVJvMrksLnb/IdiTsWbzuZenOllyffs1EEjH1PVjW vDf98EuXEhtUQmICpTcIfwAN90Fz1wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAAzWRa0hTYRzGfXcuO45mxyV1ssgaiCVlGRl/KtJvvgVJRBgolStPbjinbHO5 wrBcmJpaGRg6a2V5j8W8zRAzFadpJV7S1UyZl6TCvF+DUqNvP57bl4chJEWkJ6NQaXm1SqaU 0iJSFHI0eZ9rVaD8wPNnbmA0l9NQtpgARUNWCoyl1Qhml74IYabZRkPB03kCjB8NJMyZlwkY bXEKYbBwjIS6lBoCnFmtNGQYVgi4ZS0WQFN+GwWd1ZkUPFx+QUBN0pAQul8bafha/oeCscYM EtpyS0gYzAyCFtNmmG//iaDZXCOA+bv5NGR3mWgYNgwi6GpykpB3MxOBub6fgpVFIx0kxZUl dgGuzR0QYpMlHlcU++K0/i4CW0pTaWyZfiDEjk91NG59tELiWuuMAGckT9B4avQziX/V99K4 YHxSgM2VvSTuMDULT7uHiY5F8kqFjlfvPx4hkneMOIm4xz4JRQvRSci+Iw25Mhx7iKtsmCLW mGZ9uP7+pXX2YP25GaeNTEMihmAnKG7UuCJYMzaxZ7jcrF56jUnWm3PYiqg1FrMBXOFSp/Df qBdX9qphfciVPcw5JnLWu5LVTIa1h7iHRCbkUoo8FCpdjEyhDPDTRMv1KkWC3+XYGAtava8w 8fd9K5rtDm5ELIOkG8RWx3G5hJLpNPqYRsQxhNRD7LVnVRJHyvTXeHXsRXW8ktc0om0MKd0i PnmOj5CwUTItH83zcbz6vytgXD2TUPD4xujhvvq5lllrWrvuwru3bh8SQ5Ky0oMNC0N7t2Yz trCAnlB/7fcJe17fDffw3SlKPaROe1+i3CPwQujA1bhTL+3Ns8qqN/K6nYxluWoSvtG7wm0n JtmDVxwN6YHbczxV6KyWeH++5Mh1l0K7yx2DTnv7yY+8qBGXmilxhZTUyGX+voRaI/sLXeRT RboCAAA= X-CFilter-Loop: Reflected X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 52AD0160002 X-Stat-Signature: ybpkwzt1g3cwcgwkxrsnc1hw4irq9yud X-Rspam-User: X-HE-Tag: 1749005580-16523 X-HE-Meta: U2FsdGVkX18GpY+kYh0svTXrwe8CIICfHF37VllN+eqcBbLvzXF9n8areeZOTqI7ZalIYkeYRrPMJMlTDMBiufohjDKRoaAO9Hzx1QN32DgqsFYVw4/0/RysAklmUPJcG+Tj/Mvfb0oVvqtr3E0QBwD6j6zxB3IeEimi62XFnidb2AsamEdA5uQLVga6ZOl4cFfF3koGkpKGyqENSxw1A5kqX+v0BmUZdYc1Bu3Wrj5c8WNOYSixjbcH9xoB6Z+NEEXUKUNyfyUfsCjiWq3tZMVNbZIrXtdMgFKD0HfcNBbbt9CnpceMH0AWMY2mInOG6CT3dQ1n/7+uMUxKklRclJIaaFi8bTEBiToPBIiQFZP4Kq5L7bB+/BheMBaiPqMcrZCluaERlj/uhuT8WtzME0eQ+/AekxsKIQHN0TOvo8yMTieMmPJRC7sR/tLLYb661cS0z+XSNU3BUjMOPfkYK9kvnUtZq28WsAMdqpQibUZfZ/yfBbp1UWitiQY/ArU9vLGoCMin76YEj9volO6K+un6eIhfUftcUDn4AwFN1mTG1fuB+2jozGNTMh/PpX1c1mB+y9O+bs7EK518TMguatB+VLE7CsOHDNu2aV8go5dQGh0rpKG2Rv1VyEXdi6deHNzfZSlDnSoXgp6LbOtey+FvtcdIYoYh3lOY5cuE1ombu36d+iNFw/Ga1ETvs9GxKGs56r3uR8n8bq0BUdvPNpCOKSvKljdJwGoaIRAqlC/jbx3yhTPIVwkuAPY6ctjYEpDTrM/og/0U/DdtL5kGaSeUcy9OgUiwP9xTSrsQ2vjbXV/tRs+AOeDZwPiE6TjWwR9qxsFcjmzxqE+0mqQTCKfReYM0l4sOzRPkTR2CjmTP9lsqr7eLNduHFQ+79S84jXt82LmGqI8yK3VJVocd0a2RiMK+vndeJz/AskRRWg947b6wOUODgElCXyvHQmF0Kq3zoPGZZ8N1n7WVdmn MuoXc81/ Sh2HxxNyh1955A9mB5fC2tVWPY5wm8a7dzTf2YrlyUFoFnPWAONudkjKS55riUWPaKC0W5VYYJFVcvxkM5hCPFjUoyqYl09ldgMNlQjPMC67+1Q9/NTFyvb9DKg== 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: To simplify struct page, the page pool members of struct page should be moved to other, allowing these members to be removed from struct page. Introduce a network memory descriptor to store the members, struct netmem_desc, and make it union'ed with the existing fields in struct net_iov, allowing to organize the fields of struct net_iov. Signed-off-by: Byungchul Park --- include/net/netmem.h | 94 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 21 deletions(-) diff --git a/include/net/netmem.h b/include/net/netmem.h index 386164fb9c18..2687c8051ca5 100644 --- a/include/net/netmem.h +++ b/include/net/netmem.h @@ -12,6 +12,50 @@ #include #include +/* These fields in struct page are used by the page_pool and net stack: + * + * struct { + * unsigned long pp_magic; + * struct page_pool *pp; + * unsigned long _pp_mapping_pad; + * unsigned long dma_addr; + * atomic_long_t pp_ref_count; + * }; + * + * 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 netmem_desc. + * + * CAUTION: Do not update the fields in netmem_desc without also + * updating the anonymous aliasing union in struct net_iov. + */ +struct netmem_desc { + unsigned long _flags; + unsigned long pp_magic; + struct page_pool *pp; + unsigned long _pp_mapping_pad; + unsigned long dma_addr; + atomic_long_t pp_ref_count; +}; + +#define NETMEM_DESC_ASSERT_OFFSET(pg, desc) \ + static_assert(offsetof(struct page, pg) == \ + offsetof(struct netmem_desc, desc)) +NETMEM_DESC_ASSERT_OFFSET(flags, _flags); +NETMEM_DESC_ASSERT_OFFSET(pp_magic, pp_magic); +NETMEM_DESC_ASSERT_OFFSET(pp, pp); +NETMEM_DESC_ASSERT_OFFSET(_pp_mapping_pad, _pp_mapping_pad); +NETMEM_DESC_ASSERT_OFFSET(dma_addr, dma_addr); +NETMEM_DESC_ASSERT_OFFSET(pp_ref_count, pp_ref_count); +#undef NETMEM_DESC_ASSERT_OFFSET + +/* + * Since struct netmem_desc uses the space in struct page, the size + * should be checked, until struct netmem_desc has its own instance from + * slab, to avoid conflicting with other members within struct page. + */ +static_assert(sizeof(struct netmem_desc) <= offsetof(struct page, _refcount)); + /* net_iov */ DECLARE_STATIC_KEY_FALSE(page_pool_mem_providers); @@ -31,12 +75,25 @@ enum net_iov_type { }; struct net_iov { - enum net_iov_type type; - unsigned long pp_magic; - struct page_pool *pp; + union { + struct netmem_desc desc; + + /* XXX: The following part should be removed once all + * the references to them are converted so as to be + * accessed via netmem_desc e.g. niov->desc.pp instead + * of niov->pp. + */ + struct { + unsigned long _flags; + unsigned long pp_magic; + struct page_pool *pp; + unsigned long _pp_mapping_pad; + unsigned long dma_addr; + atomic_long_t pp_ref_count; + }; + }; struct net_iov_area *owner; - unsigned long dma_addr; - atomic_long_t pp_ref_count; + enum net_iov_type type; }; struct net_iov_area { @@ -48,27 +105,22 @@ struct net_iov_area { unsigned long base_virtual; }; -/* These fields in struct page are used by the page_pool and net stack: +/* net_iov is union'ed with struct netmem_desc mirroring struct page, so + * the page_pool can access these fields without worrying whether the + * underlying fields are accessed via netmem_desc or directly via + * net_iov, until all the references to them are converted so as to be + * accessed via netmem_desc e.g. niov->desc.pp instead of niov->pp. * - * struct { - * unsigned long pp_magic; - * struct page_pool *pp; - * unsigned long _pp_mapping_pad; - * unsigned long dma_addr; - * atomic_long_t pp_ref_count; - * }; - * - * 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. - * - * The non-net stack fields of struct page are private to the mm stack and must - * never be mirrored to net_iov. + * The non-net stack fields of struct page are private to the mm stack + * and must never be mirrored to net_iov. */ -#define NET_IOV_ASSERT_OFFSET(pg, iov) \ - static_assert(offsetof(struct page, pg) == \ +#define NET_IOV_ASSERT_OFFSET(desc, iov) \ + static_assert(offsetof(struct netmem_desc, desc) == \ offsetof(struct net_iov, iov)) +NET_IOV_ASSERT_OFFSET(_flags, _flags); NET_IOV_ASSERT_OFFSET(pp_magic, pp_magic); NET_IOV_ASSERT_OFFSET(pp, pp); +NET_IOV_ASSERT_OFFSET(_pp_mapping_pad, _pp_mapping_pad); NET_IOV_ASSERT_OFFSET(dma_addr, dma_addr); NET_IOV_ASSERT_OFFSET(pp_ref_count, pp_ref_count); #undef NET_IOV_ASSERT_OFFSET -- 2.17.1