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,

Reply via email to