net/9p: Fix kernel crash with msize 512K

With msize equal to 512K (PAGE_SIZE * VIRTQUEUE_NUM), we hit multiple
crashes. This patch fix those.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
Aneesh Kumar K.V 2011-08-17 16:56:04 +00:00 committed by Eric Van Hensbergen
parent 45089142b1
commit b49d8b5d70

View file

@ -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, in = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM,
req->rc->capacity); 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,