• Coly Li's avatar
    net: introduce helper sendpage_ok() in include/linux/net.h · c381b079
    Coly Li authored
    The original problem was from nvme-over-tcp code, who mistakenly uses
    kernel_sendpage() to send pages allocated by __get_free_pages() without
    __GFP_COMP flag. Such pages don't have refcount (page_count is 0) on
    tail pages, sending them by kernel_sendpage() may trigger a kernel panic
    from a corrupted kernel heap, because these pages are incorrectly freed
    in network stack as page_count 0 pages.
    
    This patch introduces a helper sendpage_ok(), it returns true if the
    checking page,
    - is not slab page: PageSlab(page) is false.
    - has page refcount: page_count(page) is not zero
    
    All drivers who want to send page to remote end by kernel_sendpage()
    may use this helper to check whether the page is OK. If the helper does
    not return true, the driver should try other non sendpage method (e.g.
    sock_no_sendpage()) to handle the page.
    Signed-off-by: default avatarColy Li <colyli@suse.de>
    Cc: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Hannes Reinecke <hare@suse.de>
    Cc: Jan Kara <jack@suse.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Mikhail Skorzhinskii <mskorzhinskiy@solarflare.com>
    Cc: Philipp Reisner <philipp.reisner@linbit.com>
    Cc: Sagi Grimberg <sagi@grimberg.me>
    Cc: Vlastimil Babka <vbabka@suse.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c381b079
net.h 11.4 KB