lkml.org 
[lkml]   [2011]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH] virtio-ring: Use threshold for switching to indirect descriptors
    From
    Date
    On Sun, 2011-12-04 at 20:23 +0200, Sasha Levin wrote:

    [snip]

    Rusty, Michael, does the below looks a reasonable optimization for you?
    should I send it as a patch?

    > Something like the following patch:
    >
    > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
    > index c7a2c20..3166ca0 100644
    > --- a/drivers/virtio/virtio_ring.c
    > +++ b/drivers/virtio/virtio_ring.c
    > @@ -82,6 +82,7 @@ struct vring_virtqueue
    >
    > /* Host supports indirect buffers */
    > bool indirect;
    > + struct kmem_cache *indirect_cache;
    >
    > /* Host publishes avail event idx */
    > bool event;
    > @@ -110,6 +111,9 @@ struct vring_virtqueue
    >
    > #define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq)
    >
    > +static unsigned int ind_alloc_thresh = 0;
    > +module_param(ind_alloc_thresh, uint, S_IRUGO);
    > +
    > /* Set up an indirect table of descriptors and add it to the queue. */
    > static int vring_add_indirect(struct vring_virtqueue *vq,
    > struct scatterlist sg[],
    > @@ -121,7 +125,10 @@ static int vring_add_indirect(struct vring_virtqueue *vq,
    > unsigned head;
    > int i;
    >
    > - desc = kmalloc((out + in) * sizeof(struct vring_desc), gfp);
    > + if ((out + in) <= ind_alloc_thresh)
    > + desc = kmem_cache_alloc(vq->indirect_cache, gfp);
    > + else
    > + desc = kmalloc((out + in) * sizeof(struct vring_desc), gfp);
    > if (!desc)
    > return -ENOMEM;
    >
    > @@ -479,6 +486,9 @@ struct virtqueue *vring_new_virtqueue(unsigned int num,
    > vq->broken = false;
    > vq->last_used_idx = 0;
    > vq->num_added = 0;
    > + if (ind_alloc_thresh)
    > + vq->indirect_cache = KMEM_CACHE(vring_desc[ind_alloc_thresh], 0);
    > list_add_tail(&vq->vq.list, &vdev->vqs);
    > #ifdef DEBUG
    > vq->in_use = false;
    >

    --

    Sasha.



    \
     
     \ /
      Last update: 2011-12-07 15:05    [W:2.109 / U:0.572 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site