On Tue, Aug 5, 2014 at 8:30 PM, Eric Blake <ebl...@redhat.com> wrote: > On 08/04/2014 09:33 PM, Ming Lei wrote: >> g_slice_new(VirtIOBlockReq), its free pair and access the instance > > Took me a while to read this. Maybe: > > Calling g_slice_new(VirtIOBlockReq) and its free pair, and accessing the > instance, are a bit slow...
One point is that VirtIOBlockReq is very big, so using libc's allocation is slow since lock has be to held for thread safety, or maybe brk() is involved in big allocation too. Another point is that obj pool can keep these frequent accessed objects in ram easily, and decrease page fault when accessing these buffer. > >> is a bit slow since sizeof(VirtIOBlockReq) takes more than 40KB, >> so use object pool to speed up its allocation and release. >> >> With this patch, ~5%-10% throughput improvement is observed in the VM >> based on server. >> >> Signed-off-by: Ming Lei <ming....@canonical.com> >> --- >> hw/block/dataplane/virtio-blk.c | 12 ++++++++++++ >> hw/block/virtio-blk.c | 13 +++++++++++-- >> include/hw/virtio/virtio-blk.h | 2 ++ >> 3 files changed, 25 insertions(+), 2 deletions(-) > >> @@ -50,6 +52,10 @@ struct VirtIOBlockDataPlane { >> Error *blocker; >> void (*saved_complete_request)(struct VirtIOBlockReq *req, >> unsigned char status); >> + >> + VirtIOBlockReq reqs[REQ_POOL_SZ]; >> + void *free_reqs[REQ_POOL_SZ]; >> + ObjPool req_pool; > > Why two instances of double spaces? reqs is the real space for object, and free_reqs is used for implementing allocation and release of objects. Thanks,