mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 22:24:11 +08: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_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,
|
void iov_iter_xarray(struct iov_iter *i, unsigned int direction, struct xarray *xarray,
|
||||||
loff_t start, size_t count);
|
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,
|
ssize_t iov_iter_get_pages2(struct iov_iter *i, struct page **pages,
|
||||||
size_t maxsize, unsigned maxpages, size_t *start);
|
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,
|
ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i, struct page ***pages,
|
||||||
size_t maxsize, size_t *start);
|
size_t maxsize, size_t *start);
|
||||||
int iov_iter_npages(const struct iov_iter *i, int maxpages);
|
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,
|
static ssize_t __iov_iter_get_pages_alloc(struct iov_iter *i,
|
||||||
struct page ***pages, size_t maxsize,
|
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;
|
unsigned int n;
|
||||||
|
|
||||||
@ -1442,7 +1443,6 @@ static ssize_t __iov_iter_get_pages_alloc(struct iov_iter *i,
|
|||||||
maxsize = MAX_RW_COUNT;
|
maxsize = MAX_RW_COUNT;
|
||||||
|
|
||||||
if (likely(user_backed_iter(i))) {
|
if (likely(user_backed_iter(i))) {
|
||||||
unsigned int gup_flags = 0;
|
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
@ -1492,33 +1492,49 @@ static ssize_t __iov_iter_get_pages_alloc(struct iov_iter *i,
|
|||||||
return -EFAULT;
|
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,
|
struct page **pages, size_t maxsize, unsigned maxpages,
|
||||||
size_t *start)
|
size_t *start, unsigned gup_flags)
|
||||||
{
|
{
|
||||||
if (!maxpages)
|
if (!maxpages)
|
||||||
return 0;
|
return 0;
|
||||||
BUG_ON(!pages);
|
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);
|
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,
|
struct page ***pages, size_t maxsize,
|
||||||
size_t *start)
|
size_t *start, unsigned gup_flags)
|
||||||
{
|
{
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
*pages = NULL;
|
*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) {
|
if (len <= 0) {
|
||||||
kvfree(*pages);
|
kvfree(*pages);
|
||||||
*pages = NULL;
|
*pages = NULL;
|
||||||
}
|
}
|
||||||
return len;
|
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);
|
EXPORT_SYMBOL(iov_iter_get_pages_alloc2);
|
||||||
|
|
||||||
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
|
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
|
||||||
|
Loading…
Reference in New Issue
Block a user