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 C7B32C54FB3 for ; Mon, 26 May 2025 16:57:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 62D7F6B007B; Mon, 26 May 2025 12:57:04 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5B7626B0083; Mon, 26 May 2025 12:57:04 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 47FD46B0085; Mon, 26 May 2025 12:57:04 -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 2527B6B007B for ; Mon, 26 May 2025 12:57:04 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 303431209C2 for ; Mon, 26 May 2025 16:57:03 +0000 (UTC) X-FDA: 83485663926.12.81489BD Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) by imf24.hostedemail.com (Postfix) with ESMTP id 290E118000C for ; Mon, 26 May 2025 16:57:00 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=OlNRSl9N; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf24.hostedemail.com: domain of asml.silence@gmail.com designates 209.85.208.41 as permitted sender) smtp.mailfrom=asml.silence@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748278621; a=rsa-sha256; cv=none; b=M8upEc7WM0RaZVRV2sCnJQmCFOVqV6ZXcOdGLgEQekn6BzAwc68p1PiCrfsCJKYvGsFrSV ZWGMIklbsunM1v4or//1eTV7oes5Bz92XYVQsOudtF7PJDcgElZtCfMsa+XRIK3WSIOYTw cjCrCYL7yywgbKO1KK9bJAfOfHR6myw= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=OlNRSl9N; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf24.hostedemail.com: domain of asml.silence@gmail.com designates 209.85.208.41 as permitted sender) smtp.mailfrom=asml.silence@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1748278621; 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=wtI2+wIxxv2aUKRPo8uX1bj6NM14E537wEMghl0q2io=; b=HvlBJY/6bR9AZ0AMVLCa+zqXyeJYaRww1BlIR+Bv9Uid4ogpjzBCb639evcJVx5uC2b9dH gB+DUqVScYfefeAubQbFBsRaw/4own69LDsM00tZlKdD8oBgcVbNyBr9z+KhaZZOw9MZvT 9/EHQQ3lPz70VLF/X4i+h9ehUEYJ8C0= Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-602346b1997so3699464a12.3 for ; Mon, 26 May 2025 09:57:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748278619; x=1748883419; 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=wtI2+wIxxv2aUKRPo8uX1bj6NM14E537wEMghl0q2io=; b=OlNRSl9Nj5m6bFYd1CX8jSJKq665sAkjNluppKUvXHo0HbBNb0zAB+LBc84fk3btvm /iRDKLoX3BPm/sfsnH9j25K37C/nEgiYkMJCOsMEEHqVH9R/07b+S7EwQ+1vpsibqwpu mUPEFu8kjXzH1PGOwPxoeFL4+VD9LblCDbaA5A5Z8ka4q8vX5pl9MFfkhz0HMwSbwV3q I7qXM0Ax8h9OHJuv8Ici7AHhCr1CRCLsvSDevCZebmaeFq5dqKXaHuVwH6mZXeZvUa8k T3jnOwdcMTcEJYhaqfe635fncj72tG5Y3RUt3/HaHu+yxoojMmY2+lWyrfp1/wGTvFS/ OV3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748278619; x=1748883419; 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=wtI2+wIxxv2aUKRPo8uX1bj6NM14E537wEMghl0q2io=; b=ecYyIdGIz7ZjproPWNsTyQQ/ml/HYl8lPWgZvXAR2wlmII9cIwmqoMjvrUsxvdQPqO l3qTtfBRimGes2LuGCnosyYYAI7sSL/txG3QSH31NR3X3cAbstEc7U8B7Ef+04d/GOqI qN37ov5vqhyaat07k/JRQnRUQE/PJJZMlaHnI4c3yAoQdQNkmm9JNEPHHqr1u6f7Xy1s Vf1lNHB+wDhelzAB+MpISCKhRrlLtwg8aSKVRdWC546CdmWWyOvJVjS7LDcLn7fZw4MR ZRfBVw5aBMN1oirOxj1lRiOqTImOL2GTDHzv6zXwr6Nn6IY52ml6rrJrO00mE9nmmBrN 71oA== X-Forwarded-Encrypted: i=1; AJvYcCUiaR10J/HIX0qYmhi/BgphhiyyAH0vZkxOWqvPy8ZZA/C9wEUc6frHdgKB09n06cAfoZd8OHxxSw==@kvack.org X-Gm-Message-State: AOJu0YySpdvJ43MXhapEq/Gj7Fu1ABtFvKSkkaHa9kx0vX9iAXk7Xopj cy+nUpQfIl+6IffG49UcFqDy8cV14oUv/GAEPO4n3EN9CiknlSLkS406 X-Gm-Gg: ASbGncuhwjBH7SMTyrnn0U9aSY52T26ge/FrGwky/G+FFHWJ06dxjDjmXwEME4HoAj3 N+UcB6cs1W+qxkahdGXQP6Ko6R3Cs93UkNQTvElyeJULcQXRs8FOkMPG4w0w6E+6KuutZt3ia5Q N3FVQtXcEI8xmgUEpOe3eYWTsaqIhkD9vJMTgD5dnu+2T2aCDkLteRWF4XkIQ8YexP/ztuQij2R DkcP3yRNlPKHuDueVeQWbzyDflgsYkyfWvPe0sXaeGVAw4T3cUE17n5kPX3ebQAHg8keQOwgpg4 Qe0X4DsNKGBXA0vTW9NwFkvuIWvgM6Ap6dMtF5X2VE+I6teDjwoUEEwRsSvY X-Google-Smtp-Source: AGHT+IHIU4hwSe/lUANY7Ot/pQUZbeTO+/Y8j+ii+4Tvkv/qi38bDUgS2PtlnL+W0MaH1RZhir1pXQ== X-Received: by 2002:a05:6402:26c1:b0:5ff:addb:653e with SMTP id 4fb4d7f45d1cf-602da304c36mr7451507a12.23.1748278619230; Mon, 26 May 2025 09:56:59 -0700 (PDT) Received: from [192.168.8.100] ([148.252.132.24]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-604533ace77sm3390798a12.6.2025.05.26.09.56.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 26 May 2025 09:56:58 -0700 (PDT) Message-ID: Date: Mon, 26 May 2025 17:58:10 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 18/18] mm, netmem: remove the page pool members in struct page To: Byungchul Park , Mina Almasry Cc: willy@infradead.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, kernel_team@skhynix.com, kuba@kernel.org, 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 References: <20250523032609.16334-1-byungchul@sk.com> <20250523032609.16334-19-byungchul@sk.com> <20250526013744.GD74632@system.software.com> Content-Language: en-US From: Pavel Begunkov In-Reply-To: <20250526013744.GD74632@system.software.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 290E118000C X-Stat-Signature: u1pc4bjsq4bxkqmj8jggwjiuhdz5qwjo X-Rspam-User: X-HE-Tag: 1748278620-351281 X-HE-Meta: U2FsdGVkX1/Wfl7BnFjWT5VZbYxfU5V0f+ksdx4qr4C3/skIAYRoCplPsqKO499tqhZkDN6aDnN4AAQy5A4DeEEeHs5aAq0z4agknq9F79IRYNujNBbc21xbYnhyRhGzYDOKHyMwXR1+NMtTnrdMfXrhRmfcDkJi+gc3XaTjnQ9qHohgX1aMhZED66qjt0CTZ2awhat40k2v1gv5O400dNEtQ/45dO9IEY0a5RltzrsiveB8Y2n4nQ7q6T1tn3tC/+sBNBahZBKUOaMWZ3QLg+G7HuJuFZH3INL+sOy41xb5jtu7N3siod4MFCe7fOufmui2UvSxfaqkNno0wa4h2sDejLq2APpgEr/xKZk2SiFfKX4gRs5g0NCcN7xjfhi3x9Y+v6XyWqI69w5o9daDyt0mfJu8z8kRpoq5HdJfIPbjz6xw7hP3AHMkn/b1qTvKYtg6VYDG3gC2prJgpAQpe2Ov+HQl/YNbRkjjkTgac+D3L4WziJaisaHgr0rW93t5Jb2o5Ddi92J6Cf8MHVBkscq2GoCKLTD4hKEEYEgVvtVHFhsuGNo+BreX0Fy+1hXSHMHhi+ZuK10PeAK7OO6nBaxal+B3AC4s7SvpF4uk+HL8pgsyH7GYYcxVuaXYxBRT4grAK12dtDwEwDU07yNLa1teqDyMefhNvR3/GG5Y98uMtnL92oZ0xX820RseCxhWZguNBr8Sls3NR6ugnDAk38qV0zF5zKUJ/NgRGsBPCqSKZtxlQ0doxATyKx9FgJrgOskNnylwzTQyqMVIJKOM0lw8ywvxCV4moKVENwxDXPO+6ES+E/Mlee9fZeKQ1AM9Q5Qm7hsNi+N9j3fS0opwDW9FNmV2Hx/hDP8dtNkn2cX1z8iSDQ7cyJjPTdXGRVIeFmb8RnBuXJV6tnnNyEDFJYD7mxOaERIS1P0hRksnkqfPNN39f3Hw+PCtRQRQefXar5x/6NS19YN9CmKaqgG s5yw/yMb d2nCUvfPa3QlLHU03iBL8qq/YjZ/VSzJHGS+4rXg5BERC0xDMZ91Sgzp91In927oQn40niVm4+JpIVOrN6JNmXD4bI7QOeiQ8o6ba2CpIoS3aOQ+gtFPMCDMlTlerHwzNoKmVdu0rMC864KpkdpqbhyQeXaFK0lCSpgyNJa3pIIUHbLhr7JSlD9bsAQ7wtzeGK7D9PRI2XcU/ewNrNuTFUJLxnrhe2Uchm/o2ZKDT2IIzoa/0qatsFIGeY1WmByO+l5G5s1B9hfCZH6JxkfD8K2NG21qTU7Ve7hHex4RGavXK7XDcOE0bUD4cvMBBi9sC0mL7+IjgUrgKxe6+od9nWMy/7pbBfMdKuEHDCJZSaDJnNLnc6oCKvHY/G9JrO/92n4tTJ/qylQtjaPuAlod8681ePCiBZQoHvEUONqICopCD4rqF9zg1lV7BLN1QWcZIRbfQDXgUjF66GXLLiM9PWXKzUCLnlxnPhkZyNxbN9JODGeD1VyvPRx45XAkAu1PG5Q0eKSGQSs3oIx8TnkKUdCF3DD0HtdTx2cc8hsIOKxX398/EJ98K7mgCX/RWa27l0C5C/zKfK0VnUNuVFsBOl15Oc3q75MvsuZQD 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 5/26/25 02:37, Byungchul Park wrote: > On Fri, May 23, 2025 at 10:55:54AM -0700, Mina Almasry wrote: >> On Thu, May 22, 2025 at 8:26 PM Byungchul Park wrote: >>> >>> 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 add a static checker for >>> the size. >>> >>> Signed-off-by: Byungchul Park >>> --- >>> include/linux/mm_types.h | 11 ----------- >>> include/net/netmem.h | 28 +++++----------------------- >>> 2 files changed, 5 insertions(+), 34 deletions(-) >>> >>> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h >>> index 873e820e1521..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 */ >>> - unsigned long _pp_mapping_pad; >>> - /** >>> - * @pp_magic: magic value to avoid recycling non >>> - * page_pool allocated pages. >>> - */ >>> - unsigned long pp_magic; >>> - struct page_pool *pp; >>> - 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 c63a7e20f5f3..257c22398d7a 100644 >>> --- a/include/net/netmem.h >>> +++ b/include/net/netmem.h >>> @@ -77,30 +77,12 @@ struct net_iov_area { >>> unsigned long base_virtual; >>> }; >>> >>> -/* These fields in struct page are used by the page_pool and net stack: >>> - * >>> - * struct { >>> - * unsigned long _pp_mapping_pad; >>> - * unsigned long pp_magic; >>> - * struct page_pool *pp; >>> - * 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. >>> +/* 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. >>> */ >>> -#define NET_IOV_ASSERT_OFFSET(pg, iov) \ >>> - 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 >>> +static_assert(sizeof(struct netmem_desc) <= offsetof(struct page, _refcount)); >>> >> >> Removing these asserts is actually a bit dangerous. Functions like >> netmem_or_pp_magic() rely on the fact that the offsets are the same >> between struct page and struct net_iov to access these fields without > > Worth noting this patch removes the page pool fields from struct page. static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem) { return (struct net_iov *)((__force unsigned long)netmem & ~NET_IOV); } static inline atomic_long_t *netmem_get_pp_ref_count_ref(netmem_ref netmem) { return &__netmem_clear_lsb(netmem)->pp_ref_count; } That's a snippet of code after applying the series. So, let's say we take a page, it's casted to netmem, then the netmem (as it was before) is casted to net_iov. Before it relied on net_iov and the pp's part of the page having the same layout, which was checked by static asserts, but now, unless I'm mistaken, it's aligned in the exactly same way but points to a seemingly random offset of the page. We should not be doing that. Just to be clear, I think casting pages to struct net_iov *, as it currently is, is quite ugly, but that's something netmem_desc and this effort can help with. What you likely want to do is: Patch 1: struct page { unsigned long flags; union { struct_group_tagged(netmem_desc, netmem_desc) { // same layout as before ... struct page_pool *pp; ... }; } } struct net_iov { unsigned long flags_padding; union { struct { // same layout as in page + build asserts; ... struct page_pool *pp; ... }; struct netmem_desc desc; }; }; struct netmem_desc *page_to_netmem_desc(struct page *page) { return &page->netmem_desc; } struct netmem_desc *netmem_to_desc(netmem_t netmem) { if (netmem_is_page(netmem)) return page_to_netmem_desc(netmem_to_page(netmem); return &netmem_to_niov(netmem)->desc; } The compiler should be able to optimise the branch in netmem_to_desc(), but we might need to help it a bit. Then, patch 2 ... N convert page pool and everyone else accessing those page fields directly to netmem_to_desc / etc. And the final patch replaces the struct group in the page with a new field: struct netmem_desc { struct page_pool *pp; ... }; struct page { unsigned long flags_padding; union { struct netmem_desc desc; ... }; }; net_iov will drop its union in a later series to avoid conflicts. btw, I don't think you need to convert page pool to netmem for this to happen, so that can be done in a separate unrelated series. It's 18 patches, and netdev usually requires it to be no more than 15. -- Pavel Begunkov