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 2244EC83F10 for ; Sat, 12 Jul 2025 13:57:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2DBDD6B009B; Sat, 12 Jul 2025 09:57:03 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 28B7E6B00B2; Sat, 12 Jul 2025 09:57:03 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 153A36B00BE; Sat, 12 Jul 2025 09:57:03 -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 F2D5D6B009B for ; Sat, 12 Jul 2025 09:57:02 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id E169010C475 for ; Sat, 12 Jul 2025 13:57:01 +0000 (UTC) X-FDA: 83655763842.12.3F0A70D Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) by imf18.hostedemail.com (Postfix) with ESMTP id CAA8A1C0002 for ; Sat, 12 Jul 2025 13:56:59 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="Ypl/lCC1"; spf=pass (imf18.hostedemail.com: domain of asml.silence@gmail.com designates 209.85.218.54 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=1752328619; a=rsa-sha256; cv=none; b=wwLLxeyHBPmSVhl5kKl1HZ3yhtbnDPHiQD51Eo6OpPmKDy4dA0RtJ7YnvpwbtsOcEoVuos 5KBxTyX0mBMrfoWUaJebITk9NoB/kVTjehcmt+QfHA294BQ7b6VTAgRseFZUx4NVVVuyqW E+Yb0cx18N7jcuvufme6uoEbQEa7w3o= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="Ypl/lCC1"; spf=pass (imf18.hostedemail.com: domain of asml.silence@gmail.com designates 209.85.218.54 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=1752328619; 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=LWT0gpnYa11KRjN6//9ilbj19qNJCuSNe5kuXlg66Eg=; b=JsylOEFKtJtxQuSMmo5BKyYHiols8FPROucF0bUfQ9i5zQnZLzuNwcp5KvRu0HYcYhxAvk nObhiJLThilwj7PVZ+puZeDN/aknyhMP7EYMVVLoyUWJRHmcQPNytFEG8ophd9TH9Uknph SfHV1TX0NhKpArL0Ta8a5eE1QcwSNAo= Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-ae0bc7aa21bso621699366b.2 for ; Sat, 12 Jul 2025 06:56:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752328618; x=1752933418; 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=LWT0gpnYa11KRjN6//9ilbj19qNJCuSNe5kuXlg66Eg=; b=Ypl/lCC1Oe3N6qBY3KC2eYNL77KpMgZVBScVoK7a5T3hg3AJMLmvi6g/3Y2KmqGr7g RyQ54xdct2czT9GPLFNlSqzc2eOPCA1EInua1sdCshgjUWo2ysMdPAcR06EjNLg1ZABU mhWeuU8hlPHIXY4Da6l1RjOOFW0ft7NZ7t3HuczOAgEzzG40RPe6nCt9jHgYtrVPmetI s9FhLrtCZuTJfzvDlrD3Sm2Eb7vRd2wZ0Djx4mYl0Hket+XQqVZuvRX/Guei2df3JJGp wVy7LIh89v+i64yzT25k1uVrLqB2ZHqOBnPf+jDeMj7Bf49TvsnAeTGUMqXSwCgfn9Gh +MOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752328618; x=1752933418; 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=LWT0gpnYa11KRjN6//9ilbj19qNJCuSNe5kuXlg66Eg=; b=DI3bmcXrJLLshDxYfOlJw4KuP/KZIgXnDjso7+h9dVBJoX6J7Cl/0WhF31djkJbXdc y18aOij27iKDwuGRVoj2uVtrNqbjqGLZwCL8pwh0GPht6KeBXq1Dk/xUWfHZLHGDfxf2 RNUgI3EsvVgiggttMx3rPRiFxrRmqj3++wsXKvu9eNDeqnVuGGITDC3BKMNlqAK8loYk x0WWg2G4YrG8AQjaj+1+62SqDIkOKz4LmcchKfAQmQiLNFv7m1FSFWBDuw6+Cy2M6hm3 U1sD7GdtFePIjY90srDXgVo6eY5fP9PBce2pTBK1rS1ivyYRepf1d8Aa8E47E6OkjpfO ySdQ== X-Forwarded-Encrypted: i=1; AJvYcCUb2wcSUsPb0r8/+Moa/ij0l9vaUR9IgZo5CGvnCmf2SoMhcvY98EsuNKSZAt41rHyExig1V6ZZEg==@kvack.org X-Gm-Message-State: AOJu0Yz9GrsTjFxAwjZyCvpaQWhxOnewGlJynquACxsVUryDeeUQV2xD dFn52Pt2/YALOJXuTeBmTHYcKsbbp2sFct59GQVCju6y4Jm0Wzi4wHRr X-Gm-Gg: ASbGncsp+fGLoS0P+LUdE3oWzT32Xi8ejeRHq5JOVV0afiWPWkLxZkTLvCu+TEGvUKD LnEdPOJnKp8N/ul+09jn0Bd8lIhl3T4MN8fcNXKG62nh+I66yzwoXktetz14g4dNVZ8hFZErT/O gxDQHsGlqwXBJySW6lHV/jeoJyNrXCjdg7whaW26idCVC9YJmy+JkHhBJzbjvWQJCHNQ4irdxPs PI1wCbrkLKth+kWbiwi+LJEs3LPaSOxvR2KKkQeJZUs2lf8bzyNaBJfh/muDAggaj0cTwCMVM5t /R0nU7wPavBB1ngdbxCI5Ru2vAADzFNJ815+Mp5Ef7qYkBRn6Jhx2Rvt1HhdE6U/H7IVW/Vi+jV dYSMrKmbLdwDym4bV0tOnatm9S5uJ9SOFHFM= X-Google-Smtp-Source: AGHT+IHPBpXdo4+Kf06SYR/uX0tK1lNZqoC5zzneXzKAVwNs+13swe0gxWXk5ow4jkTd10LBb7qjpA== X-Received: by 2002:a17:907:94c8:b0:ae3:74e1:81a3 with SMTP id a640c23a62f3a-ae6fca02479mr620885266b.8.1752328617862; Sat, 12 Jul 2025 06:56:57 -0700 (PDT) Received: from ?IPV6:2620:10d:c096:325::1ac? ([2620:10d:c092:600::1:b2ad]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae6e826462bsm492380166b.104.2025.07.12.06.56.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 12 Jul 2025 06:56:57 -0700 (PDT) Message-ID: <582f41c0-2742-4400-9c81-0d46bf4e8314@gmail.com> Date: Sat, 12 Jul 2025 14:58:14 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH net-next v9 3/8] page_pool: access ->pp_magic through struct netmem_desc in page_pool_page_is_pp() To: Byungchul Park , Mina Almasry , David Hildenbrand , "willy@infradead.org" Cc: 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, 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-4-byungchul@sk.com> <20250711011435.GC40145@system.software.com> Content-Language: en-US From: Pavel Begunkov In-Reply-To: <20250711011435.GC40145@system.software.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspam-User: X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: CAA8A1C0002 X-Stat-Signature: c65ozuynebnixzx5eh94roacbxj1hn1d X-HE-Tag: 1752328619-846386 X-HE-Meta: U2FsdGVkX18Qf1iX+PdGlTNlORoQLrBETr9ggm7OS9cSbcpK6MjEAQogwMXYlO72bKrsHHaKlmxf/z/6rI1526mmSk1+NDTx4Ah78n9bpszSomlvE5JEnTdjD/oUzNyLSfdUZ+wRDvIvqEFW1cHoUp/QyqblzVG2FEHaQ89hw3Y4jFNl9OpMvnQIztcX3CIa7speePF3t4AioaML6IFlRob5fIIsQyZDmmRgEPFpP8dj2fG391rMbxKUnGBNGnatw4ig69papQKbfGZ0TE645Xf4WIinvJXBe5zVnrvxqY+rQYj6dKBdEE9Y8hUT3I3ytKemQvfwY8p6LjwS+ixadoeasPhpKV9sE8bpkC5dIF5iS1ZDsCNSbVXhzmOhiKrTLQjg2Den785lNHIFdKJNG+4RD2GvAprKJIsv+lWm2rYu3JuyVwx8cvKw/VkUC4xwprZP5ISesEn+wBTX3LIEtNuU3y7qXWzBDAZ4Laj670B2uCka8hJdTLO3lBE5HFD4AUAW4zZWeooADiVB2GXZ5aEjP1xub7YOIkQaUEj+2eV9vGYdnFXje13Ok7py7Ad0nUhtxDUpRYN6VKZ94LIrEgvihdRAyWV4l+cOdqXBW5eAs8O6+E82A0OGAtO0GnLaXDbw2V3rnlX4JUlDzjcp9p7vvZzEKsN7N9JARw1EDBC3PGCjYZg7wNrP0O8HUuXHQ1TmkTnYmXYat5RUXCskrfWFQRXYDoaKl3R8oYvLkqZ8+RRO/4ZGwWSBKtSNne50+Iz8g+lPVWP83lntoMb3aAPogp4Jx7zOaqpdlHFR31WBBjrxAczEb5xnPDknldKTxwTePRaknfWPzqob1+DirwIIqALU1LsDJlhCeL/IvdfV01DAu3duBwYdodBySLMoODFHax5IFT3TglD2NLuPuyWH3nPLF4303pub55lhfY7Yb9nIo7TOJTEJucOV+vnjakzPXAiwUIq15aZ/v6A fXK6QLsf P/i0Ck1yq+xzkaCmVQ9gIhG13H+ZQfxcaQSkh1Rxt4OWQ5813xp/10uK1pm6ja53UDRWxc8BWqC+/AHDwgezpTytcqfg9E13WHsDxR2yzITzmBHDRMkdw1t/+I7gpnwbczH47HyoRhsPgGIFVL/DwHyYi8eShxC4EGKQ0gjSHuQVan9sn+blg7+5TGgI1yBJ7afJMBPG5IVorH/7T2SZ3SSai+/mPNObeFa/OjELhZIgB99Y9OH21NgSbwgIvMYPqM8EBBuByEA/fdHKdBInDAvhTymqi35s/+hGgMDixqLU6Wcmh4kiXT7gwPiAWPRo80qBlmZ94M69IVtXbusSUJJV/G/PyVlclLrKyWXFcP4Sn+5S3VkhV59XAR0ltBnCbZT4GoS1pfOhDoAbk38fSQHRfpD8Q2IthxW4VjWM0dMNMH6vETeehnSbKZra96bXVthnmNIO+1VA1pCdPNSwSuJzuztnKtLTGP7MePWZPVvixbdr7gQSte+gVcsdBJxhJFkpGzygxOHVqB6GGk/TFl/kxpzScVnLwkiI3I0+0JbP/+KM3lAKvDf+GUA+gG7nKv2ckkcpDOLAMeM26/zzlB8s0iNBcUr1gnmXrryTZszvS4ABHCNP5sUzmtMlPJWuvHrbnibF/SbqL+RMa9KYvqK7MBrfu4OAb/oZ++VYjVdyndR9ztbViMk8kbW8Tp29rwF4dIPkhkd5xl5w= 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/11/25 02:14, Byungchul Park wrote: ...>>> +#ifdef CONFIG_PAGE_POOL >>> +/* XXX: This would better be moved to mm, once mm gets its way to >>> + * identify the type of page for page pool. >>> + */ >>> +static inline bool page_pool_page_is_pp(struct page *page) >>> +{ >>> + struct netmem_desc *desc = page_to_nmdesc(page); >>> + >>> + return (desc->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE; >>> +} >> >> pages can be pp pages (where they have pp fields inside of them) or >> non-pp pages (where they don't have pp fields inside them, because >> they were never allocated from the page_pool). >> >> Casting a page to a netmem_desc, and then checking if the page was a >> pp page doesn't makes sense to me on a fundamental level. The >> netmem_desc is only valid if the page was a pp page in the first >> place. Maybe page_to_nmdesc should reject the cast if the page is not >> a pp page or something. > > Right, as you already know, the current mainline code already has the > same problem but we've been using the werid way so far, in other words, > mm code is checking if it's a pp page or not by using ->pp_magic, but > it's ->lur, ->buddy_list, or ->pcp_list if it's not a pp page. > > Both the mainline code and this patch can make sense *only if* it's > actually a pp page. It's unevitable until mm provides a way to identify > the type of page for page pool. Thoughts? Question to mm folks, can we add a new PGTY for page pool and use that to filter page pool originated pages? Like in the incomplete and untested diff below? commit 8fc2347fb3ff4a3fc7929c70a5a21e1128935d4a Author: Pavel Begunkov Date: Sat Jul 12 14:29:52 2025 +0100 net/mm: use PGTY for tracking page pool pages Currently, we use page->pp_magic to determine whether a page belongs to a page pool. It's not ideal as the field is aliased with other page types, and thus needs to to rely on elaborated rules to work. Add a new page type for page pool. diff --git a/include/linux/mm.h b/include/linux/mm.h index 0ef2ba0c667a..975a013f1f17 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4175,7 +4175,7 @@ int arch_lock_shadow_stack_status(struct task_struct *t, unsigned long status); #ifdef CONFIG_PAGE_POOL static inline bool page_pool_page_is_pp(struct page *page) { - return (page->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE; + return PageNetpp(page); } #else static inline bool page_pool_page_is_pp(struct page *page) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 4fe5ee67535b..9bd1dfded2fc 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -957,6 +957,7 @@ enum pagetype { PGTY_zsmalloc = 0xf6, PGTY_unaccepted = 0xf7, PGTY_large_kmalloc = 0xf8, + PGTY_netpp = 0xf9, PGTY_mapcount_underflow = 0xff }; @@ -1101,6 +1102,11 @@ PAGE_TYPE_OPS(Zsmalloc, zsmalloc, zsmalloc) PAGE_TYPE_OPS(Unaccepted, unaccepted, unaccepted) FOLIO_TYPE_OPS(large_kmalloc, large_kmalloc) +/* + * Marks page_pool allocated pages + */ +PAGE_TYPE_OPS(Netpp, netpp, netpp) + /** * PageHuge - Determine if the page belongs to hugetlbfs * @page: The page to test. diff --git a/include/net/netmem.h b/include/net/netmem.h index de1d95f04076..20f5dbb08149 100644 --- a/include/net/netmem.h +++ b/include/net/netmem.h @@ -113,6 +113,8 @@ static inline bool netmem_is_net_iov(const netmem_ref netmem) */ static inline struct page *__netmem_to_page(netmem_ref netmem) { + DEBUG_NET_WARN_ON_ONCE(netmem_is_net_iov(netmem)); + return (__force struct page *)netmem; } diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h index cd95394399b4..e38c64da1a78 100644 --- a/net/core/netmem_priv.h +++ b/net/core/netmem_priv.h @@ -13,16 +13,11 @@ static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) __netmem_clear_lsb(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); - - __netmem_clear_lsb(netmem)->pp_magic = 0; -} - static inline bool netmem_is_pp(netmem_ref netmem) { - return (netmem_get_pp_magic(netmem) & PP_MAGIC_MASK) == PP_SIGNATURE; + if (netmem_is_net_iov(netmem)) + return true; + return page_pool_page_is_pp(netmem_to_page(netmem)); } static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool) diff --git a/net/core/page_pool.c b/net/core/page_pool.c index 05e2e22a8f7c..52120e2912a6 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -371,6 +371,13 @@ struct page_pool *page_pool_create(const struct page_pool_params *params) } EXPORT_SYMBOL(page_pool_create); +static void page_pool_set_page_pp_info(struct page_pool *pool, + struct page *page) +{ + __SetPageNetpp(page); + page_pool_set_pp_info(page_to_netmem(page)); +} + static void page_pool_return_netmem(struct page_pool *pool, netmem_ref netmem); static noinline netmem_ref page_pool_refill_alloc_cache(struct page_pool *pool) @@ -534,7 +541,7 @@ static struct page *__page_pool_alloc_page_order(struct page_pool *pool, } alloc_stat_inc(pool, slow_high_order); - page_pool_set_pp_info(pool, page_to_netmem(page)); + page_pool_set_page_pp_info(pool, page); /* Track how many pages are held 'in-flight' */ pool->pages_state_hold_cnt++; @@ -579,7 +586,7 @@ static noinline netmem_ref __page_pool_alloc_netmems_slow(struct page_pool *pool continue; } - page_pool_set_pp_info(pool, netmem); + page_pool_set_page_pp_info(pool, __netmem_to_page(netmem)); pool->alloc.cache[pool->alloc.count++] = netmem; /* Track how many pages are held 'in-flight' */ pool->pages_state_hold_cnt++; @@ -654,7 +661,6 @@ s32 page_pool_inflight(const struct page_pool *pool, bool strict) void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem) { netmem_set_pp(netmem, pool); - netmem_or_pp_magic(netmem, PP_SIGNATURE); /* Ensuring all pages have been split into one fragment initially: * page_pool_set_pp_info() is only called once for every page when it @@ -669,7 +675,6 @@ void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem) void page_pool_clear_pp_info(netmem_ref netmem) { - netmem_clear_pp_magic(netmem); netmem_set_pp(netmem, NULL); } @@ -730,8 +735,11 @@ static void page_pool_return_netmem(struct page_pool *pool, netmem_ref netmem) trace_page_pool_state_release(pool, netmem, count); if (put) { + struct page *page = netmem_to_page(netmem); + page_pool_clear_pp_info(netmem); - put_page(netmem_to_page(netmem)); + __ClearPageNetpp(page); + put_page(page); } /* An optimization would be to call __free_pages(page, pool->p.order) * knowing page is not part of page-cache (thus avoiding a -- Pavel Begunkov