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 8A76FC27C4F for ; Sat, 29 Jun 2024 17:38:25 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CC58C6B008A; Sat, 29 Jun 2024 13:38:24 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C757C6B008C; Sat, 29 Jun 2024 13:38:24 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AEE3C6B0092; Sat, 29 Jun 2024 13:38:24 -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 8FA506B008A for ; Sat, 29 Jun 2024 13:38:24 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 0DE068107D for ; Sat, 29 Jun 2024 17:38:24 +0000 (UTC) X-FDA: 82284635328.30.5671B27 Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by imf28.hostedemail.com (Postfix) with ESMTP id 3652BC0013 for ; Sat, 29 Jun 2024 17:38:21 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=J3StgO2N; spf=pass (imf28.hostedemail.com: domain of alexander.duyck@gmail.com designates 209.85.221.50 as permitted sender) smtp.mailfrom=alexander.duyck@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=1719682687; 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=9zhHRLj3j1cSIdzwblrg0PYdMtiKz5IrX7f7JfITYcc=; b=rZ0xY45jlvMXI7Hj/fYhThM+5vorjFAKz+FYsb13OXbgMfuWKvB9JS7xSd4sEKOb6dMAK5 0U75yKJ3h9ImCdAH1Tp6SyoM68vwAZiIuSDpEWuQvefB8O5qhsqtqTvEZMOeB0Ungj2Oq/ I0EpjhN1ArUGur3CvvBDL3Uy0iin0Sg= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=J3StgO2N; spf=pass (imf28.hostedemail.com: domain of alexander.duyck@gmail.com designates 209.85.221.50 as permitted sender) smtp.mailfrom=alexander.duyck@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1719682687; a=rsa-sha256; cv=none; b=bH9rocIIMVQZMxLGieiUzUCYIWl2R/G3gsmIWrq12D19B7/g616zQIlnmqtvoI4nRNqs0W l0399/2raqXVF6biVGtS0cAmYYV4yZBjbeqJr9qPThSu9wgct5oEaE5kNzzEVOZfiIRPQE X6iCh1dvpWfGCLOVds84yE4nKYEsu9g= Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-3676447928bso944530f8f.0 for ; Sat, 29 Jun 2024 10:38:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1719682700; x=1720287500; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=9zhHRLj3j1cSIdzwblrg0PYdMtiKz5IrX7f7JfITYcc=; b=J3StgO2N4gOPBhKj+teO3TecdieyKHpNm8Kbg046t0vlgYYDOujEvL9j/HubAWFSJ4 E8FvicO9yTDynTAeqqcL1IEqZG0weonvsDb3a0/ZUZJSk6/MnvL/Fx6ysf1DiBJoNc3q HqRbGMpzMNCQI/AUsi58zhA7mfLIZAxAmkVDA/sUk1Ui3W1lUA0UYfxsG23RHJefNckc 3TImoNosq3l/zMxc336VXEHeLm3pCq+/4WimbERS5Nfu7fglsnmUMRhg+8Q1jUpzKcBl 8trQ0XweVZOub0VQCGv9O13DdZtb0N9qAbBu0RZDf1zlVO7e/aqsAZ5f9Sg0pueWh68R qarw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719682700; x=1720287500; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9zhHRLj3j1cSIdzwblrg0PYdMtiKz5IrX7f7JfITYcc=; b=pdN4G3xpSbqRmyefjdrIJ80KRwZWi6KeYeeITVTivpGWRXLmlyB3qLZQgUxp3dBCCu 7kmodNldVijdTA+bPe1at346joDKY4OucBYbwv8Z107sazti1lOA09PmhjBjM6t50ADt 2pwkszbm0cYNs49QXVJBKnUBBrfsw7M1R4hrq2DZwTpLVla30lvlbv6RqHGuuTx7LKRE bfWQh3KfToXaowVPub3StH/SgJPPclwqBXUgeahq2YUdbeNC/nMgMffmdYkERbc3YY3z JeziOe/5pifF6zOlkEv/Cqy1i0e88SXituMHGXxtGMOXHXGZ+Bvdfm37bVip4605cU2G bNxQ== X-Forwarded-Encrypted: i=1; AJvYcCVvy01GnralvsKfithggef4TAZQSnG0w+MrVH05zVHm82Pr9cOBtJnTnZZG6AxU1edFcTxlcd2HVPHDA5qhro9dCh0= X-Gm-Message-State: AOJu0YxtFDeeISF1YMjKgTuOsEMVvV4x8OjxKsURUW4pmkjbZGSI+vJU Fw/lXDvnkBaKD6hnTtck8aX5Ekdf82R/llPtI90+TVSBm1Do0V6opVizjP15+JlC3DzRxLXVWRa YhsDn9fYyN7zMpZJdpavUvduYkm4= X-Google-Smtp-Source: AGHT+IH6MwOruFrrnck6lTQwGix6wuCeMGq8hKMDdGXoRm6SbfYwGwoBAjleU8Ocbjki/4mRJRJ5uLFqDctz4OWAwms= X-Received: by 2002:a5d:4905:0:b0:367:3417:a4bb with SMTP id ffacd0b85a97d-367757297d0mr778616f8f.63.1719682700237; Sat, 29 Jun 2024 10:38:20 -0700 (PDT) MIME-Version: 1.0 References: <20240625135216.47007-1-linyunsheng@huawei.com> <20240625135216.47007-11-linyunsheng@huawei.com> <33c3c7fc00d2385e741dc6c9be0eade26c30bd12.camel@gmail.com> <38da183b-92ba-ce9d-5472-def199854563@huawei.com> In-Reply-To: <38da183b-92ba-ce9d-5472-def199854563@huawei.com> From: Alexander Duyck Date: Sat, 29 Jun 2024 10:37:43 -0700 Message-ID: Subject: Re: [PATCH net-next v9 10/13] mm: page_frag: introduce prepare/probe/commit API To: Yunsheng Lin Cc: davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Andrew Morton , linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Stat-Signature: i8mga8wrdwo3xahyipcnoh8aiuymdcen X-Rspam-User: X-Rspamd-Queue-Id: 3652BC0013 X-Rspamd-Server: rspam02 X-HE-Tag: 1719682701-17283 X-HE-Meta: U2FsdGVkX19vG5LS5rNc2ouH3r5o1fb4ixETGWbPRZBz7kzKalU6R+iEvdiUsJH/s4UDD46zOhlCQI47EHiEoFD5Yc4k7IVaKszE1VOnwQYJohd7Gm7BPdb/MoQJ1qsfXd5aznXUTZ86Pja/vNUI2oQ69KtbLMGyhzRoqeCL1hiGa9ueRIzNJdOv0A7rLeNtoQZqCWzUX0V1ntQQPkK/utkbrMRWZ/ppYPnvNHP8GJcQvRou48oIw1Gy8N0MFUwql530UH6feJVAKLZebwZ0E2MfHUOKAJJ+KMdKB+RUll9QKYm6WSue/hsdgm8J5L1vpnAq6YHz1QaI0O1BEMtbA1CMUQIsvmxQvMKm8JQ02mqzAiEwv9Ie4M0HNCrD6feqKgSC4GCGs+8+hUQNnQzrKikI+MGfeSFDU30DeUzffkg/uSKxbCOTYddcvUbMZqn9uFt+dn93yuYgs4oJrZ1xBBgRr7arM9v6N9Q1Pz7CJuPri3hbNNb/bJW2XHPVBXJee+WS1IBy/rS8iftTtedQhNPr2LXEt1GyokHtjyuhoeJ0neo43u/zK2Htm54SKpNnQVk53avnaXM4DwFy2hBsXsyRN53gUwNYSQ53Rumqx5M2B52ttuQQdM1zQHiUPOLl58sb13RzClCTBLovPTl4zw4WyLRdWxgLQ4pEk/nIvbmXWl+IkOwnkD1KivMgiXLo/JaOOManXkel22uIcTswyTBY83wo8ZmmJrKEVvzGI78aeKdHx780rRHx+tA6vafYXxmxxrfUN6+H8cvhAItQ09W4MB3SWgO05n5AeP0ls6FclGy4qyYAiS9UqDDfqNM+SvG+8/bqAsO+B5xhUhr4RxtqnB+yq3uTEiGMWhfos+brlG4C/AZJNrGykmYUh+WduN41znt2JKVq4dPCDC91AEahsWjAz9lyaOmiEYj8YU2ArjSYZJAnI5+FlE9/TAAOOMyYW7wMyNOItEcEWN/ 7SbLt3Yg s4NWx00AYMItSkIrub56O8QwUHbP6VMzz7j1o9jWE+5gZxvUnadsM4vZYoanQRI8RkzhLBDs6U4iaZnlCTEze5VxC3MHjiK1RCiuxVgKLeWn+DeA3bQ5+oiD/CDxiKPFo6HAD2sLhxJ44pqvqoYujvPelaflUEE0zuYtyIfLeG/XfcZeLWqD+4UTGNpIhsbHhEAlwWy1L2dtUGuJu6wkZM7pLCprGgMQZeio1L7Gg58oJxzfnPsn1LH3loSPP/X4kyM2wWx8waynb96tYcs83T5ElF1MmL5+KHto/V24eFmS5kpITtHLjYeFOG1217U589J0c1D4VGOdtWmv5m1ed0XjiDR+owgJdimMeXw2D6dhA6fIqd+enqNDcRLTvdS0RN9z8XIHKNFoYfaRpeC9QG4A9hlOg6xqWy1jrH2puh0tnpnyjaD139f7mLPybWvOEQu5BvMbcYb2Nd9pLMzz5jKHs4ZqSpaYo+NbVoImyxHKRHDzpzYWZRpcnwv9UfJLDirvtT3pvd1IIkQsTEefE+weGzQ== 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 Sat, Jun 29, 2024 at 4:15=E2=80=AFAM Yunsheng Lin wrote: > > On 2024/6/29 6:35, Alexander H Duyck wrote: > > On Tue, 2024-06-25 at 21:52 +0800, Yunsheng Lin wrote: > >> There are many use cases that need minimum memory in order > >> for forward progress, but more performant if more memory is > >> available or need to probe the cache info to use any memory > >> available for frag caoleasing reason. > >> > >> Currently skb_page_frag_refill() API is used to solve the > >> above use cases, but caller needs to know about the internal > >> detail and access the data field of 'struct page_frag' to > >> meet the requirement of the above use cases and its > >> implementation is similar to the one in mm subsystem. > >> > >> To unify those two page_frag implementations, introduce a > >> prepare API to ensure minimum memory is satisfied and return > >> how much the actual memory is available to the caller and a > >> probe API to report the current available memory to caller > >> without doing cache refilling. The caller needs to either call > >> the commit API to report how much memory it actually uses, or > >> not do so if deciding to not use any memory. > >> > >> As next patch is about to replace 'struct page_frag' with > >> 'struct page_frag_cache' in linux/sched.h, which is included > >> by the asm-offsets.s, using the virt_to_page() in the inline > >> helper of page_frag_cache.h cause a "'vmemmap' undeclared" > >> compiling error for asm-offsets.s, use a macro for probe API > >> to avoid that compiling error. > >> > >> CC: Alexander Duyck > >> Signed-off-by: Yunsheng Lin > >> --- > >> include/linux/page_frag_cache.h | 82 +++++++++++++++++++++++ > >> mm/page_frag_cache.c | 114 +++++++++++++++++++++++++++++++= + > >> 2 files changed, 196 insertions(+) > >> > >> diff --git a/include/linux/page_frag_cache.h b/include/linux/page_frag= _cache.h > >> index b33904d4494f..e95d44a36ec9 100644 > >> --- a/include/linux/page_frag_cache.h > >> +++ b/include/linux/page_frag_cache.h > >> @@ -4,6 +4,7 @@ > >> #define _LINUX_PAGE_FRAG_CACHE_H > >> > >> #include > >> +#include > >> > >> #define PAGE_FRAG_CACHE_MAX_SIZE __ALIGN_MASK(32768, ~PAGE_MASK) > >> #define PAGE_FRAG_CACHE_MAX_ORDER get_order(PAGE_FRAG_CACHE_MAX_SIZ= E) > >> @@ -87,6 +88,9 @@ static inline unsigned int page_frag_cache_page_size= (struct encoded_va *encoded_ > >> > >> void page_frag_cache_drain(struct page_frag_cache *nc); > >> void __page_frag_cache_drain(struct page *page, unsigned int count); > >> +struct page *page_frag_alloc_pg(struct page_frag_cache *nc, > >> + unsigned int *offset, unsigned int fragsz= , > >> + gfp_t gfp); > >> void *__page_frag_alloc_va_align(struct page_frag_cache *nc, > >> unsigned int fragsz, gfp_t gfp_mask, > >> unsigned int align_mask); > >> @@ -99,12 +103,90 @@ static inline void *page_frag_alloc_va_align(stru= ct page_frag_cache *nc, > >> return __page_frag_alloc_va_align(nc, fragsz, gfp_mask, -align); > >> } > >> > >> +static inline unsigned int page_frag_cache_page_offset(const struct p= age_frag_cache *nc) > >> +{ > >> + return page_frag_cache_page_size(nc->encoded_va) - nc->remaining; > >> +} > >> + > >> static inline void *page_frag_alloc_va(struct page_frag_cache *nc, > >> unsigned int fragsz, gfp_t gfp_mas= k) > >> { > >> return __page_frag_alloc_va_align(nc, fragsz, gfp_mask, ~0u); > >> } > >> > >> +void *page_frag_alloc_va_prepare(struct page_frag_cache *nc, unsigned= int *fragsz, > >> + gfp_t gfp); > >> + > >> +static inline void *page_frag_alloc_va_prepare_align(struct page_frag= _cache *nc, > >> + unsigned int *fragsz= , > >> + gfp_t gfp, > >> + unsigned int align) > >> +{ > >> + WARN_ON_ONCE(!is_power_of_2(align) || align > PAGE_SIZE); > >> + nc->remaining =3D nc->remaining & -align; > >> + return page_frag_alloc_va_prepare(nc, fragsz, gfp); > >> +} > >> + > >> +struct page *page_frag_alloc_pg_prepare(struct page_frag_cache *nc, > >> + unsigned int *offset, > >> + unsigned int *fragsz, gfp_t gfp); > >> + > >> +struct page *page_frag_alloc_prepare(struct page_frag_cache *nc, > >> + unsigned int *offset, > >> + unsigned int *fragsz, > >> + void **va, gfp_t gfp); > >> + > >> +static inline struct encoded_va *__page_frag_alloc_probe(struct page_= frag_cache *nc, > >> + unsigned int *of= fset, > >> + unsigned int *fr= agsz, > >> + void **va) > >> +{ > >> + struct encoded_va *encoded_va; > >> + > >> + *fragsz =3D nc->remaining; > >> + encoded_va =3D nc->encoded_va; > >> + *offset =3D page_frag_cache_page_size(encoded_va) - *fragsz; > >> + *va =3D encoded_page_address(encoded_va) + *offset; > >> + > >> + return encoded_va; > >> +} > >> + > >> +#define page_frag_alloc_probe(nc, offset, fragsz, va) = \ > >> +({ \ > >> + struct page *__page =3D NULL; = \ > >> + \ > >> + VM_BUG_ON(!*(fragsz)); \ > >> + if (likely((nc)->remaining >=3D *(fragsz))) = \ > >> + __page =3D virt_to_page(__page_frag_alloc_probe(nc, = \ > >> + offset, \ > >> + fragsz, \ > >> + va)); \ > >> + \ > >> + __page; \ > >> +}) > >> + > > > > Why is this a macro instead of just being an inline? Are you trying to > > avoid having to include a header due to the virt_to_page? > > Yes, you are right. > I tried including different headers for virt_to_page(), and it did not > work for arch/x86/kernel/asm-offsets.s, which has included linux/sched.h, > and linux/sched.h need 'struct page_frag_cache' for 'struct task_struct' > after this patchset, including page_frag_cache.h for sched.h causes the > below compiler error: > > CC arch/x86/kernel/asm-offsets.s > In file included from ./arch/x86/include/asm/page.h:89, > from ./arch/x86/include/asm/thread_info.h:12, > from ./include/linux/thread_info.h:60, > from ./include/linux/spinlock.h:60, > from ./include/linux/swait.h:7, > from ./include/linux/completion.h:12, > from ./include/linux/crypto.h:15, > from arch/x86/kernel/asm-offsets.c:9: > ./include/linux/page_frag_cache.h: In function =E2=80=98page_frag_alloc_a= lign=E2=80=99: > ./include/asm-generic/memory_model.h:37:34: error: =E2=80=98vmemmap=E2=80= =99 undeclared (first use in this function); did you mean =E2=80=98mem_map= =E2=80=99? > 37 | #define __pfn_to_page(pfn) (vmemmap + (pfn)) > | ^~~~~~~ > ./include/asm-generic/memory_model.h:65:21: note: in expansion of macro = =E2=80=98__pfn_to_page=E2=80=99 > 65 | #define pfn_to_page __pfn_to_page > | ^~~~~~~~~~~~~ > ./arch/x86/include/asm/page.h:68:33: note: in expansion of macro =E2=80= =98pfn_to_page=E2=80=99 > 68 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_S= HIFT) > | ^~~~~~~~~~~ > ./include/linux/page_frag_cache.h:151:16: note: in expansion of macro =E2= =80=98virt_to_page=E2=80=99 > 151 | return virt_to_page(va); > | ^~~~~~~~~~~~ > ./include/asm-generic/memory_model.h:37:34: note: each undeclared identif= ier is reported only once for each function it appears in > 37 | #define __pfn_to_page(pfn) (vmemmap + (pfn)) > | ^~~~~~~ > ./include/asm-generic/memory_model.h:65:21: note: in expansion of macro = =E2=80=98__pfn_to_page=E2=80=99 > 65 | #define pfn_to_page __pfn_to_page > | ^~~~~~~~~~~~~ > ./arch/x86/include/asm/page.h:68:33: note: in expansion of macro =E2=80= =98pfn_to_page=E2=80=99 > 68 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_S= HIFT) > | ^~~~~~~~~~~ > ./include/linux/page_frag_cache.h:151:16: note: in expansion of macro =E2= =80=98virt_to_page=E2=80=99 > 151 | return virt_to_page(va); > > I am pretty sure you just need to add: #include