Received: by 2002:ab2:1149:0:b0:1f3:1f8c:d0c6 with SMTP id z9csp2410786lqz; Tue, 2 Apr 2024 17:29:56 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVewRum/OgQYwuT3DtJCQTiVD/5S6Y509h1rAjtH9aDS9Y3643eEp7Sg4nM0gsaOJUo7fwjOTepsN9jQ/y+SJgJW62BhNj5ZPPMI2e+Bw== X-Google-Smtp-Source: AGHT+IGy2YGS/MOxp8Qb1SiqyINdD2uPQT56Ujm0psopzuvFdIgGrGyYTKEiLWSv219gHT3hd88U X-Received: by 2002:a17:903:22c5:b0:1df:fe8a:2284 with SMTP id y5-20020a17090322c500b001dffe8a2284mr15916642plg.8.1712104196031; Tue, 02 Apr 2024 17:29:56 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712104196; cv=pass; d=google.com; s=arc-20160816; b=PMDy//a08KYVHR5ky7lZYpZzj8EOZa/rtFQYKhPXl7jeQ8ADAJPdDsRkcMvP9uVBIb MG7vxfRsopkNbZrMPyYLQTbjQmu0vh4fxhGSP4LBr2O98grZyxiywqGfp9P6mz+S4+s/ B6AaON9Wisx+Xd9M3T11hcisAfyI3cNo8HOupmuwAHfm/ynw0NlWmWC0TYuBG5pzEjAi OJDacvIV3gKvX4SXT0yzc6XYfoM8EHZRwmXq6o5QWtJS8AUpgnvCe+CzW3OWcmJNLADk Zc63zrTQVJeURn35MzSIXYvQb+UavYAWAZN5ROq1M2tnCcRtyQy0WBmdGmW7hYPsgsXB y12Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:from:subject:message-id:references:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:in-reply-to:date :dkim-signature; bh=+KDnK9042R37xuDgfAU4H+c5h2ZT59o2lkrQnd2iy6g=; fh=ya2edrOfW4sTr5Sucz23DxUKzK25tHheqRPGshdVbKI=; b=XJTYDeAdy8kN8knQMiSSUYj/6Ai8rfvojRu2H4Tyym1daMd3fdO8o6YibmtEEVVaqv cmvhT+N7DX8QEAowmIjySEP1GTrcuMdv3DhUUE0LT/hjW+tck4lzpxzUfHLZ/hFQkR3B z8S5ma3L9zO1AU0QU1S/FqZTQYo3Q5Jb38ll/FDzHYFibKK42IYQBSatAdrNJbDa0zzL DpCv7S0mUeR6WVfl8J9pavb/NjkabVslnc/Ra6R5NXverW3Lx8y96b9/qb1TkIewLahS T7oyPJu0rwcnMY+uQ2Yl8m1+KkFQsag3ZCro59GJWHNiRZf907WAjrR0lU3Kx2ZbEYMA 26dg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=xotEaH53; arc=pass (i=1 spf=pass spfdomain=flex--almasrymina.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-128863-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-128863-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id d11-20020a170902cecb00b001e089758cdfsi12532080plg.301.2024.04.02.17.29.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 17:29:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-128863-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=xotEaH53; arc=pass (i=1 spf=pass spfdomain=flex--almasrymina.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-128863-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-128863-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 560EDB24B97 for ; Wed, 3 Apr 2024 00:25:43 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8CFDFD527; Wed, 3 Apr 2024 00:21:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="xotEaH53" Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B591D43AD2 for ; Wed, 3 Apr 2024 00:21:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712103685; cv=none; b=oJRnx4j+3N3jd8mtbD3pdq0JiGXcymm10JYdqAr//yl9L7JKGnIcdZzY3MI49WhBGcMBp0IfRB7HgwUZeRpf0ib7XT0s/K/kwC1W24o1HySjdsCuCPC4UVq2OVEB6BCD6Tj85dye0p4oCBXP9wej5WDiWRqw3PWS2MdiKhc5R18= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712103685; c=relaxed/simple; bh=iAZIdAeyk5KwfVZtSv+YxVpZp+Xhv/VXPbGJraPxX48=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HrjkAslou7Oao+haYrRiPbziwOqjMZtDzt/KMtSwBVShC6LG3v9vPz71u9AWkzb7JkhLFAJ19Bi1ffPKNMtsnTA2nOsCpQpVNcIpNUzMjA3ahD9JhfBKgubwLJ5WqOtfah8WlRZmUEAqqLhQaszGvxlJdm45a0coVeECttHsKBQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--almasrymina.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=xotEaH53; arc=none smtp.client-ip=209.85.128.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--almasrymina.bounces.google.com Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-61510f72bb3so29903777b3.0 for ; Tue, 02 Apr 2024 17:21:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712103681; x=1712708481; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=+KDnK9042R37xuDgfAU4H+c5h2ZT59o2lkrQnd2iy6g=; b=xotEaH53QTfWxRznRvO0S/CN8+H3wU7nXkN7Er+siZofxgvYbUpNV3UjrTOoNN9zPt J4nNG0HWlqAiMbikZ+tCJg8/a4bFoFuK4FeolEskqAkgljB+NV3hxaDLZZ/SxK0V0PwC 6sDHC5vtP1lE78NhH5/JNyHAVTQCmZqDhyhLW/SQOIsG3pVTRdVMx+mlLihGJAkKYX+Z S0BdSp1Z2xEvuls9BR0We98XFT5bAbf8j21Q7i5YWlbj6DltuiDPEgHtLVWHKtTHyvqO 35eyF4AnZUenvrRmdEjiSLGh/fIaoVxNjkiP9LQlfrStXZ6xMj/51Zy9hBiC1IQuJgWU rlRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712103681; x=1712708481; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=+KDnK9042R37xuDgfAU4H+c5h2ZT59o2lkrQnd2iy6g=; b=TqWNckxFGHjSE22rNuNfLw5d6IOMXOcRLHWLAsarywaADI9cFqEy1yyEOE9DM/tEFi boc/4R6phK1B/HSZwdogCdkXdA6paX0CrmIRIj3nlU/GSBn6HSKcDzg4liPL8GuOjI8S er49sdhH81Acfxic793LpCRvswMjjaxdi9YzwHmutn1jJ856U12lfNW5PvI+rW9JhYjU pXxnK9W5x77HJOB05QCpH8QDB4ErAj6y95K3+y/P1mzPVlw8weL5DpLX0WXcpU/Fweln 78Vz6NaLr0JiUsrjXE8cuRb3kWCCYeTUSeHg0nGikSqrYD1K7eRbaxYO/yUSy0kXiQ4n dy8w== X-Forwarded-Encrypted: i=1; AJvYcCUTxcNd9hwBa5lhCBWhiwUS8ccdbLSM1lpLLQAEnAER3WAcoYF+RYkTazFBaIUrjORZjK5t94Os1hOpGsmmxcC8caf4A6Nh1SrlwE8K X-Gm-Message-State: AOJu0Yzgib5oOHGPgUvHPzRfC0wmhH64EBNez71KkBYKOdY4e9+IJrk8 KbJ9HyS7wgP6j6OKCmC2Wlc3aXuN8wmIVpNqRyZ9eDCD3Ky79fSCCHT4p1QT4IKJQHBfsexIWbB nL5xPBioFYRCOrGtc99ES3w== X-Received: from almasrymina.svl.corp.google.com ([2620:15c:2c4:200:1726:7620:90a1:78b9]) (user=almasrymina job=sendgmr) by 2002:a05:690c:ec7:b0:615:5090:7722 with SMTP id cs7-20020a05690c0ec700b0061550907722mr279427ywb.6.1712103680766; Tue, 02 Apr 2024 17:21:20 -0700 (PDT) Date: Tue, 2 Apr 2024 17:20:45 -0700 In-Reply-To: <20240403002053.2376017-1-almasrymina@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240403002053.2376017-1-almasrymina@google.com> X-Mailer: git-send-email 2.44.0.478.gd926399ef9-goog Message-ID: <20240403002053.2376017-9-almasrymina@google.com> Subject: [RFC PATCH net-next v8 08/14] memory-provider: dmabuf devmem memory provider From: Mina Almasry To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-alpha@vger.kernel.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, sparclinux@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-arch@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org Cc: Mina Almasry , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jonathan Corbet , Richard Henderson , Ivan Kokshaysky , Matt Turner , Thomas Bogendoerfer , "James E.J. Bottomley" , Helge Deller , Andreas Larsson , Jesper Dangaard Brouer , Ilias Apalodimas , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Arnd Bergmann , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Steffen Klassert , Herbert Xu , David Ahern , Willem de Bruijn , Shuah Khan , Sumit Semwal , "=?UTF-8?q?Christian=20K=C3=B6nig?=" , Amritha Nambiar , Maciej Fijalkowski , Alexander Mikhalitsyn , Kaiyuan Zhang , Christian Brauner , Simon Horman , David Howells , Florian Westphal , Yunsheng Lin , Kuniyuki Iwashima , Jens Axboe , Arseniy Krasnov , Aleksander Lobakin , Michael Lass , Jiri Pirko , Sebastian Andrzej Siewior , Lorenzo Bianconi , Richard Gobert , Sridhar Samudrala , Xuan Zhuo , Johannes Berg , Abel Wu , Breno Leitao , Pavel Begunkov , David Wei , Jason Gunthorpe , Shailend Chand , Harshitha Ramamurthy , Shakeel Butt , Jeroen de Borst , Praveen Kaligineedi , Willem de Bruijn Content-Type: text/plain; charset="UTF-8" Implement a memory provider that allocates dmabuf devmem in the form of net_iov. The provider receives a reference to the struct netdev_dmabuf_binding via the pool->mp_priv pointer. The driver needs to set this pointer for the provider in the net_iov. The provider obtains a reference on the netdev_dmabuf_binding which guarantees the binding and the underlying mapping remains alive until the provider is destroyed. Usage of PP_FLAG_DMA_MAP is required for this memory provide such that the page_pool can provide the driver with the dma-addrs of the devmem. Support for PP_FLAG_DMA_SYNC_DEV is omitted for simplicity & p.order != 0. Signed-off-by: Willem de Bruijn Signed-off-by: Kaiyuan Zhang Signed-off-by: Mina Almasry --- v8: - Use skb_frag_size instead of frag->bv_len to fix patch-by-patch build error v6: - refactor new memory provider functions into net/core/devmem.c (Pavel) v2: - Disable devmem for p.order != 0 v1: - static_branch check in page_is_page_pool_iov() (Willem & Paolo). - PP_DEVMEM -> PP_IOV (David). - Require PP_FLAG_DMA_MAP (Jakub). --- include/net/netmem.h | 15 ++++++ include/net/page_pool/helpers.h | 22 +++++++++ include/net/page_pool/types.h | 2 + net/core/devmem.c | 83 +++++++++++++++++++++++++++++++++ net/core/page_pool.c | 38 +++++++-------- 5 files changed, 138 insertions(+), 22 deletions(-) diff --git a/include/net/netmem.h b/include/net/netmem.h index 74eeaa34883e..34aa1c80c1ca 100644 --- a/include/net/netmem.h +++ b/include/net/netmem.h @@ -126,6 +126,21 @@ static inline struct page *netmem_to_page(netmem_ref netmem) return (__force struct page *)netmem; } +static inline struct net_iov *netmem_to_net_iov(netmem_ref netmem) +{ + if (netmem_is_net_iov(netmem)) + return (struct net_iov *)((__force unsigned long)netmem & + ~NET_IOV); + + DEBUG_NET_WARN_ON_ONCE(true); + return NULL; +} + +static inline netmem_ref net_iov_to_netmem(struct net_iov *niov) +{ + return (__force netmem_ref)((unsigned long)niov | NET_IOV); +} + static inline netmem_ref page_to_netmem(struct page *page) { return (__force netmem_ref)page; diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h index c6a55eddefae..eb736506c3ce 100644 --- a/include/net/page_pool/helpers.h +++ b/include/net/page_pool/helpers.h @@ -453,4 +453,26 @@ static inline void page_pool_nid_changed(struct page_pool *pool, int new_nid) page_pool_update_nid(pool, new_nid); } +static inline 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 + * is allocated from the page allocator and page_pool_fragment_page() + * is dirtying the same cache line as the page->pp_magic above, so + * the overhead is negligible. + */ + page_pool_fragment_netmem(netmem, 1); + if (pool->has_init_callback) + pool->slow.init_callback(netmem, pool->slow.init_arg); +} + +static inline void page_pool_clear_pp_info(netmem_ref netmem) +{ + netmem_clear_pp_magic(netmem); + netmem_set_pp(netmem, NULL); +} #endif /* _NET_PAGE_POOL_HELPERS_H */ diff --git a/include/net/page_pool/types.h b/include/net/page_pool/types.h index f04af1613f59..5b58c9e185a4 100644 --- a/include/net/page_pool/types.h +++ b/include/net/page_pool/types.h @@ -141,6 +141,8 @@ struct pp_memory_provider_params { void *mp_priv; }; +extern const struct memory_provider_ops dmabuf_devmem_ops; + struct page_pool { struct page_pool_params_fast p; diff --git a/net/core/devmem.c b/net/core/devmem.c index c25ede5f6fb9..01337de7d6a4 100644 --- a/net/core/devmem.c +++ b/net/core/devmem.c @@ -204,6 +204,7 @@ int net_devmem_bind_dmabuf_to_queue(struct net_device *dev, u32 rxq_idx, * the driver may read this config while it's creating its * rx-queues. * WRITE_ONCE() here to match the READ_ONCE() in the driver. */ + WRITE_ONCE(rxq->mp_params.mp_ops, &dmabuf_devmem_ops); WRITE_ONCE(rxq->mp_params.mp_priv, binding); err = net_devmem_restart_rx_queue(dev, rxq_idx); @@ -340,3 +341,85 @@ int net_devmem_bind_dmabuf(struct net_device *dev, unsigned int dmabuf_fd, return err; } #endif + +/*** "Dmabuf devmem memory provider" ***/ + +static int mp_dmabuf_devmem_init(struct page_pool *pool) +{ + struct net_devmem_dmabuf_binding *binding = pool->mp_priv; + + if (!binding) + return -EINVAL; + + if (!(pool->p.flags & PP_FLAG_DMA_MAP)) + return -EOPNOTSUPP; + + if (pool->p.flags & PP_FLAG_DMA_SYNC_DEV) + return -EOPNOTSUPP; + + if (pool->p.order != 0) + return -E2BIG; + + net_devmem_dmabuf_binding_get(binding); + return 0; +} + +static netmem_ref mp_dmabuf_devmem_alloc_pages(struct page_pool *pool, + gfp_t gfp) +{ + struct net_devmem_dmabuf_binding *binding = pool->mp_priv; + netmem_ref netmem; + struct net_iov *niov; + dma_addr_t dma_addr; + + niov = net_devmem_alloc_dmabuf(binding); + if (!niov) + return 0; + + dma_addr = net_iov_dma_addr(niov); + + netmem = net_iov_to_netmem(niov); + + page_pool_set_pp_info(pool, netmem); + + if (page_pool_set_dma_addr_netmem(netmem, dma_addr)) + goto err_free; + + pool->pages_state_hold_cnt++; + trace_page_pool_state_hold(pool, netmem, pool->pages_state_hold_cnt); + return netmem; + +err_free: + net_devmem_free_dmabuf(niov); + return 0; +} + +static void mp_dmabuf_devmem_destroy(struct page_pool *pool) +{ + struct net_devmem_dmabuf_binding *binding = pool->mp_priv; + + net_devmem_dmabuf_binding_put(binding); +} + +static bool mp_dmabuf_devmem_release_page(struct page_pool *pool, + netmem_ref netmem) +{ + WARN_ON_ONCE(!netmem_is_net_iov(netmem)); + WARN_ON_ONCE(atomic_long_read(netmem_get_pp_ref_count_ref(netmem)) != + 1); + + page_pool_clear_pp_info(netmem); + + net_devmem_free_dmabuf(netmem_to_net_iov(netmem)); + + /* We don't want the page pool put_page()ing our net_iovs. */ + return false; +} + +const struct memory_provider_ops dmabuf_devmem_ops = { + .init = mp_dmabuf_devmem_init, + .destroy = mp_dmabuf_devmem_destroy, + .alloc_pages = mp_dmabuf_devmem_alloc_pages, + .release_page = mp_dmabuf_devmem_release_page, +}; +EXPORT_SYMBOL(dmabuf_devmem_ops); diff --git a/net/core/page_pool.c b/net/core/page_pool.c index c7bffd08218b..a0544b680e8a 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -20,12 +21,15 @@ #include #include #include +#include +#include #include #include "page_pool_priv.h" DEFINE_STATIC_KEY_FALSE(page_pool_mem_providers); +EXPORT_SYMBOL(page_pool_mem_providers); #define DEFER_TIME (msecs_to_jiffies(1000)) #define DEFER_WARN_INTERVAL (60 * HZ) @@ -178,7 +182,9 @@ static int page_pool_init(struct page_pool *pool, const struct page_pool_params *params, int cpuid) { + const struct memory_provider_ops *mp_ops = NULL; unsigned int ring_qsize = 1024; /* Default */ + void *mp_priv = NULL; int err; memcpy(&pool->p, ¶ms->fast, sizeof(pool->p)); @@ -251,6 +257,16 @@ static int page_pool_init(struct page_pool *pool, /* Driver calling page_pool_create() also call page_pool_destroy() */ refcount_set(&pool->user_cnt, 1); + if (pool->p.queue) { + mp_ops = READ_ONCE(pool->p.queue->mp_params.mp_ops); + mp_priv = READ_ONCE(pool->p.queue->mp_params.mp_priv); + } + + if (mp_ops && mp_priv) { + pool->mp_ops = mp_ops; + pool->mp_priv = mp_priv; + } + if (pool->mp_ops) { err = pool->mp_ops->init(pool); if (err) { @@ -444,28 +460,6 @@ static bool page_pool_dma_map(struct page_pool *pool, netmem_ref netmem) return false; } -static 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 - * is allocated from the page allocator and page_pool_fragment_page() - * is dirtying the same cache line as the page->pp_magic above, so - * the overhead is negligible. - */ - page_pool_fragment_netmem(netmem, 1); - if (pool->has_init_callback) - pool->slow.init_callback(netmem, pool->slow.init_arg); -} - -static void page_pool_clear_pp_info(netmem_ref netmem) -{ - netmem_clear_pp_magic(netmem); - netmem_set_pp(netmem, NULL); -} - static struct page *__page_pool_alloc_page_order(struct page_pool *pool, gfp_t gfp) { -- 2.44.0.478.gd926399ef9-goog