diff options
author | Connor Kuehl <ckuehl@redhat.com> | 2021-03-18 08:52:22 -0500 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2021-04-14 10:40:57 +0200 |
commit | a7f0d7aab0b4f3f0780b1f77356e2fe7202ac0cb (patch) | |
tree | aeaccd4413406edb9128aa1f9794d7337c7e66c9 /fs/fuse/fuse_i.h | |
parent | c79c5e0178922a9e092ec8fed026750f39dcaef4 (diff) | |
download | linux-rpi-a7f0d7aab0b4f3f0780b1f77356e2fe7202ac0cb.tar.gz linux-rpi-a7f0d7aab0b4f3f0780b1f77356e2fe7202ac0cb.tar.bz2 linux-rpi-a7f0d7aab0b4f3f0780b1f77356e2fe7202ac0cb.zip |
virtiofs: split requests that exceed virtqueue size
If an incoming FUSE request can't fit on the virtqueue, the request is
placed onto a workqueue so a worker can try to resubmit it later where
there will (hopefully) be space for it next time.
This is fine for requests that aren't larger than a virtqueue's maximum
capacity. However, if a request's size exceeds the maximum capacity of the
virtqueue (even if the virtqueue is empty), it will be doomed to a life of
being placed on the workqueue, removed, discovered it won't fit, and placed
on the workqueue yet again.
Furthermore, from section 2.6.5.3.1 (Driver Requirements: Indirect
Descriptors) of the virtio spec:
"A driver MUST NOT create a descriptor chain longer than the Queue
Size of the device."
To fix this, limit the number of pages FUSE will use for an overall
request. This way, each request can realistically fit on the virtqueue
when it is decomposed into a scattergather list and avoid violating section
2.6.5.3.1 of the virtio spec.
Signed-off-by: Connor Kuehl <ckuehl@redhat.com>
Reviewed-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/fuse/fuse_i.h')
-rw-r--r-- | fs/fuse/fuse_i.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 979b680bb47e..38369a5094af 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -555,6 +555,9 @@ struct fuse_conn { /** Maximum number of pages that can be used in a single request */ unsigned int max_pages; + /** Constrain ->max_pages to this value during feature negotiation */ + unsigned int max_pages_limit; + /** Input queue */ struct fuse_iqueue iq; |