Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

eth: fbnic: use netmem_ref where applicable

Use netmem_ref instead of struct page pointer in prep for
unreadable memory. fbnic has separate free buffer submission
queues for headers and for data. Refactor the helper which
returns page pointer for a submission buffer to take the
high level queue container, create a separate handler
for header and payload rings. This ties the "upcast" from
netmem to system page to use of sub0 which we know has
system pages.

Reviewed-by: Mina Almasry <almasrymina@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20250901211214.1027927-5-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Jakub Kicinski and committed by
Paolo Abeni
426e13db b6396b71

+40 -27
+39 -26
drivers/net/ethernet/meta/fbnic/fbnic_txrx.c
··· 715 715 } 716 716 717 717 static void fbnic_page_pool_init(struct fbnic_ring *ring, unsigned int idx, 718 - struct page *page) 718 + netmem_ref netmem) 719 719 { 720 720 struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx]; 721 721 722 - page_pool_fragment_page(page, FBNIC_PAGECNT_BIAS_MAX); 722 + page_pool_fragment_netmem(netmem, FBNIC_PAGECNT_BIAS_MAX); 723 723 rx_buf->pagecnt_bias = FBNIC_PAGECNT_BIAS_MAX; 724 - rx_buf->page = page; 724 + rx_buf->netmem = netmem; 725 725 } 726 726 727 - static struct page *fbnic_page_pool_get(struct fbnic_ring *ring, 728 - unsigned int idx) 727 + static struct page * 728 + fbnic_page_pool_get_head(struct fbnic_q_triad *qt, unsigned int idx) 729 729 { 730 - struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx]; 730 + struct fbnic_rx_buf *rx_buf = &qt->sub0.rx_buf[idx]; 731 731 732 732 rx_buf->pagecnt_bias--; 733 733 734 - return rx_buf->page; 734 + /* sub0 is always fed system pages, from the NAPI-level page_pool */ 735 + return netmem_to_page(rx_buf->netmem); 736 + } 737 + 738 + static netmem_ref 739 + fbnic_page_pool_get_data(struct fbnic_q_triad *qt, unsigned int idx) 740 + { 741 + struct fbnic_rx_buf *rx_buf = &qt->sub1.rx_buf[idx]; 742 + 743 + rx_buf->pagecnt_bias--; 744 + 745 + return rx_buf->netmem; 735 746 } 736 747 737 748 static void fbnic_page_pool_drain(struct fbnic_ring *ring, unsigned int idx, 738 749 int budget) 739 750 { 740 751 struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx]; 741 - struct page *page = rx_buf->page; 752 + netmem_ref netmem = rx_buf->netmem; 742 753 743 - if (!page_pool_unref_page(page, rx_buf->pagecnt_bias)) 744 - page_pool_put_unrefed_page(ring->page_pool, page, -1, !!budget); 754 + if (!page_pool_unref_netmem(netmem, rx_buf->pagecnt_bias)) 755 + page_pool_put_unrefed_netmem(ring->page_pool, netmem, -1, 756 + !!budget); 745 757 746 - rx_buf->page = NULL; 758 + rx_buf->netmem = 0; 747 759 } 748 760 749 761 static void fbnic_clean_twq(struct fbnic_napi_vector *nv, int napi_budget, ··· 856 844 ring->head = head; 857 845 } 858 846 859 - static void fbnic_bd_prep(struct fbnic_ring *bdq, u16 id, struct page *page) 847 + static void fbnic_bd_prep(struct fbnic_ring *bdq, u16 id, netmem_ref netmem) 860 848 { 861 849 __le64 *bdq_desc = &bdq->desc[id * FBNIC_BD_FRAG_COUNT]; 862 - dma_addr_t dma = page_pool_get_dma_addr(page); 850 + dma_addr_t dma = page_pool_get_dma_addr_netmem(netmem); 863 851 u64 bd, i = FBNIC_BD_FRAG_COUNT; 864 852 865 853 bd = (FBNIC_BD_PAGE_ADDR_MASK & dma) | ··· 886 874 return; 887 875 888 876 do { 889 - struct page *page; 877 + netmem_ref netmem; 890 878 891 - page = page_pool_dev_alloc_pages(bdq->page_pool); 892 - if (!page) { 879 + netmem = page_pool_dev_alloc_netmems(bdq->page_pool); 880 + if (!netmem) { 893 881 u64_stats_update_begin(&bdq->stats.syncp); 894 882 bdq->stats.rx.alloc_failed++; 895 883 u64_stats_update_end(&bdq->stats.syncp); ··· 897 885 break; 898 886 } 899 887 900 - fbnic_page_pool_init(bdq, i, page); 901 - fbnic_bd_prep(bdq, i, page); 888 + fbnic_page_pool_init(bdq, i, netmem); 889 + fbnic_bd_prep(bdq, i, netmem); 902 890 903 891 i++; 904 892 i &= bdq->size_mask; ··· 945 933 { 946 934 unsigned int hdr_pg_idx = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd); 947 935 unsigned int hdr_pg_off = FIELD_GET(FBNIC_RCD_AL_BUFF_OFF_MASK, rcd); 948 - struct page *page = fbnic_page_pool_get(&qt->sub0, hdr_pg_idx); 936 + struct page *page = fbnic_page_pool_get_head(qt, hdr_pg_idx); 949 937 unsigned int len = FIELD_GET(FBNIC_RCD_AL_BUFF_LEN_MASK, rcd); 950 938 unsigned int frame_sz, hdr_pg_start, hdr_pg_end, headroom; 951 939 unsigned char *hdr_start; ··· 986 974 unsigned int pg_idx = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd); 987 975 unsigned int pg_off = FIELD_GET(FBNIC_RCD_AL_BUFF_OFF_MASK, rcd); 988 976 unsigned int len = FIELD_GET(FBNIC_RCD_AL_BUFF_LEN_MASK, rcd); 989 - struct page *page = fbnic_page_pool_get(&qt->sub1, pg_idx); 977 + netmem_ref netmem = fbnic_page_pool_get_data(qt, pg_idx); 990 978 unsigned int truesize; 991 979 bool added; 992 980 ··· 997 985 FBNIC_BD_FRAG_SIZE; 998 986 999 987 /* Sync DMA buffer */ 1000 - dma_sync_single_range_for_cpu(nv->dev, page_pool_get_dma_addr(page), 988 + dma_sync_single_range_for_cpu(nv->dev, 989 + page_pool_get_dma_addr_netmem(netmem), 1001 990 pg_off, truesize, DMA_BIDIRECTIONAL); 1002 991 1003 - added = xdp_buff_add_frag(&pkt->buff, page_to_netmem(page), pg_off, len, 1004 - truesize); 992 + added = xdp_buff_add_frag(&pkt->buff, netmem, pg_off, len, truesize); 1005 993 if (unlikely(!added)) { 1006 994 pkt->add_frag_failed = true; 1007 995 netdev_err_once(nv->napi.dev, ··· 1019 1007 1020 1008 if (xdp_buff_has_frags(&pkt->buff)) { 1021 1009 struct skb_shared_info *shinfo; 1010 + netmem_ref netmem; 1022 1011 int nr_frags; 1023 1012 1024 1013 shinfo = xdp_get_shared_info_from_buff(&pkt->buff); 1025 1014 nr_frags = shinfo->nr_frags; 1026 1015 1027 1016 while (nr_frags--) { 1028 - page = skb_frag_page(&shinfo->frags[nr_frags]); 1029 - page_pool_put_full_page(qt->sub1.page_pool, page, 1030 - !!budget); 1017 + netmem = skb_frag_netmem(&shinfo->frags[nr_frags]); 1018 + page_pool_put_full_netmem(qt->sub1.page_pool, netmem, 1019 + !!budget); 1031 1020 } 1032 1021 } 1033 1022
+1 -1
drivers/net/ethernet/meta/fbnic/fbnic_txrx.h
··· 100 100 #define FBNIC_PAGECNT_BIAS_MAX PAGE_SIZE 101 101 102 102 struct fbnic_rx_buf { 103 - struct page *page; 103 + netmem_ref netmem; 104 104 long pagecnt_bias; 105 105 }; 106 106