From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43882) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XCUI5-0000Y7-Ns for qemu-devel@nongnu.org; Wed, 30 Jul 2014 09:51:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XCUHz-0002Ox-JD for qemu-devel@nongnu.org; Wed, 30 Jul 2014 09:51:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42932) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XCUHz-0002My-9j for qemu-devel@nongnu.org; Wed, 30 Jul 2014 09:51:31 -0400 Message-ID: <53D8F85A.1090400@redhat.com> Date: Wed, 30 Jul 2014 15:51:22 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1406720388-18671-1-git-send-email-ming.lei@canonical.com> <1406720388-18671-9-git-send-email-ming.lei@canonical.com> In-Reply-To: <1406720388-18671-9-git-send-email-ming.lei@canonical.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 08/15] virtio: decrease size of VirtQueueElement List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Ming Lei , qemu-devel@nongnu.org, Peter Maydell , Stefan Hajnoczi Cc: Kevin Wolf , Fam Zheng , "Michael S. Tsirkin" 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