From: Al Viro <viro@zeniv.linux.org.uk>
To: David Howells <dhowells@redhat.com>
Cc: Dominique Martinet <asmadeus@codewreck.org>,
Eric Van Hensbergen <ericvh@gmail.com>,
Latchesar Ionkov <lucho@ionkov.net>,
Christian Schoenebeck <linux_oss@crudebyte.com>,
v9fs-developer@lists.sourceforge.net,
Christoph Hellwig <hch@infradead.org>,
Matthew Wilcox <willy@infradead.org>,
Jens Axboe <axboe@kernel.dk>, Jan Kara <jack@suse.cz>,
Jeff Layton <jlayton@kernel.org>,
Logan Gunthorpe <logang@deltatee.com>,
linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6 21/34] 9p: Pin pages rather than ref'ing if appropriate
Date: Thu, 19 Jan 2023 02:52:12 +0000 [thread overview]
Message-ID: <Y8iwXJ2gMcCyXzm4@ZenIV> (raw)
In-Reply-To: <167391063242.2311931.3275290816918213423.stgit@warthog.procyon.org.uk>
On Mon, Jan 16, 2023 at 11:10:32PM +0000, David Howells wrote:
> @@ -310,73 +310,34 @@ static int p9_get_mapped_pages(struct virtio_chan *chan,
> struct iov_iter *data,
> int count,
> size_t *offs,
> - int *need_drop,
> + int *cleanup_mode,
> unsigned int gup_flags)
> {
> int nr_pages;
> int err;
> + int n;
>
> if (!iov_iter_count(data))
> return 0;
>
> - if (!iov_iter_is_kvec(data)) {
> - int n;
> - /*
> - * We allow only p9_max_pages pinned. We wait for the
> - * Other zc request to finish here
> - */
> - if (atomic_read(&vp_pinned) >= chan->p9_max_pages) {
> - err = wait_event_killable(vp_wq,
> - (atomic_read(&vp_pinned) < chan->p9_max_pages));
> - if (err == -ERESTARTSYS)
> - return err;
> - }
> - n = iov_iter_get_pages_alloc(data, pages, count, offs,
> - gup_flags);
> - if (n < 0)
> - return n;
> - *need_drop = 1;
> - nr_pages = DIV_ROUND_UP(n + *offs, PAGE_SIZE);
> - atomic_add(nr_pages, &vp_pinned);
> - return n;
> - } else {
> - /* kernel buffer, no need to pin pages */
> - int index;
> - size_t len;
> - void *p;
> -
> - /* we'd already checked that it's non-empty */
> - while (1) {
> - len = iov_iter_single_seg_count(data);
> - if (likely(len)) {
> - p = data->kvec->iov_base + data->iov_offset;
> - break;
> - }
> - iov_iter_advance(data, 0);
> - }
> - if (len > count)
> - len = count;
> -
> - nr_pages = DIV_ROUND_UP((unsigned long)p + len, PAGE_SIZE) -
> - (unsigned long)p / PAGE_SIZE;
> -
> - *pages = kmalloc_array(nr_pages, sizeof(struct page *),
> - GFP_NOFS);
> - if (!*pages)
> - return -ENOMEM;
> -
> - *need_drop = 0;
> - p -= (*offs = offset_in_page(p));
> - for (index = 0; index < nr_pages; index++) {
> - if (is_vmalloc_addr(p))
> - (*pages)[index] = vmalloc_to_page(p);
> - else
> - (*pages)[index] = kmap_to_page(p);
> - p += PAGE_SIZE;
> - }
> - iov_iter_advance(data, len);
> - return len;
> + /*
> + * We allow only p9_max_pages pinned. We wait for the
> + * Other zc request to finish here
> + */
> + if (atomic_read(&vp_pinned) >= chan->p9_max_pages) {
> + err = wait_event_killable(vp_wq,
> + (atomic_read(&vp_pinned) < chan->p9_max_pages));
> + if (err == -ERESTARTSYS)
> + return err;
> }
> +
> + n = iov_iter_extract_pages(data, pages, count, offs, gup_flags);
Wait a sec; just how would that work for ITER_KVEC? AFAICS, in your
tree that would blow with -EFAULT...
Yup; in p9_client_readdir() in your tree:
net/9p/client.c:2057: iov_iter_kvec(&to, ITER_DEST, &kv, 1, count);
net/9p/client.c:2077: req = p9_client_zc_rpc(clnt, P9_TREADDIR, &to, NULL, rsize, 0,
net/9p/client.c:2078: 11, "dqd", fid->fid, offset, rsize);
where
net/9p/client.c:799: err = c->trans_mod->zc_request(c, req, uidata, uodata,
net/9p/client.c:800: inlen, olen, in_hdrlen);
and in p9_virtio_zc_request(), which is a possible ->zc_request() instance
net/9p/trans_virtio.c:402: int n = p9_get_mapped_pages(chan, &out_pages, uodata,
net/9p/trans_virtio.c:403: outlen, &offs, &cleanup_mode,
net/9p/trans_virtio.c:404: FOLL_DEST_BUF);
with p9_get_mapped_pages() hitting
net/9p/trans_virtio.c:334: n = iov_iter_extract_pages(data, pages, count, offs, gup_flags);
net/9p/trans_virtio.c:335: if (n < 0)
net/9p/trans_virtio.c:336: return n;
and in iov_iter_extract_get_pages()
lib/iov_iter.c:2250: if (likely(user_backed_iter(i)))
lib/iov_iter.c:2251: return iov_iter_extract_user_pages(i, pages, maxsize,
lib/iov_iter.c:2252: maxpages, gup_flags,
lib/iov_iter.c:2253: offset0);
lib/iov_iter.c:2254: if (iov_iter_is_bvec(i))
lib/iov_iter.c:2255: return iov_iter_extract_bvec_pages(i, pages, maxsize,
lib/iov_iter.c:2256: maxpages, gup_flags,
lib/iov_iter.c:2257: offset0);
lib/iov_iter.c:2258: if (iov_iter_is_pipe(i))
lib/iov_iter.c:2259: return iov_iter_extract_pipe_pages(i, pages, maxsize,
lib/iov_iter.c:2260: maxpages, gup_flags,
lib/iov_iter.c:2261: offset0);
lib/iov_iter.c:2262: if (iov_iter_is_xarray(i))
lib/iov_iter.c:2263: return iov_iter_extract_xarray_pages(i, pages, maxsize,
lib/iov_iter.c:2264: maxpages, gup_flags,
lib/iov_iter.c:2265: offset0);
lib/iov_iter.c:2266: return -EFAULT;
All quoted lines by your
https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/tree/
How could that possibly work?
next prev parent reply other threads:[~2023-01-19 2:52 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-16 23:07 [PATCH v6 00/34] iov_iter: Improve page extraction (ref, pin or just list) David Howells
2023-01-16 23:08 ` [PATCH v6 01/34] vfs: Unconditionally set IOCB_WRITE in call_write_iter() David Howells
2023-01-17 7:52 ` Christoph Hellwig
2023-01-17 8:28 ` David Howells
2023-01-17 8:44 ` Christoph Hellwig
2023-01-17 11:11 ` David Howells
2023-01-17 11:11 ` Christoph Hellwig
2023-01-18 22:11 ` Al Viro
2023-01-19 5:44 ` Christoph Hellwig
2023-01-19 11:34 ` David Howells
2023-01-19 16:48 ` Christoph Hellwig
2023-01-19 21:14 ` David Howells
2023-01-18 22:05 ` Al Viro
2023-01-19 5:41 ` Christoph Hellwig
2023-01-19 10:01 ` David Howells
2023-01-19 16:46 ` Christoph Hellwig
2023-01-19 11:06 ` David Howells
2023-01-16 23:08 ` [PATCH v6 02/34] iov_iter: Use IOCB/IOMAP_WRITE/op_is_write rather than iterator direction David Howells
2023-01-17 7:55 ` Christoph Hellwig
2023-01-18 22:18 ` Al Viro
2023-01-16 23:08 ` [PATCH v6 03/34] iov_iter: Pass I/O direction into iov_iter_get_pages*() David Howells
2023-01-17 7:57 ` Christoph Hellwig
2023-01-17 8:07 ` David Hildenbrand
2023-01-17 8:09 ` Christoph Hellwig
2023-01-17 8:44 ` David Howells
2023-01-17 8:46 ` Christoph Hellwig
2023-01-17 8:47 ` David Hildenbrand
2023-01-18 23:03 ` Al Viro
2023-01-19 0:15 ` Al Viro
2023-01-19 2:11 ` Al Viro
2023-01-19 5:47 ` Christoph Hellwig
2023-01-19 5:47 ` Christoph Hellwig
2023-01-16 23:08 ` [PATCH v6 04/34] iov_iter: Remove iov_iter_get_pages2/pages_alloc2() David Howells
2023-01-16 23:08 ` [PATCH v6 05/34] iov_iter: Change the direction macros into an enum David Howells
2023-01-18 23:14 ` Al Viro
2023-01-18 23:17 ` David Howells
2023-01-18 23:19 ` Al Viro
2023-01-18 23:24 ` David Howells
2023-01-16 23:08 ` [PATCH v6 06/34] iov_iter: Use the direction in the iterator functions David Howells
2023-01-17 7:58 ` Christoph Hellwig
2023-01-18 22:28 ` Al Viro
2023-01-19 5:45 ` Christoph Hellwig
2023-01-18 23:15 ` Al Viro
2023-01-16 23:08 ` [PATCH v6 07/34] iov_iter: Add a function to extract a page list from an iterator David Howells
2023-01-17 8:01 ` Christoph Hellwig
2023-01-17 8:19 ` David Howells
2023-01-16 23:08 ` [PATCH v6 08/34] mm: Provide a helper to drop a pin/ref on a page David Howells
2023-01-17 8:02 ` Christoph Hellwig
2023-01-17 8:21 ` David Howells
2023-01-16 23:09 ` [PATCH v6 09/34] bio: Rename BIO_NO_PAGE_REF to BIO_PAGE_REFFED and invert the meaning David Howells
2023-01-17 8:02 ` Christoph Hellwig
2023-01-18 14:00 ` David Howells
2023-01-18 14:09 ` Christoph Hellwig
2023-01-16 23:09 ` [PATCH v6 10/34] mm, block: Make BIO_PAGE_REFFED/PINNED the same as FOLL_GET/PIN numerically David Howells
2023-01-17 8:03 ` Christoph Hellwig
2023-01-16 23:09 ` [PATCH v6 11/34] iov_iter, block: Make bio structs pin pages rather than ref'ing if appropriate David Howells
2023-01-17 8:07 ` Christoph Hellwig
2023-01-17 8:26 ` David Howells
2023-01-17 8:44 ` Christoph Hellwig
2023-01-16 23:09 ` [PATCH v6 12/34] bio: Fix bio_flagged() so that gcc can better optimise it David Howells
2023-01-17 8:07 ` Christoph Hellwig
2023-01-16 23:09 ` [PATCH v6 13/34] netfs: Add a function to extract a UBUF or IOVEC into a BVEC iterator David Howells
2023-01-16 23:09 ` [PATCH v6 14/34] netfs: Add a function to extract an iterator into a scatterlist David Howells
2023-01-16 23:09 ` [PATCH v6 15/34] af_alg: Pin pages rather than ref'ing if appropriate David Howells
2023-01-16 23:09 ` [PATCH v6 16/34] af_alg: [RFC] Use netfs_extract_iter_to_sg() to create scatterlists David Howells
2023-01-16 23:10 ` [PATCH v6 17/34] scsi: [RFC] Use netfs_extract_iter_to_sg() David Howells
2023-01-16 23:10 ` [PATCH v6 18/34] dio: Pin pages rather than ref'ing if appropriate David Howells
2023-01-19 5:04 ` Al Viro
2023-01-19 5:51 ` Christoph Hellwig
2023-01-16 23:10 ` [PATCH v6 19/34] fuse: " David Howells
2023-01-16 23:10 ` [PATCH v6 20/34] vfs: Make splice use iov_iter_extract_pages() David Howells
2023-01-19 2:31 ` Al Viro
2023-01-16 23:10 ` [PATCH v6 21/34] 9p: Pin pages rather than ref'ing if appropriate David Howells
2023-01-19 2:52 ` Al Viro [this message]
2023-01-19 16:44 ` David Howells
2023-01-19 16:51 ` Christoph Hellwig
2023-01-16 23:10 ` [PATCH v6 22/34] nfs: " David Howells
2023-01-16 23:10 ` [PATCH v6 23/34] cifs: Implement splice_read to pass down ITER_BVEC not ITER_PIPE David Howells
2023-01-16 23:10 ` [PATCH v6 24/34] cifs: Add a function to build an RDMA SGE list from an iterator David Howells
2023-01-16 23:11 ` [PATCH v6 25/34] cifs: Add a function to Hash the contents of " David Howells
2023-01-16 23:11 ` [PATCH v6 26/34] cifs: Add some helper functions David Howells
2023-01-16 23:11 ` [PATCH v6 27/34] cifs: Add a function to read into an iter from a socket David Howells
2023-01-16 23:11 ` [PATCH v6 28/34] cifs: Change the I/O paths to use an iterator rather than a page list David Howells
2023-01-16 23:11 ` [PATCH v6 29/34] cifs: Build the RDMA SGE list directly from an iterator David Howells
2023-01-16 23:11 ` [PATCH v6 30/34] cifs: Remove unused code David Howells
2023-01-16 23:11 ` [PATCH v6 31/34] cifs: Fix problem with encrypted RDMA data read David Howells
2023-01-19 16:25 ` Stefan Metzmacher
2023-01-16 23:11 ` [PATCH v6 32/34] cifs: DIO to/from KVEC-type iterators should now work David Howells
2023-01-16 23:12 ` [PATCH v6 33/34] net: [RFC][WIP] Mark each skb_frags as to how they should be cleaned up David Howells
2023-01-16 23:12 ` [PATCH v6 34/34] net: [RFC][WIP] Make __zerocopy_sg_from_iter() correctly pin or leave pages unref'd David Howells
2023-01-17 7:46 ` [PATCH v6 00/34] iov_iter: Improve page extraction (ref, pin or just list) Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y8iwXJ2gMcCyXzm4@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=asmadeus@codewreck.org \
--cc=axboe@kernel.dk \
--cc=dhowells@redhat.com \
--cc=ericvh@gmail.com \
--cc=hch@infradead.org \
--cc=jack@suse.cz \
--cc=jlayton@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux_oss@crudebyte.com \
--cc=logang@deltatee.com \
--cc=lucho@ionkov.net \
--cc=v9fs-developer@lists.sourceforge.net \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox