From: "Venkateswararao Jujjuri (JV)" <jvrao@linux.vnet.ibm.com>
To: "Venkateswararao Jujjuri (JV)" <jvrao@linux.vnet.ibm.com>
Cc: v9fs-developer@lists.sourceforge.net, linux-fsdevel@vger.kernel.org
Subject: [RFC] [PATCH 4/7] [net/9p] Add gup/zero_copy support to VirtIO transport layer.
Date: Sun, 06 Feb 2011 22:56:55 -0800 [thread overview]
Message-ID: <4D4F97B7.8060104@linux.vnet.ibm.com> (raw)
In-Reply-To: <1297063283-2180-5-git-send-email-jvrao@linux.vnet.ibm.com>
On 2/6/2011 11:21 PM, Venkateswararao Jujjuri (JV) wrote:
> Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
> ---
> net/9p/trans_virtio.c | 85 +++++++++++++++++++++++++++++++++++++++++++++---
> 1 files changed, 79 insertions(+), 6 deletions(-)
>
> diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c
> index c8f3f72..607f064 100644
> --- a/net/9p/trans_virtio.c
> +++ b/net/9p/trans_virtio.c
> @@ -45,6 +45,7 @@
> #include <linux/scatterlist.h>
> #include <linux/virtio.h>
> #include <linux/virtio_9p.h>
> +#include "trans_common.h"
>
> #define VIRTQUEUE_NUM 128
>
> @@ -155,6 +156,12 @@ static void req_done(struct virtqueue *vq)
> rc->tag);
> req = p9_tag_lookup(chan->client, rc->tag);
> req->status = REQ_STATUS_RCVD;
> + if (req->tc->private) {
> + /*Release pages */
> + p9_release_req_pages(req->tc->private);
> + kfree(req->tc->private);
> + req->tc->private = NULL;
> + }
> p9_client_cb(chan->client, req);
> } else {
> spin_unlock_irqrestore(&chan->lock, flags);
> @@ -202,6 +209,30 @@ static int p9_virtio_cancel(struct p9_client *client, struct p9_req_t *req)
> return 1;
> }
>
> +static int
> +pack_sg_list_p(struct scatterlist *sg, int start, int limit, size_t pdata_off,
> + struct page **pdata, int count)
> +{
> + int s;
> + int i = 0;
> + int index = start;
> +
> + if (pdata_off) {
> + s = min((int)(PAGE_SIZE - pdata_off), count);
> + sg_set_page(&sg[index++], pdata[i++], s, pdata_off);
> + count -= s;
> + }
> +
> + while (count) {
> + BUG_ON(index > limit);
> + s = min((int)PAGE_SIZE, count);
> + sg_set_page(&sg[index++], pdata[i++], s, 0);
> + count -= s;
> + }
> +
> + return index-start;
> +}
> +
> /**
> * p9_virtio_request - issue a request
> * @client: client instance issuing the request
> @@ -212,22 +243,64 @@ static int p9_virtio_cancel(struct p9_client *client, struct p9_req_t *req)
> static int
> p9_virtio_request(struct p9_client *client, struct p9_req_t *req)
> {
> - int in, out;
> + int in, out, inp, outp;
> struct virtio_chan *chan = client->trans;
> char *rdata = (char *)req->rc+sizeof(struct p9_fcall);
> unsigned long flags;
> - int err;
> + size_t pdata_off=0;
> + virtio_rpage_info_t *rpinfo;
> + int err, pdata_len=0;
>
> P9_DPRINTK(P9_DEBUG_TRANS, "9p debug: virtio request\n");
>
> req_retry:
> req->status = REQ_STATUS_SENT;
>
> + if (req->tc->pbuf_size &&
> + (req->tc->pbuf && !segment_eq(get_fs(), KERNEL_DS))) {
> + err = payload_gup(req, &pdata_off, &pdata_len,
> + req->tc->id == P9_TREAD ? 1 : 0 );
> + if (err < 0)
> + return err;
> + }
> + rpinfo = (virtio_rpage_info_t *)req->tc->private;
> +
> spin_lock_irqsave(&chan->lock, flags);
> - out = pack_sg_list(chan->sg, 0, VIRTQUEUE_NUM, req->tc->sdata,
> - req->tc->size);
> - in = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM-out, rdata,
> - client->msize);
> +
> + /* Handle out VirtIO ring buffers */
> + if (req->tc->pbuf_size && (req->tc->id == P9_TWRITE)) {
> + /* We have additional write payload buffer to take care */
> + out = pack_sg_list(chan->sg, 0, VIRTQUEUE_NUM, req->tc->sdata,
> + req->tc->size);
> + outp = pack_sg_list_p(chan->sg, out, VIRTQUEUE_NUM,
> + pdata_off, rpinfo->vp_data, pdata_len);
> + out += outp;
> + } else {
> + out = pack_sg_list(chan->sg, 0, VIRTQUEUE_NUM, req->tc->sdata,
> + req->tc->size);
> + }
> +
> + /* Handle in VirtIO ring buffers */
> + if (req->tc->pbuf_size && (req->tc->id == P9_TREAD)) {
> + /* We have additional Read payload buffer to take care */
> + inp = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM, rdata, 11);
> + /*
> + * Running executables in the filesystem may result in
> + * a read request with kernel buffer as opposed to user buffer.
> + */
> + if (req->tc->pbuf && !segment_eq(get_fs(), KERNEL_DS)) {
> + in = pack_sg_list_p(chan->sg, out+inp, VIRTQUEUE_NUM,
> + pdata_off, rpinfo->vp_data, pdata_len);
> + } else {
> + in = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM,
> + (char *)req->tc->pbuf,
> + req->tc->pbuf_size);
> + }
> + in += inp;
> + } else {
> + in = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM, rdata,
> + client->msize);
> + }
>
> err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc);
> if (err < 0) {
next prev parent reply other threads:[~2011-02-07 6:57 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-07 7:21 [RFC-V2] [PATCH 0/7] Zero Copy Venkateswararao Jujjuri (JV)
2011-02-07 6:55 ` Venkateswararao Jujjuri (JV)
2011-02-07 7:21 ` [RFC] [PATCH 1/7] [net/9p] Additional elements to p9_fcall to accomodate zero copy Venkateswararao Jujjuri (JV)
2011-02-07 7:21 ` Venkateswararao Jujjuri (JV)
2011-02-07 6:56 ` [RFC] [PATCH 2/7] [net/9p] Adds supporting functions for " Venkateswararao Jujjuri (JV)
2011-02-08 15:20 ` [V9fs-developer] " Latchesar Ionkov
2011-02-08 17:21 ` Venkateswararao Jujjuri (JV)
2011-02-07 7:21 ` [RFC] [PATCH 1/7] [net/9p] Additional elements to p9_fcall to accomodate " Venkateswararao Jujjuri (JV)
2011-02-07 6:56 ` [RFC] [PATCH 3/7] [net/9p] Assign type of transaction to tc->pdu->id which is otherwise unsed Venkateswararao Jujjuri (JV)
2011-02-07 7:21 ` [RFC] [PATCH 1/7] [net/9p] Additional elements to p9_fcall to accomodate zero copy Venkateswararao Jujjuri (JV)
2011-02-07 6:56 ` Venkateswararao Jujjuri (JV) [this message]
2011-02-07 7:21 ` Venkateswararao Jujjuri (JV)
2011-02-07 6:57 ` [RFC] [PATCH 5/7] [net/9p] Add preferences to transport layer Venkateswararao Jujjuri (JV)
2011-02-07 7:21 ` [RFC] [PATCH 1/7] [net/9p] Additional elements to p9_fcall to accomodate zero copy Venkateswararao Jujjuri (JV)
2011-02-07 6:57 ` :[RFC] [PATCH 6/7] [net/9p] Read and Write side zerocopy changes for 9P2000.L protocol Venkateswararao Jujjuri (JV)
2011-02-08 21:09 ` [V9fs-developer] " Eric Van Hensbergen
2011-02-08 21:16 ` Eric Van Hensbergen
2011-02-09 21:09 ` Venkateswararao Jujjuri (JV)
2011-02-09 21:12 ` Venkateswararao Jujjuri (JV)
2011-02-09 21:18 ` Eric Van Hensbergen
2011-02-09 21:39 ` Venkateswararao Jujjuri (JV)
2011-02-08 23:50 ` Venkateswararao Jujjuri (JV)
2011-02-09 1:59 ` Venkateswararao Jujjuri (JV)
2011-02-09 14:28 ` Eric Van Hensbergen
2011-02-07 7:21 ` [RFC] [PATCH 1/7] [net/9p] Additional elements to p9_fcall to accomodate zero copy Venkateswararao Jujjuri (JV)
2011-02-07 6:58 ` [PATCH 7/7] [net/9p] Handle TREAD/RERROR case in !dotl case Venkateswararao Jujjuri (JV)
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=4D4F97B7.8060104@linux.vnet.ibm.com \
--to=jvrao@linux.vnet.ibm.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=v9fs-developer@lists.sourceforge.net \
/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.