mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2026-01-27 12:47:24 +01:00
netmem, mlx4: access ->pp_ref_count through netmem_desc instead of page
To eliminate the use of struct page in page pool, the page pool users should use netmem descriptor and APIs instead. Make mlx4 access ->pp_ref_count through netmem_desc instead of page. While at it, add a helper, pp_page_to_nmdesc() and __pp_page_to_nmdesc(), that can be used to get netmem_desc from page only if it's a pp page. For now that netmem_desc overlays on page, it can be achieved by just casting, and use macro and _Generic to cover const casting as well. Plus, change page_pool_page_is_pp() to check for 'const struct page *' instead of 'struct page *' since it doesn't modify data and additionally covers const type. Signed-off-by: Byungchul Park <byungchul@sk.com> Link: https://patch.msgid.link/20250721021835.63939-4-byungchul@sk.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
38a436d4e2
commit
89ade7c730
|
|
@ -460,9 +460,11 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
|
|||
|
||||
truesize += frag_info->frag_stride;
|
||||
if (frag_info->frag_stride == PAGE_SIZE / 2) {
|
||||
struct netmem_desc *desc = pp_page_to_nmdesc(page);
|
||||
|
||||
frags->page_offset ^= PAGE_SIZE / 2;
|
||||
release = page_count(page) != 1 ||
|
||||
atomic_long_read(&page->pp_ref_count) != 1 ||
|
||||
atomic_long_read(&desc->pp_ref_count) != 1 ||
|
||||
page_is_pfmemalloc(page) ||
|
||||
page_to_nid(page) != numa_mem_id();
|
||||
} else if (!priv->rx_headroom) {
|
||||
|
|
|
|||
|
|
@ -4178,12 +4178,12 @@ int arch_lock_shadow_stack_status(struct task_struct *t, unsigned long status);
|
|||
#define PP_MAGIC_MASK ~(PP_DMA_INDEX_MASK | 0x3UL)
|
||||
|
||||
#ifdef CONFIG_PAGE_POOL
|
||||
static inline bool page_pool_page_is_pp(struct page *page)
|
||||
static inline bool page_pool_page_is_pp(const struct page *page)
|
||||
{
|
||||
return (page->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE;
|
||||
}
|
||||
#else
|
||||
static inline bool page_pool_page_is_pp(struct page *page)
|
||||
static inline bool page_pool_page_is_pp(const struct page *page)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -285,6 +285,23 @@ static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem)
|
|||
return (struct net_iov *)((__force unsigned long)netmem & ~NET_IOV);
|
||||
}
|
||||
|
||||
/* XXX: How to extract netmem_desc from page must be changed, once
|
||||
* netmem_desc no longer overlays on page and will be allocated through
|
||||
* slab.
|
||||
*/
|
||||
#define __pp_page_to_nmdesc(p) (_Generic((p), \
|
||||
const struct page * : (const struct netmem_desc *)(p), \
|
||||
struct page * : (struct netmem_desc *)(p)))
|
||||
|
||||
/* CAUTION: Check if the page is a pp page before calling this helper or
|
||||
* know it's a pp page.
|
||||
*/
|
||||
#define pp_page_to_nmdesc(p) \
|
||||
({ \
|
||||
DEBUG_NET_WARN_ON_ONCE(!page_pool_page_is_pp(p)); \
|
||||
__pp_page_to_nmdesc(p); \
|
||||
})
|
||||
|
||||
/**
|
||||
* __netmem_get_pp - unsafely get pointer to the &page_pool backing @netmem
|
||||
* @netmem: netmem reference to get the pointer from
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user