Skip to content
Snippets Groups Projects
  • Stefan Hajnoczi's avatar
    8c6b0356
    util/async: make bh_aio_poll() O(1) · 8c6b0356
    Stefan Hajnoczi authored
    
    The ctx->first_bh list contains all created BHs, including those that
    are not scheduled.  The list is iterated by the event loop and therefore
    has O(n) time complexity with respected to the number of created BHs.
    
    Rewrite BHs so that only scheduled or deleted BHs are enqueued.
    Only BHs that actually require action will be iterated.
    
    One semantic change is required: qemu_bh_delete() enqueues the BH and
    therefore invokes aio_notify().  The
    tests/test-aio.c:test_source_bh_delete_from_cb() test case assumed that
    g_main_context_iteration(NULL, false) returns false after
    qemu_bh_delete() but it now returns true for one iteration.  Fix up the
    test case.
    
    This patch makes aio_compute_timeout() and aio_bh_poll() drop from a CPU
    profile reported by perf-top(1).  Previously they combined to 9% CPU
    utilization when AioContext polling is commented out and the guest has 2
    virtio-blk,num-queues=1 and 99 virtio-blk,num-queues=32 devices.
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-id: 20200221093951.1414693-1-stefanha@redhat.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    8c6b0356
    History
    util/async: make bh_aio_poll() O(1)
    Stefan Hajnoczi authored
    
    The ctx->first_bh list contains all created BHs, including those that
    are not scheduled.  The list is iterated by the event loop and therefore
    has O(n) time complexity with respected to the number of created BHs.
    
    Rewrite BHs so that only scheduled or deleted BHs are enqueued.
    Only BHs that actually require action will be iterated.
    
    One semantic change is required: qemu_bh_delete() enqueues the BH and
    therefore invokes aio_notify().  The
    tests/test-aio.c:test_source_bh_delete_from_cb() test case assumed that
    g_main_context_iteration(NULL, false) returns false after
    qemu_bh_delete() but it now returns true for one iteration.  Fix up the
    test case.
    
    This patch makes aio_compute_timeout() and aio_bh_poll() drop from a CPU
    profile reported by perf-top(1).  Previously they combined to 9% CPU
    utilization when AioContext polling is commented out and the guest has 2
    virtio-blk,num-queues=1 and 99 virtio-blk,num-queues=32 devices.
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-id: 20200221093951.1414693-1-stefanha@redhat.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>