lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <20231223025554.2316836-16-aleksander.lobakin@intel.com> Date: Sat, 23 Dec 2023 03:55:35 +0100 From: Alexander Lobakin <aleksander.lobakin@...el.com> To: "David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com> Cc: Alexander Lobakin <aleksander.lobakin@...el.com>, Maciej Fijalkowski <maciej.fijalkowski@...el.com>, Michal Kubiak <michal.kubiak@...el.com>, Larysa Zaremba <larysa.zaremba@...el.com>, Alexei Starovoitov <ast@...nel.org>, Daniel Borkmann <daniel@...earbox.net>, Willem de Bruijn <willemdebruijn.kernel@...il.com>, intel-wired-lan@...ts.osuosl.org, netdev@...r.kernel.org, linux-kernel@...r.kernel.org Subject: [PATCH RFC net-next 15/34] page_pool: add inline helper to sync VA for device (for XDP_TX) Drivers using Page Pool for Rx buffers do the same pattern on XDP_TX: syncing-DMA-for-device and obtaining DMA address for &xdp_buff they are sending. Add a helper for that to be able to do that in one call in the drivers. I explicitly added `bool compound` argument and set it to false by default: only a few drivers, if any, uses high-order pages with Page Pool, so losing cycles on compound_head() looks suboptimal. Drivers can always call the underscored version if needed (for example, pass pool->p.order as the last argument -- will always work). Signed-off-by: Alexander Lobakin <aleksander.lobakin@...el.com> --- include/net/page_pool/helpers.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h index 873631c79ab1..99dc825b03a5 100644 --- a/include/net/page_pool/helpers.h +++ b/include/net/page_pool/helpers.h @@ -397,6 +397,38 @@ static inline bool page_pool_set_dma_addr(struct page *page, dma_addr_t addr) return false; } +static inline dma_addr_t __page_pool_dma_sync_va_for_device(const void *va, + u32 dma_sync_size, + bool compound) +{ + const struct page_pool *pool; + const struct page *page; + dma_addr_t addr; + u32 offset; + + if (unlikely(compound)) { + page = virt_to_head_page(va); + offset = va - page_address(page); + } else { + page = virt_to_page(va); + offset = offset_in_page(va); + } + + addr = page_pool_get_dma_addr(page) + offset; + pool = page->pp; + + dma_sync_single_for_device(pool->p.dev, addr, dma_sync_size, + page_pool_get_dma_dir(pool)); + + return addr; +} + +static inline dma_addr_t page_pool_dma_sync_va_for_device(const void *va, + u32 dma_sync_size) +{ + return __page_pool_dma_sync_va_for_device(va, dma_sync_size, false); +} + /** * page_pool_dma_sync_for_cpu - sync Rx page for CPU after it's written by HW * @pool: &page_pool the @page belongs to -- 2.43.0
Powered by blists - more mailing lists