Skip to content

Commit 1cdf3f2

Browse files
committed
Merge branch 'split-netmem-from-struct-page'
Byungchul Park says: ==================== Split netmem from struct page The MM subsystem is trying to reduce struct page to a single pointer. See the following link for your information: https://kernelnewbies.org/MatthewWilcox/Memdescs/Path The first step towards that is splitting struct page by its individual users, as has already been done with folio and slab. This patchset does that for page pool. Matthew Wilcox tried and stopped the same work, you can see in: https://lore.kernel.org/[email protected] I focused on removing the page pool members in struct page this time, not moving the allocation code of page pool from net to mm. It can be done later if needed. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 918c675 + 9dfd871 commit 1cdf3f2

File tree

12 files changed

+161
-40
lines changed

12 files changed

+161
-40
lines changed

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,9 @@ static void fec_enet_bd_init(struct net_device *dev)
10451045
struct page *page = txq->tx_buf[i].buf_p;
10461046

10471047
if (page)
1048-
page_pool_put_page(page->pp, page, 0, false);
1048+
page_pool_put_page(pp_page_to_nmdesc(page)->pp,
1049+
page, 0,
1050+
false);
10491051
}
10501052

10511053
txq->tx_buf[i].buf_p = NULL;
@@ -1586,7 +1588,8 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
15861588
xdp_return_frame_rx_napi(xdpf);
15871589
} else { /* recycle pages of XDP_TX frames */
15881590
/* The dma_sync_size = 0 as XDP_TX has already synced DMA for_device */
1589-
page_pool_put_page(page->pp, page, 0, true);
1591+
page_pool_put_page(pp_page_to_nmdesc(page)->pp, page,
1592+
0, true);
15901593
}
15911594

15921595
txq->tx_buf[index].buf_p = NULL;
@@ -3348,7 +3351,8 @@ static void fec_enet_free_buffers(struct net_device *ndev)
33483351
} else {
33493352
struct page *page = txq->tx_buf[i].buf_p;
33503353

3351-
page_pool_put_page(page->pp, page, 0, false);
3354+
page_pool_put_page(pp_page_to_nmdesc(page)->pp,
3355+
page, 0, false);
33523356
}
33533357

33543358
txq->tx_buf[i].buf_p = NULL;

drivers/net/ethernet/intel/iavf/iavf_txrx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,7 @@ static struct sk_buff *iavf_build_skb(const struct libeth_fqe *rx_buffer,
12161216
unsigned int size)
12171217
{
12181218
struct page *buf_page = __netmem_to_page(rx_buffer->netmem);
1219-
u32 hr = buf_page->pp->p.offset;
1219+
u32 hr = pp_page_to_nmdesc(buf_page)->pp->p.offset;
12201220
struct sk_buff *skb;
12211221
void *va;
12221222

drivers/net/ethernet/intel/idpf/idpf_txrx.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3276,8 +3276,10 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
32763276

32773277
hdr_page = __netmem_to_page(hdr->netmem);
32783278
buf_page = __netmem_to_page(buf->netmem);
3279-
dst = page_address(hdr_page) + hdr->offset + hdr_page->pp->p.offset;
3280-
src = page_address(buf_page) + buf->offset + buf_page->pp->p.offset;
3279+
dst = page_address(hdr_page) + hdr->offset +
3280+
pp_page_to_nmdesc(hdr_page)->pp->p.offset;
3281+
src = page_address(buf_page) + buf->offset +
3282+
pp_page_to_nmdesc(buf_page)->pp->p.offset;
32813283

32823284
memcpy(dst, src, LARGEST_ALIGN(copy));
32833285
buf->offset += copy;
@@ -3296,7 +3298,7 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
32963298
struct sk_buff *idpf_rx_build_skb(const struct libeth_fqe *buf, u32 size)
32973299
{
32983300
struct page *buf_page = __netmem_to_page(buf->netmem);
3299-
u32 hr = buf_page->pp->p.offset;
3301+
u32 hr = pp_page_to_nmdesc(buf_page)->pp->p.offset;
33003302
struct sk_buff *skb;
33013303
void *va;
33023304

drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1571,7 +1571,7 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,
15711571
cq->pool_ptrs++;
15721572
if (xsk_buff) {
15731573
xsk_buff_free(xsk_buff);
1574-
} else if (page->pp) {
1574+
} else if (pp_page_to_nmdesc(page)->pp) {
15751575
page_pool_recycle_direct(pool->page_pool, page);
15761576
} else {
15771577
otx2_dma_unmap_page(pfvf, iova, pfvf->rbsize,

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,9 +460,11 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
460460

461461
truesize += frag_info->frag_stride;
462462
if (frag_info->frag_stride == PAGE_SIZE / 2) {
463+
struct netmem_desc *desc = pp_page_to_nmdesc(page);
464+
463465
frags->page_offset ^= PAGE_SIZE / 2;
464466
release = page_count(page) != 1 ||
465-
atomic_long_read(&page->pp_ref_count) != 1 ||
467+
atomic_long_read(&desc->pp_ref_count) != 1 ||
466468
page_is_pfmemalloc(page) ||
467469
page_to_nid(page) != numa_mem_id();
468470
} else if (!priv->rx_headroom) {

drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,8 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq,
710710
/* No need to check page_pool_page_is_pp() as we
711711
* know this is a page_pool page.
712712
*/
713-
page_pool_recycle_direct(page->pp, page);
713+
page_pool_recycle_direct(pp_page_to_nmdesc(page)->pp,
714+
page);
714715
} while (++n < num);
715716

716717
break;

drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ static irqreturn_t prueth_rx_mgm_ts_thread_sr1(int irq, void *dev_id)
367367
return IRQ_NONE;
368368

369369
prueth_tx_ts_sr1(emac, (void *)page_address(page));
370-
page_pool_recycle_direct(page->pp, page);
370+
page_pool_recycle_direct(pp_page_to_nmdesc(page)->pp, page);
371371

372372
return IRQ_HANDLED;
373373
}
@@ -392,7 +392,7 @@ static irqreturn_t prueth_rx_mgm_rsp_thread(int irq, void *dev_id)
392392
complete(&emac->cmd_complete);
393393
}
394394

395-
page_pool_recycle_direct(page->pp, page);
395+
page_pool_recycle_direct(pp_page_to_nmdesc(page)->pp, page);
396396

397397
return IRQ_HANDLED;
398398
}

drivers/net/netdevsim/netdev.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -917,7 +917,8 @@ nsim_pp_hold_write(struct file *file, const char __user *data,
917917
if (!ns->page)
918918
ret = -ENOMEM;
919919
} else {
920-
page_pool_put_full_page(ns->page->pp, ns->page, false);
920+
page_pool_put_full_page(pp_page_to_nmdesc(ns->page)->pp,
921+
ns->page, false);
921922
ns->page = NULL;
922923
}
923924

@@ -1145,7 +1146,8 @@ void nsim_destroy(struct netdevsim *ns)
11451146

11461147
/* Put this intentionally late to exercise the orphaning path */
11471148
if (ns->page) {
1148-
page_pool_put_full_page(ns->page->pp, ns->page, false);
1149+
page_pool_put_full_page(pp_page_to_nmdesc(ns->page)->pp,
1150+
ns->page, false);
11491151
ns->page = NULL;
11501152
}
11511153

drivers/net/wireless/mediatek/mt76/mt76.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1810,7 +1810,8 @@ static inline void mt76_put_page_pool_buf(void *buf, bool allow_direct)
18101810
{
18111811
struct page *page = virt_to_head_page(buf);
18121812

1813-
page_pool_put_full_page(page->pp, page, allow_direct);
1813+
page_pool_put_full_page(pp_page_to_nmdesc(page)->pp, page,
1814+
allow_direct);
18141815
}
18151816

18161817
static inline void *

include/linux/mm.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4178,12 +4178,12 @@ int arch_lock_shadow_stack_status(struct task_struct *t, unsigned long status);
41784178
#define PP_MAGIC_MASK ~(PP_DMA_INDEX_MASK | 0x3UL)
41794179

41804180
#ifdef CONFIG_PAGE_POOL
4181-
static inline bool page_pool_page_is_pp(struct page *page)
4181+
static inline bool page_pool_page_is_pp(const struct page *page)
41824182
{
41834183
return (page->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE;
41844184
}
41854185
#else
4186-
static inline bool page_pool_page_is_pp(struct page *page)
4186+
static inline bool page_pool_page_is_pp(const struct page *page)
41874187
{
41884188
return false;
41894189
}

0 commit comments

Comments
 (0)