lkml.org 
[lkml]   [2022]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH v10 2/8] iov_iter: introduce iov_iter_get_pages_[alloc_]flags()
    Add iov_iter_get_pages_flags() and iov_iter_get_pages_alloc_flags()
    which take a flags argument that is passed to get_user_pages_fast().

    This is so that FOLL_PCI_P2PDMA can be passed when appropriate.

    Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
    ---
    include/linux/uio.h | 6 ++++++
    lib/iov_iter.c | 32 ++++++++++++++++++++++++--------
    2 files changed, 30 insertions(+), 8 deletions(-)

    diff --git a/include/linux/uio.h b/include/linux/uio.h
    index 5896af36199c..5d976d01ccb9 100644
    --- a/include/linux/uio.h
    +++ b/include/linux/uio.h
    @@ -247,8 +247,14 @@ void iov_iter_pipe(struct iov_iter *i, unsigned int direction, struct pipe_inode
    void iov_iter_discard(struct iov_iter *i, unsigned int direction, size_t count);
    void iov_iter_xarray(struct iov_iter *i, unsigned int direction, struct xarray *xarray,
    loff_t start, size_t count);
    +ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages,
    + size_t maxsize, unsigned maxpages, size_t *start,
    + unsigned gup_flags);
    ssize_t iov_iter_get_pages2(struct iov_iter *i, struct page **pages,
    size_t maxsize, unsigned maxpages, size_t *start);
    +ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
    + struct page ***pages, size_t maxsize, size_t *start,
    + unsigned gup_flags);
    ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i, struct page ***pages,
    size_t maxsize, size_t *start);
    int iov_iter_npages(const struct iov_iter *i, int maxpages);
    diff --git a/lib/iov_iter.c b/lib/iov_iter.c
    index 4b7fce72e3e5..8f089d661a41 100644
    --- a/lib/iov_iter.c
    +++ b/lib/iov_iter.c
    @@ -1427,7 +1427,8 @@ static struct page *first_bvec_segment(const struct iov_iter *i,

    static ssize_t __iov_iter_get_pages_alloc(struct iov_iter *i,
    struct page ***pages, size_t maxsize,
    - unsigned int maxpages, size_t *start)
    + unsigned int maxpages, size_t *start,
    + unsigned int gup_flags)
    {
    unsigned int n;

    @@ -1439,7 +1440,6 @@ static ssize_t __iov_iter_get_pages_alloc(struct iov_iter *i,
    maxsize = MAX_RW_COUNT;

    if (likely(user_backed_iter(i))) {
    - unsigned int gup_flags = 0;
    unsigned long addr;
    int res;

    @@ -1489,33 +1489,49 @@ static ssize_t __iov_iter_get_pages_alloc(struct iov_iter *i,
    return -EFAULT;
    }

    -ssize_t iov_iter_get_pages2(struct iov_iter *i,
    +ssize_t iov_iter_get_pages(struct iov_iter *i,
    struct page **pages, size_t maxsize, unsigned maxpages,
    - size_t *start)
    + size_t *start, unsigned gup_flags)
    {
    if (!maxpages)
    return 0;
    BUG_ON(!pages);

    - return __iov_iter_get_pages_alloc(i, &pages, maxsize, maxpages, start);
    + return __iov_iter_get_pages_alloc(i, &pages, maxsize, maxpages,
    + start, gup_flags);
    +}
    +EXPORT_SYMBOL_GPL(iov_iter_get_pages);
    +
    +ssize_t iov_iter_get_pages2(struct iov_iter *i, struct page **pages,
    + size_t maxsize, unsigned maxpages, size_t *start)
    +{
    + return iov_iter_get_pages(i, pages, maxsize, maxpages, start, 0);
    }
    EXPORT_SYMBOL(iov_iter_get_pages2);

    -ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i,
    +ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
    struct page ***pages, size_t maxsize,
    - size_t *start)
    + size_t *start, unsigned gup_flags)
    {
    ssize_t len;

    *pages = NULL;

    - len = __iov_iter_get_pages_alloc(i, pages, maxsize, ~0U, start);
    + len = __iov_iter_get_pages_alloc(i, pages, maxsize, ~0U, start,
    + gup_flags);
    if (len <= 0) {
    kvfree(*pages);
    *pages = NULL;
    }
    return len;
    }
    +EXPORT_SYMBOL_GPL(iov_iter_get_pages_alloc);
    +
    +ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i,
    + struct page ***pages, size_t maxsize, size_t *start)
    +{
    + return iov_iter_get_pages_alloc(i, pages, maxsize, start, 0);
    +}
    EXPORT_SYMBOL(iov_iter_get_pages_alloc2);

    size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
    --
    2.30.2
    \
     
     \ /
      Last update: 2022-09-22 18:41    [W:4.360 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site