lkml.org 
[lkml]   [2022]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH v7 18/21] block: set FOLL_PCI_P2PDMA in __bio_iov_iter_get_pages()
    When a bio's queue supports PCI P2PDMA, set FOLL_PCI_P2PDMA for
    iov_iter_get_pages_flags(). This allows PCI P2PDMA pages to be passed
    from userspace and enables the O_DIRECT path in iomap based filesystems
    and direct to block devices.

    Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
    ---
    block/bio.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    diff --git a/block/bio.c b/block/bio.c
    index a402a4760457..0d152da8938d 100644
    --- a/block/bio.c
    +++ b/block/bio.c
    @@ -1180,6 +1180,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
    struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt;
    struct page **pages = (struct page **)bv;
    bool same_page = false;
    + unsigned int flags = 0;
    ssize_t size, left;
    unsigned len, i;
    size_t offset;
    @@ -1192,7 +1193,12 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
    BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2);
    pages += entries_left * (PAGE_PTRS_PER_BVEC - 1);

    - size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset);
    + if (bio->bi_bdev && bio->bi_bdev->bd_disk &&
    + blk_queue_pci_p2pdma(bio->bi_bdev->bd_disk->queue))
    + flags |= FOLL_PCI_P2PDMA;
    +
    + size = iov_iter_get_pages_flags(iter, pages, LONG_MAX, nr_pages,
    + &offset, flags);
    if (unlikely(size <= 0))
    return size ? size : -EFAULT;

    --
    2.30.2
    \
     
     \ /
      Last update: 2022-06-15 18:16    [W:2.395 / U:0.504 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site