Message ID | 20190417174942.11811-1-ivan.khoronzhuk@linaro.org |
---|---|
Headers | show |
Series | net: ethernet: ti: cpsw: Add XDP support | expand |
On Fri, Apr 19, 2019 at 11:31:56AM +0300, Ilias Apalodimas wrote: >Hi Ivan, > >> +static struct page *cpsw_alloc_page(struct cpsw_common *cpsw) >> +{ >> + struct page_pool *pool = cpsw->rx_page_pool; >> + struct page *page; >> + int i = 0; >> + >> + do { >> + page = page_pool_dev_alloc_pages(pool); >> + if (!page) >> + return NULL; >> + >> + /* skip pages used by skb netstack */ >I think the comment here is wrong and might confuse people. >The page ref cnt is 1, which means the packet was *processed* and netstack is >done with it, hence you can re-use it. >If it's !=1 then you correctly unmap the buffer and decrease the ref cnt, so it >will eventually be freed and not returned to the pool, right? It's compensation substitution for page_pool support in skb netsack. And should be considered in combine with: skb = build_skb(xmeta, cpsw_rxbuf_total_len(pkt_size)); ... page_pool_recycle_direct(pool, page); page_ref_inc(page); netif_receive_skb(skb); Here order is important. I will correct comments in final version (w/o overloading) ofc, leaving thinking environment for people. I think it's fair enough about this. >> + if (page_ref_count(page) == 1) >> + break; >> + >> + /* it's a pitty, but free page */ >> + page_pool_recycle_direct(pool, page); >> + } while (++i < descs_pool_size); >> + >> + return page; >> +} >> + > > /Ilias -- Regards, Ivan Khoronzhuk