]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
net/9p: Fix kernel crash with msize 512K
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Mon, 15 Aug 2011 15:53:08 +0000 (10:53 -0500)
committerEric Van Hensbergen <ericvh@gmail.com>
Mon, 15 Aug 2011 15:53:08 +0000 (10:53 -0500)
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>
net/9p/trans_virtio.c

index 175b5135bdcf524d324c73298cd17da0819c9a1e..a8f4e9169f4c384d7bce0376363503b19a7dfed0 100644 (file)
@@ -263,7 +263,7 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req)
 {
        int in, out, inp, outp;
        struct virtio_chan *chan = client->trans;
-       char *rdata = (char *)req->rc+sizeof(struct p9_fcall);
+       char *rdata = (char *)req->rc + sizeof(struct p9_fcall);
        unsigned long flags;
        size_t pdata_off = 0;
        struct trans_rpage_info *rpinfo = NULL;
@@ -367,7 +367,7 @@ req_retry_pinned:
                in += inp;
        } else {
                in = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM, rdata,
-                               req->rc->capacity);
+                               req->rc->capacity - sizeof(struct p9_fcall));
        }
 
        err = virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc);
@@ -592,7 +592,13 @@ static struct p9_trans_module p9_virtio_trans = {
        .close = p9_virtio_close,
        .request = p9_virtio_request,
        .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,
        .def = 0,
        .owner = THIS_MODULE,