• Yunsheng Lin's avatar
    page_pool: mask the page->signature before the checking · 0fa32ca4
    Yunsheng Lin authored
    As mentioned in commit c07aea3e ("mm: add a signature in
    struct page"):
    "The page->signature field is aliased to page->lru.next and
    page->compound_head."
    
    And as the comment in page_is_pfmemalloc():
    "lru.next has bit 1 set if the page is allocated from the
    pfmemalloc reserves. Callers may simply overwrite it if they
    do not need to preserve that information."
    
    The page->signature is OR’ed with PP_SIGNATURE when a page is
    allocated in page pool, see __page_pool_alloc_pages_slow(),
    and page->signature is checked directly with PP_SIGNATURE in
    page_pool_return_skb_page(), which might cause resoure leaking
    problem for a page from page pool if bit 1 of lru.next is set
    for a pfmemalloc page. What happens here is that the original
    pp->signature is OR'ed with PP_SIGNATURE after the allocation
    in order to preserve any existing bits(such as the bit 1, used
    to indicate a pfmemalloc page), so when those bits are present,
    those page is not considered to be from page pool and the DMA
    mapping of those pages will be left stale.
    
    As bit 0 is for page->compound_head, So mask both bit 0/1 before
    the checking in page_pool_return_skb_page(). And we will return
    those pfmemalloc pages back to the page allocator after cleaning
    up the DMA mapping.
    
    Fixes: 6a5bcd84 ("page_pool: Allow drivers to hint on SKB recycling")
    Reviewed-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
    Signed-off-by: default avatarYunsheng Lin <linyunsheng@huawei.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0fa32ca4
page_pool.c 17.7 KB