mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
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> Reviewed-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20221021174116.7200-4-logang@deltatee.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
4003f107fa
commit
d82076403c
@ -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);
|
||||
|
@ -1430,7 +1430,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;
|
||||
|
||||
@ -1442,7 +1443,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;
|
||||
|
||||
@ -1492,33 +1492,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,
|
||||
|
Loading…
Reference in New Issue
Block a user