[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 08/15] virtio: decrease size of VirtQueueElement
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-devel] [PATCH 08/15] virtio: decrease size of VirtQueueElement |
Date: |
Wed, 30 Jul 2014 16:40:57 +0200 |
On Wed, Jul 30, 2014 at 03:51:22PM +0200, Paolo Bonzini wrote:
> Il 30/07/2014 13:39, Ming Lei ha scritto:
> > diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
> > index a60104c..943e72f 100644
> > --- a/include/hw/virtio/virtio.h
> > +++ b/include/hw/virtio/virtio.h
> > @@ -84,12 +84,17 @@ typedef struct VirtQueue VirtQueue;
> > typedef struct VirtQueueElement
> > {
> > unsigned int index;
> > + unsigned int num;
> > unsigned int out_num;
> > unsigned int in_num;
> > - hwaddr in_addr[VIRTQUEUE_MAX_SIZE];
> > - hwaddr out_addr[VIRTQUEUE_MAX_SIZE];
> > - struct iovec in_sg[VIRTQUEUE_MAX_SIZE];
> > - struct iovec out_sg[VIRTQUEUE_MAX_SIZE];
> > +
> > + hwaddr *in_addr;
> > + hwaddr *out_addr;
> > + struct iovec *in_sg;
> > + struct iovec *out_sg;
> > +
> > + hwaddr addr[VIRTQUEUE_MAX_SIZE];
> > + struct iovec sg[VIRTQUEUE_MAX_SIZE];
> > } VirtQueueElement;
> >
> > #define VIRTIO_PCI_QUEUE_MAX 64
> > --
>
> since addr and sg aren't used directly, allocate them flexibly like
>
> char *p;
> VirtQueueElement *elem;
> total_size = ROUND_UP(sizeof(struct VirtQueueElement),
> __alignof__(elem->addr[0]);
> addr_offset = total_size;
> total_size = ROUND_UP(total_size + num * sizeof(elem->addr[0]),
> __alignof__(elem->sg[0]));
> sg_offset = total_size;
> total_size += num * sizeof(elem->sg[0]);
>
> elem = p = g_slice_alloc(total_size);
> elem->size = total_size;
> elem->in_addr = p + addr_offset;
> elem->out_addr = elem->in_addr + in_num;
> elem->in_sg = p + sg_offset;
> elem->out_sg = elem->in_sg + in_num;
>
> ...
>
> g_slice_free1(elem->size, elem);
>
> The small size will help glib do slab-style allocation and should remove
> the need for an object pool.
>
> Paolo
As long as you relying on this, why not allocate in_sg/out_sg
separately?
In any case, a bunch of code needs to be audited to make sure
no one assumes we can always stick VIRTQUEUE_MAX_SIZE there.
But what really worries me is this is an optimization patch
without any numbers accompanying it.
I would say split this out from your virtio blk work,
work on this separately.
--
MST
[Qemu-devel] [PATCH 09/15] linux-aio: fix submit aio as a batch, Ming Lei, 2014/07/30
[Qemu-devel] [PATCH 10/15] linux-aio: increase max event to 256, Ming Lei, 2014/07/30