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 ECAD7C83F1B for ; Mon, 14 Jul 2025 11:28:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 575F56B007B; Mon, 14 Jul 2025 07:28:47 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 526566B0089; Mon, 14 Jul 2025 07:28:47 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 415C96B008A; Mon, 14 Jul 2025 07:28:47 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 305B46B007B for ; Mon, 14 Jul 2025 07:28:47 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id ABE701D3351 for ; Mon, 14 Jul 2025 11:28:46 +0000 (UTC) X-FDA: 83662647852.25.E73164E Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) by imf25.hostedemail.com (Postfix) with ESMTP id A0595A0002 for ; Mon, 14 Jul 2025 11:28:44 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Q4pjWj0F; spf=pass (imf25.hostedemail.com: domain of asml.silence@gmail.com designates 209.85.218.52 as permitted sender) smtp.mailfrom=asml.silence@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752492524; 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=bpkZoh52U9bMTsE5g44NKcdh3S3DqEjKpM/aPLPBEE0=; b=AgYqVxbjs+touvoIbmOXIkTmSoQG7F9SvdlE8iFAyYfEjgF6BS1u7TTiOFKu6OijcE/CJV aEYKjqxdAM9paNx9XN/doLAiXvFACAa467ZYxvC3i3Sys4Wv0UP0h6OG8AP5jQt7zBha8l judVVeCksTyG707TTsFDWMeFD2QNu7M= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Q4pjWj0F; spf=pass (imf25.hostedemail.com: domain of asml.silence@gmail.com designates 209.85.218.52 as permitted sender) smtp.mailfrom=asml.silence@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752492524; a=rsa-sha256; cv=none; b=cfFNkqNkx/V+R2CTW2xWDRdhF0N9TPHADNfO4HPl8VwPo6sSgAF5NvMqeBmE28o3Dt+KMs GMmP7MBwHrdYRiY82Lq/xXWG1bfn6HN5a3FEq3KEjA2vKzQC3QvN7cMRdPUsX+VD4soHDi CklaKDHbTOLiPjBRC1fYivI7FQKEv1w= Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-ad56cbc7b07so729065066b.0 for ; Mon, 14 Jul 2025 04:28:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752492523; x=1753097323; darn=kvack.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=bpkZoh52U9bMTsE5g44NKcdh3S3DqEjKpM/aPLPBEE0=; b=Q4pjWj0FUWDyY48hx+JMl85OZg6WZKtabd8G6CRD8MM2s4LplGtrogRlEFLAaOtu3f aS8fANV7x0NKy+aSl//hLrEcs0jXZGFu4pAMqfoiKfHLPJYn8OpVlKisFfCCzeXnrOFt 0KuTjZrkHpQs+E73QU7S6Wr8Pw5S54eIZSoQUbiGi/vfe2hxooixpxU/wFGWSA1KIGfD wUKWfCgP4RunZgOtXLJFYaYux+rHOy5cgtF++/RaN5hsG3YKwWW9EMGjEAnK8vRJDuIN 4u9sNEvv6jYeXCG8A6FLbSFGVmkDbrYOHzNG+S6+cqgR4JyqlY5bQtahv9l7XS+Z+9D1 iaTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752492523; x=1753097323; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bpkZoh52U9bMTsE5g44NKcdh3S3DqEjKpM/aPLPBEE0=; b=ntbti+bIbuh6VgO75wEEySDnQBb0sb511BYd1Xjy0Gs2DHVPY3aE4d5VdtzO6bePYL BevKnfAZrJLjLOPXaX5jptNZEszYh9d+zi8c2WWJI0ZlnSswdoO1EMixSD3k41IHXvYL LJHp3bIFRmNJjX9ZnO3H1CZovI/NVPyNuN9GV8q7VF7RFVpqwHRAR1tzp401jvldeNoK It9AKA/bQFMhHNX8iHqdbnUtL932syAnO1b/EgavSzhtbsDAYEu67/d7dj7HzIZbx/0V i+AmevVTSqR9tT8QUO1TNsVZ7BHrwYLcIIUnkxVaw5sYqDVwrox4/v2rfipwWFRiiUSY +krg== X-Forwarded-Encrypted: i=1; AJvYcCUvLy3AL+b5UcNWwPfYxSt7yKRYkqNY+zVcvNWzB0H5BQKMh3v9ginIf+87Sv1pZy0GXKbId1X7Yg==@kvack.org X-Gm-Message-State: AOJu0YysrI1+Xutreh9KeBCXqh0odx/xKLo7dy+mg254Hybk/6MsD0NL sOGrOrg6uwcp/LTCUco9iau1WGxUij0lxCNeDHB2WJMEQKXJOafLEb1d X-Gm-Gg: ASbGncvUxDzcY+oZQ0HQhsRy3rU9u0j+k1kClnaWvbGkJZ/Z6LfV42ysAdR+IK3Bviw DGViL46n1dbzouokkv4RcpEjSLiZZRutjhlQXFM26mQcM2wZi/6eart39OC0QlXMgETLrlcY2Wj +HbO9dj5eIry8zGDqJfRS10AaEexntLidKtkSfszCsBgFnrid/b8zK+oadW0ydBD3OT8uL6e9TY m9DvF/76JO2suwN0xlIRs5BmBQQ9knOk0vyO3agvkqIRTrZEdxobRm/ZXYbFkEHdZFxpd9aBGBI FP2ZKHynMtU+3bkFax/KslSMpy0d44YW8GNLQbPSFrp5DcQLzahaz8ITwod5zPc1j3iv/cmeD7E gitAkaqO6EuN/40qxDQyl4GmBTUV6TSdNgV8= X-Google-Smtp-Source: AGHT+IHnrlaIgYieOJlbcldc8fhthk66yxfXBj+Mky+hwKDEqFFpNcHQod+MaMIOkC9i5kv/5aVVPA== X-Received: by 2002:a17:906:6a1d:b0:ae3:4f99:a5a5 with SMTP id a640c23a62f3a-ae6fc6a82c8mr1252959766b.6.1752492522653; Mon, 14 Jul 2025 04:28:42 -0700 (PDT) Received: from ?IPV6:2620:10d:c096:325::1ac? ([2620:10d:c092:600::1:f749]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae6e7ee4553sm819721866b.51.2025.07.14.04.28.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 14 Jul 2025 04:28:41 -0700 (PDT) Message-ID: Date: Mon, 14 Jul 2025 12:30:12 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH net-next v9 1/8] netmem: introduce struct netmem_desc mirroring struct page To: Byungchul Park Cc: willy@infradead.org, netdev@vger.kernel.org, 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, 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, hannes@cmpxchg.org, ziy@nvidia.com, jackmanb@google.com References: <20250710082807.27402-1-byungchul@sk.com> <20250710082807.27402-2-byungchul@sk.com> <20250714042346.GA68818@system.software.com> Content-Language: en-US From: Pavel Begunkov In-Reply-To: <20250714042346.GA68818@system.software.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspam-User: X-Rspamd-Queue-Id: A0595A0002 X-Rspamd-Server: rspam06 X-Stat-Signature: asd9oq6ca9zkoiuwm47as697fcrgx9tm X-HE-Tag: 1752492524-37295 X-HE-Meta: U2FsdGVkX1/3SigoC0g8GHOXVdWg15vqoSe/mb6c3Bz8cxdb9Qm1oNvl4GeIMc4OE2lXHZlkH7DOVdKZKmrjmv6qlQ9SH6CNEoO9wHtZNByf4s26npsfuTdudEgCoW6wnRPgkiZMUEO70bKMtBZuognQ+YD7bKFNqzJEVpRVFxW6praGsHJ5IfR6r3+PrNcnHH+/sapFpnyqmozU8p/CjQ9Rid5eFnOo+yoziS1m2vPw18dbkuG2iYLYNYdSR3I18u7D4bYSlB6vqtbxVpVdFBIp2gFsaOQ4xxZPx4R4x6ZvtucfEBcteZ5BRiZU8Y1pKquWGrd2ajpHge6coTblKaelOwO3qjUb3WSQlJCeIAWUr285CwulAPGfOST+9LIMkhAmUV4ZNn3S+RZGo5SRjioEramRVn5UrOWeaSGHCwA4VVVfV8eJAlHWLRW6veR3zJebKhI8NB1k7rvIxj9uOmpVU0ctbQb+/JJ4zz8iR6u2KAkRuiPrTA5yT1c5AQVlZ6y89ajU985eYhzqpaYZUwl7+r1zHzZ4A7VzhMTc8q6eWjvs3UbIxci7sV5LfusLGTimrfU4YQEbugh/7W+CBCVL4HYx6nqEyUlosJ/f1dy5okP2dlESgArtm9z9zGvoOR2HHgmGasxT1iuDyc4eWOQGnf1TPhTkNm7uUR8J2bqkBrFErqFHQ6U7ohnaBvPvcLRilcoem6p1zBEKJCSA2iwGpDGDqVovfLFrCoCgaKi3kObSFA/LZN5011rt/38XVLX2ZfLIceHYYuW69/kMs8QgTxWNY2Bp5ycbgCBBXsb6X9i3rmd+sk+EFPyp7daMXafNB/joGRYa+11FBJ6LnItdUeXfhpFrA/cBXwlpE4xyum3oS8C/eSK6Ot2W5qUu6jjHce2r5vhkmI3oYc/cYX0bu4p/okAK89tqXrOIk5UrVbepHEtaALI2qQm/Zt5UD9HYL2jYbjkh20qjUqY LoXp2viR Xp9A9aRPn/V+8pmts6rfht5LZVLwhOICmHZAO4uiInbGUQBTyjfxnY5Ao6HG/Ujzn4CEGSZWMjSobYLmqlsLiQO6TUeTHneYhMot/F9n4d7X2ki8Y781m7/SRMYrPVCmJb7VdAAO7NT2gFKopGgIhEEK1KZD6CibrPLKgw7rmn4hUbN4vzfRPf1QnJDHF/fo6m71nRx1vKLK75mWOAiJoQbqoPvk/WB9XDtjAkNkq1BjRdh8yQDe8BTV1Qn5uwFkka2N2CfhjcCcCzZl2e5LUnqyv+PzkpMatxf1MwVztM4fMSytOHZrMQKoQ+zsZBwO0UXkFdPMbrexYY1wLKswsRGx58C8+3oFqy/Gq95xQh+dA9gooZBL9ro9O1oe6MVm/zqb7ssX3oBJgqme2hh+/Y7ViufDtGc4k5b6XsNAYqTKOvfawABqrHgmMYHdyqNKK4+090lIawMISnWVwiFGP/Dy3OIIGOwQ/a+oF1p/icWHrJqGe2/MrkLrDNGIJm1H9MW7kgj/jr6hQ8XGwO6Qa2p6wt7+MO4Ws0KR+Af6KEdVRvshZhTjylqsDkw+C7+VAOjqPJhHrDmfdvIAnMMVjQRdx+PyscaL4A4MO/iVeJ3Rr2zr5m4GvVMqt4GoKqSkn+TcdDvuAp042wGQruQNvHpTYGd4aiv8Kq1EqJBsx6D51Udk= 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: On 7/14/25 05:23, Byungchul Park wrote: > On Sat, Jul 12, 2025 at 03:39:59PM +0100, Pavel Begunkov wrote: >> On 7/10/25 09:28, Byungchul Park wrote: >>> 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. >> >> FWIW, regardless of memdesc business, I think it'd be great to have >> this patch, as it'll help with some of the netmem casting ugliness and >> shed some cycles as well. For example, we have a bunch of >> niov -> netmem -> niov casts in various places. > > If Jakub agrees with this, I will re-post this as a separate patch so > that works that require this base can go ahead. I think it'd be a good idea. It's needed to clean up netmem handling, and I'll convert io_uring and get rid of the union in niov. The diff below should give a rough idea of what I want to use it for. It kills __netmem_clear_lsb() to avoid casting struct page * to niov. And saves some masking for zcrx, see page_pool_get_dma_addr_nmdesc(), and there are more places like that. diff --git a/include/net/netmem.h b/include/net/netmem.h index 535cf17b9134..41f3a3fd6b6c 100644 --- a/include/net/netmem.h +++ b/include/net/netmem.h @@ -247,6 +247,8 @@ static inline unsigned long netmem_pfn_trace(netmem_ref netmem) return page_to_pfn(netmem_to_page(netmem)); } +#define pp_page_to_nmdesc(page) ((struct netmem_desc *)(page)) + /* __netmem_clear_lsb - convert netmem_ref to struct net_iov * for access to * common fields. * @netmem: netmem reference to extract as net_iov. @@ -262,11 +264,18 @@ static inline unsigned long netmem_pfn_trace(netmem_ref netmem) * * Return: the netmem_ref cast to net_iov* regardless of its underlying type. */ -static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem) +static inline struct net_iov *__netmem_to_niov(netmem_ref netmem) { return (struct net_iov *)((__force unsigned long)netmem & ~NET_IOV); } +static inline struct netmem_desc *netmem_to_nmdesc(netmem_ref netmem) +{ + if (netmem_is_net_iov(netmem)) + return &__netmem_to_niov(netmem)->desc; + return pp_page_to_nmdesc(__netmem_to_page(netmem)); +} + /** * __netmem_get_pp - unsafely get pointer to the &page_pool backing @netmem * @netmem: netmem reference to get the pointer from @@ -280,17 +289,17 @@ static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem) */ static inline struct page_pool *__netmem_get_pp(netmem_ref netmem) { - return __netmem_to_page(netmem)->pp; + return pp_page_to_nmdesc(__netmem_to_page(netmem))->pp; } static inline struct page_pool *netmem_get_pp(netmem_ref netmem) { - return __netmem_clear_lsb(netmem)->pp; + return netmem_to_nmdesc(netmem)->pp; } static inline atomic_long_t *netmem_get_pp_ref_count_ref(netmem_ref netmem) { - return &__netmem_clear_lsb(netmem)->pp_ref_count; + return &netmem_to_nmdesc(netmem)->pp_ref_count; } static inline bool netmem_is_pref_nid(netmem_ref netmem, int pref_nid) @@ -355,7 +364,7 @@ static inline bool netmem_is_pfmemalloc(netmem_ref netmem) static inline unsigned long netmem_get_dma_addr(netmem_ref netmem) { - return __netmem_clear_lsb(netmem)->dma_addr; + return netmem_to_nmdesc(netmem)->dma_addr; } void get_netmem(netmem_ref netmem); diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h index db180626be06..002858f3bcb3 100644 --- a/include/net/page_pool/helpers.h +++ b/include/net/page_pool/helpers.h @@ -425,9 +425,9 @@ static inline void page_pool_free_va(struct page_pool *pool, void *va, page_pool_put_page(pool, virt_to_head_page(va), -1, allow_direct); } -static inline dma_addr_t page_pool_get_dma_addr_netmem(netmem_ref netmem) +static inline dma_addr_t page_pool_get_dma_addr_nmdesc(struct netmem_desc *desc) { - dma_addr_t ret = netmem_get_dma_addr(netmem); + dma_addr_t ret = desc->dma_addr; if (PAGE_POOL_32BIT_ARCH_WITH_64BIT_DMA) ret <<= PAGE_SHIFT; @@ -435,6 +435,13 @@ static inline dma_addr_t page_pool_get_dma_addr_netmem(netmem_ref netmem) return ret; } +static inline dma_addr_t page_pool_get_dma_addr_netmem(netmem_ref netmem) +{ + struct netmem_desc *desc = netmem_to_nmdesc(netmem); + + return page_pool_get_dma_addr_nmdesc(desc); +} + /** * page_pool_get_dma_addr() - Retrieve the stored DMA address. * @page: page allocated from a page pool diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 085eeed8cd50..2e80692d9ee1 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -290,7 +290,7 @@ static void io_zcrx_sync_for_device(const struct page_pool *pool, if (!dma_dev_need_sync(pool->p.dev)) return; - dma_addr = page_pool_get_dma_addr_netmem(net_iov_to_netmem(niov)); + dma_addr = page_pool_get_dma_addr_nmdesc(&niov->desc); __dma_sync_single_for_device(pool->p.dev, dma_addr + pool->p.offset, PAGE_SIZE, pool->p.dma_dir); #endif diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h index cd95394399b4..97d4beda9174 100644 --- a/net/core/netmem_priv.h +++ b/net/core/netmem_priv.h @@ -5,19 +5,21 @@ static inline unsigned long netmem_get_pp_magic(netmem_ref netmem) { - return __netmem_clear_lsb(netmem)->pp_magic & ~PP_DMA_INDEX_MASK; + return netmem_to_nmdesc(netmem)->pp_magic & ~PP_DMA_INDEX_MASK; } static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) { - __netmem_clear_lsb(netmem)->pp_magic |= pp_magic; + netmem_to_nmdesc(netmem)->pp_magic |= pp_magic; } static inline void netmem_clear_pp_magic(netmem_ref netmem) { - WARN_ON_ONCE(__netmem_clear_lsb(netmem)->pp_magic & PP_DMA_INDEX_MASK); + struct netmem_desc *desc = netmem_to_nmdesc(netmem); - __netmem_clear_lsb(netmem)->pp_magic = 0; + WARN_ON_ONCE(desc->pp_magic & PP_DMA_INDEX_MASK); + + desc->pp_magic = 0; } static inline bool netmem_is_pp(netmem_ref netmem) @@ -27,13 +29,13 @@ static inline bool netmem_is_pp(netmem_ref netmem) static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool) { - __netmem_clear_lsb(netmem)->pp = pool; + netmem_to_nmdesc(netmem)->pp = pool; } static inline void netmem_set_dma_addr(netmem_ref netmem, unsigned long dma_addr) { - __netmem_clear_lsb(netmem)->dma_addr = dma_addr; + netmem_to_nmdesc(netmem)->dma_addr = dma_addr; } static inline unsigned long netmem_get_dma_index(netmem_ref netmem) @@ -43,7 +45,7 @@ static inline unsigned long netmem_get_dma_index(netmem_ref netmem) if (WARN_ON_ONCE(netmem_is_net_iov(netmem))) return 0; - magic = __netmem_clear_lsb(netmem)->pp_magic; + magic = netmem_to_nmdesc(netmem)->pp_magic; return (magic & PP_DMA_INDEX_MASK) >> PP_DMA_INDEX_SHIFT; } @@ -51,12 +53,12 @@ static inline unsigned long netmem_get_dma_index(netmem_ref netmem) static inline void netmem_set_dma_index(netmem_ref netmem, unsigned long id) { - unsigned long magic; + struct netmem_desc *desc; if (WARN_ON_ONCE(netmem_is_net_iov(netmem))) return; - magic = netmem_get_pp_magic(netmem) | (id << PP_DMA_INDEX_SHIFT); - __netmem_clear_lsb(netmem)->pp_magic = magic; + desc = netmem_to_nmdesc(netmem); + desc->pp_magic |= id << PP_DMA_INDEX_SHIFT; } #endif