On 2/20/23 7:53 AM, Gabriel Krisman Bertazi wrote: > Pavel Begunkov <asml.silence@xxxxxxxxx> writes: > >> If two or more mappings go back to back to each other they can be passed >> into io_uring to be registered as a single registered buffer. That would >> even work if mappings came from different sources, e.g. it's possible to >> mix in this way anon pages and pages from shmem or hugetlb. That is not >> a problem but it'd rather be less prone if we forbid such mixing. >> >> Cc: <stable@xxxxxxxxxxxxxxx> >> Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> >> --- >> io_uring/rsrc.c | 15 ++++++++------- >> 1 file changed, 8 insertions(+), 7 deletions(-) >> >> diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c >> index a59fc02de598..70d7f94670f9 100644 >> --- a/io_uring/rsrc.c >> +++ b/io_uring/rsrc.c >> @@ -1162,18 +1162,19 @@ struct page **io_pin_pages(unsigned long ubuf, unsigned long len, int *npages) >> pret = pin_user_pages(ubuf, nr_pages, FOLL_WRITE | FOLL_LONGTERM, >> pages, vmas); >> if (pret == nr_pages) { >> + struct file *file = vmas[0]->vm_file; >> + >> /* don't support file backed memory */ >> for (i = 0; i < nr_pages; i++) { >> - struct vm_area_struct *vma = vmas[i]; >> - >> - if (vma_is_shmem(vma)) >> + if (vmas[i]->vm_file != file) >> + break; > > Perhaps, return -EINVAL instead of -EOPNOTSUPP Agree, -EOPNOTSUPP is OK for an unsupported case, but I think -EINVAL makes more sense for the weird case of mixed sources as it's unlikely to ever make sense to support that. -- Jens Axboe