On 2023/11/6 10:44, Mina Almasry wrote:
Make skb_frag_page() fail in the case where the frag is not backed by a page, and fix its relevent callers to handle this case.
Correctly handle skb_frag refcounting in the page_pool_iovs case.
Signed-off-by: Mina Almasry almasrymina@google.com
...
/**
- skb_frag_page - retrieve the page referred to by a paged fragment
- @frag: the paged fragment
- Returns the &struct page associated with @frag.
- Returns the &struct page associated with @frag. Returns NULL if this frag
*/
- has no associated page.
static inline struct page *skb_frag_page(const skb_frag_t *frag) {
- return frag->bv_page;
- if (!page_is_page_pool_iov(frag->bv_page))
return frag->bv_page;
- return NULL;
It seems most of callers don't expect NULL returning for skb_frag_page(), and this patch only changes a few relevant callers to handle the NULL case.
It may make more sense to add a new helper to do the above checking, and add a warning in skb_frag_page() to catch any missing NULL checking for skb_frag_page() caller, something like below?
static inline struct page *skb_frag_page(const skb_frag_t *frag) { - return frag->bv_page; + struct page *page = frag->bv_page; + + BUG_ON(page_is_page_pool_iov(page)); + + return page; +} + +static inline struct page *skb_frag_readable_page(const skb_frag_t *frag) +{ + struct page *page = frag->bv_page; + + if (!page_is_page_pool_iov(page)) + return page; + + return NULL; }