|
@@ -263,7 +263,6 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req)
|
|
{
|
|
{
|
|
int in, out, inp, outp;
|
|
int in, out, inp, outp;
|
|
struct virtio_chan *chan = client->trans;
|
|
struct virtio_chan *chan = client->trans;
|
|
- char *rdata = (char *)req->rc+sizeof(struct p9_fcall);
|
|
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
size_t pdata_off = 0;
|
|
size_t pdata_off = 0;
|
|
struct trans_rpage_info *rpinfo = NULL;
|
|
struct trans_rpage_info *rpinfo = NULL;
|
|
@@ -346,7 +345,8 @@ req_retry_pinned:
|
|
* Arrange in such a way that server places header in the
|
|
* Arrange in such a way that server places header in the
|
|
* alloced memory and payload onto the user buffer.
|
|
* alloced memory and payload onto the user buffer.
|
|
*/
|
|
*/
|
|
- inp = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM, rdata, 11);
|
|
|
|
|
|
+ inp = pack_sg_list(chan->sg, out,
|
|
|
|
+ VIRTQUEUE_NUM, req->rc->sdata, 11);
|
|
/*
|
|
/*
|
|
* Running executables in the filesystem may result in
|
|
* Running executables in the filesystem may result in
|
|
* a read request with kernel buffer as opposed to user buffer.
|
|
* a read request with kernel buffer as opposed to user buffer.
|
|
@@ -366,8 +366,8 @@ req_retry_pinned:
|
|
}
|
|
}
|
|
in += inp;
|
|
in += inp;
|
|
} else {
|
|
} else {
|
|
- in = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM, rdata,
|
|
|
|
- req->rc->capacity);
|
|
|
|
|
|
+ in = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM,
|
|
|
|
+ req->rc->sdata, req->rc->capacity);
|
|
}
|
|
}
|
|
|
|
|
|
err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc);
|
|
err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc);
|
|
@@ -592,7 +592,14 @@ static struct p9_trans_module p9_virtio_trans = {
|
|
.close = p9_virtio_close,
|
|
.close = p9_virtio_close,
|
|
.request = p9_virtio_request,
|
|
.request = p9_virtio_request,
|
|
.cancel = p9_virtio_cancel,
|
|
.cancel = p9_virtio_cancel,
|
|
- .maxsize = PAGE_SIZE*VIRTQUEUE_NUM,
|
|
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We leave one entry for input and one entry for response
|
|
|
|
+ * headers. We also skip one more entry to accomodate, address
|
|
|
|
+ * that are not at page boundary, that can result in an extra
|
|
|
|
+ * page in zero copy.
|
|
|
|
+ */
|
|
|
|
+ .maxsize = PAGE_SIZE * (VIRTQUEUE_NUM - 3),
|
|
.pref = P9_TRANS_PREF_PAYLOAD_SEP,
|
|
.pref = P9_TRANS_PREF_PAYLOAD_SEP,
|
|
.def = 0,
|
|
.def = 0,
|
|
.owner = THIS_MODULE,
|
|
.owner = THIS_MODULE,
|