From: Christian Schoenebeck <linux_oss@crudebyte.com>
To: v9fs-developer@lists.sourceforge.net
Cc: netdev@vger.kernel.org,
Dominique Martinet <asmadeus@codewreck.org>,
Eric Van Hensbergen <ericvh@gmail.com>,
Latchesar Ionkov <lucho@ionkov.net>, Greg Kurz <groug@kaod.org>,
Vivek Goyal <vgoyal@redhat.com>
Subject: [PATCH 6/7] 9p/trans_virtio: support larger msize values
Date: Thu, 16 Sep 2021 20:25:16 +0200 [thread overview]
Message-ID: <810050b76b9b04f045e3d21b0082358ea3f21391.1631816768.git.linux_oss@crudebyte.com> (raw)
In-Reply-To: <cover.1631816768.git.linux_oss@crudebyte.com>
The virtio transport supports by default a 9p 'msize' of up to
approximately 500 kB. This patches adds support for larger 'msize'
values by resizing the amount of scatter/gather lists if required.
Signed-off-by: Christian Schoenebeck <linux_oss@crudebyte.com>
---
net/9p/trans_virtio.c | 52 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c
index 1a45e0df2336..1f9a0283d7b8 100644
--- a/net/9p/trans_virtio.c
+++ b/net/9p/trans_virtio.c
@@ -195,6 +195,30 @@ static struct virtqueue_sg *vq_sg_alloc(unsigned int nsgl)
return vq_sg;
}
+/**
+ * Resize passed virtqueue scatter/gather lists to the passed amount of
+ * list blocks.
+ * @_vq_sg: scatter/gather lists to be resized
+ * @nsgl: new amount of scatter/gather list blocks
+ */
+static int vq_sg_resize(struct virtqueue_sg **_vq_sg, unsigned int nsgl)
+{
+ struct virtqueue_sg *vq_sg;
+
+ BUG_ON(!_vq_sg || !nsgl);
+ vq_sg = *_vq_sg;
+ if (vq_sg->nsgl == nsgl)
+ return 0;
+
+ /* lazy resize implementation for now */
+ vq_sg = vq_sg_alloc(nsgl);
+ if (!vq_sg)
+ return -ENOMEM;
+
+ *_vq_sg = vq_sg;
+ return 0;
+}
+
/**
* p9_virtio_close - reclaim resources of a channel
* @client: client instance
@@ -766,6 +790,10 @@ p9_virtio_create(struct p9_client *client, const char *devname, char *args)
struct virtio_chan *chan;
int ret = -ENOENT;
int found = 0;
+#if !defined(CONFIG_ARCH_NO_SG_CHAIN)
+ size_t npages;
+ size_t nsgl;
+#endif
if (devname == NULL)
return -EINVAL;
@@ -788,6 +816,30 @@ p9_virtio_create(struct p9_client *client, const char *devname, char *args)
return ret;
}
+ /*
+ * if user supplied an 'msize' option that's larger than what this
+ * transport supports by default, then try to allocate more sg lists
+ */
+ if (client->msize > client->trans_maxsize) {
+#if !defined(CONFIG_ARCH_NO_SG_CHAIN)
+ npages = DIV_ROUND_UP(client->msize, PAGE_SIZE);
+ if (npages > chan->p9_max_pages)
+ npages = chan->p9_max_pages;
+ nsgl = DIV_ROUND_UP(npages, SG_USER_PAGES_PER_LIST);
+ if (nsgl > chan->vq_sg->nsgl) {
+ /*
+ * if resize fails, no big deal, then just
+ * continue with default msize instead
+ */
+ if (!vq_sg_resize(&chan->vq_sg, nsgl)) {
+ client->trans_maxsize =
+ PAGE_SIZE *
+ ((nsgl * SG_USER_PAGES_PER_LIST) - 3);
+ }
+ }
+#endif /* !defined(CONFIG_ARCH_NO_SG_CHAIN) */
+ }
+
client->trans = (void *)chan;
client->status = Connected;
chan->client = client;
--
2.20.1
next prev parent reply other threads:[~2021-09-16 19:30 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-16 18:26 [PATCH 0/7] net/9p: remove msize limit in virtio transport Christian Schoenebeck
2021-09-16 18:24 ` [PATCH 1/7] net/9p: show error message if user 'msize' cannot be satisfied Christian Schoenebeck
2021-09-16 18:24 ` [PATCH 2/7] 9p/trans_virtio: separate allocation of scatter gather list Christian Schoenebeck
2021-09-16 18:24 ` [PATCH 3/7] 9p/trans_virtio: turn amount of sg lists into runtime info Christian Schoenebeck
2021-09-16 18:25 ` [PATCH 4/7] 9p/trans_virtio: introduce struct virtqueue_sg Christian Schoenebeck
2021-09-16 18:25 ` [PATCH 5/7] net/9p: add trans_maxsize to struct p9_client Christian Schoenebeck
2021-09-16 18:25 ` Christian Schoenebeck [this message]
2021-09-17 12:02 ` [PATCH 6/7] 9p/trans_virtio: support larger msize values Christian Schoenebeck
2021-09-16 18:25 ` [PATCH 7/7] 9p/trans_virtio: resize sg lists to whatever is possible Christian Schoenebeck
2021-09-17 2:09 ` [PATCH 0/7] net/9p: remove msize limit in virtio transport Jakub Kicinski
2021-09-17 12:04 ` Christian Schoenebeck
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=810050b76b9b04f045e3d21b0082358ea3f21391.1631816768.git.linux_oss@crudebyte.com \
--to=linux_oss@crudebyte.com \
--cc=asmadeus@codewreck.org \
--cc=ericvh@gmail.com \
--cc=groug@kaod.org \
--cc=lucho@ionkov.net \
--cc=netdev@vger.kernel.org \
--cc=v9fs-developer@lists.sourceforge.net \
--cc=vgoyal@redhat.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.