• David Howells's avatar
    iov_iter: Add a function to extract a page list from an iterator · 7d58fe73
    David Howells authored
    Add a function, iov_iter_extract_pages(), to extract a list of pages from
    an iterator.  The pages may be returned with a pin added or nothing,
    depending on the type of iterator.
    
    Add a second function, iov_iter_extract_will_pin(), to determine how the
    cleanup should be done.
    
    There are two cases:
    
     (1) ITER_IOVEC or ITER_UBUF iterator.
    
         Extracted pages will have pins (FOLL_PIN) obtained on them so that a
         concurrent fork() will forcibly copy the page so that DMA is done
         to/from the parent's buffer and is unavailable to/unaffected by the
         child process.
    
         iov_iter_extract_will_pin() will return true for this case.  The
         caller should use something like unpin_user_page() to dispose of the
         page.
    
     (2) Any other sort of iterator.
    
         No refs or pins are obtained on the page, the assumption is made that
         the caller will manage page retention.
    
         iov_iter_extract_will_pin() will return false.  The pages don't need
         additional disposal.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarJens Axboe <axboe@kernel.dk>
    cc: Al Viro <viro@zeniv.linux.org.uk>
    cc: John Hubbard <jhubbard@nvidia.com>
    cc: David Hildenbrand <david@redhat.com>
    cc: Matthew Wilcox <willy@infradead.org>
    cc: linux-fsdevel@vger.kernel.org
    cc: linux-mm@kvack.org
    Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
    7d58fe73
iov_iter.c 54.1 KB