• S
    aio: add polling mode to AioContext · 4a1cba38
    Stefan Hajnoczi 提交于
    The AioContext event loop uses ppoll(2) or epoll_wait(2) to monitor file
    descriptors or until a timer expires.  In cases like virtqueues, Linux
    AIO, and ThreadPool it is technically possible to wait for events via
    polling (i.e. continuously checking for events without blocking).
    
    Polling can be faster than blocking syscalls because file descriptors,
    the process scheduler, and system calls are bypassed.
    
    The main disadvantage to polling is that it increases CPU utilization.
    In classic polling configuration a full host CPU thread might run at
    100% to respond to events as quickly as possible.  This patch implements
    a timeout so we fall back to blocking syscalls if polling detects no
    activity.  After the timeout no CPU cycles are wasted on polling until
    the next event loop iteration.
    
    The run_poll_handlers_begin() and run_poll_handlers_end() trace events
    are added to aid performance analysis and troubleshooting.  If you need
    to know whether polling mode is being used, trace these events to find
    out.
    
    Note that the AioContext is now re-acquired before disabling notify_me
    in the non-polling case.  This makes the code cleaner since notify_me
    was enabled outside the non-polling AioContext release region.  This
    change is correct since it's safe to keep notify_me enabled longer
    (disabling is an optimization) but potentially causes unnecessary
    event_notifer_set() calls.  I think the chance of performance regression
    is small here.
    Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: NPaolo Bonzini <pbonzini@redhat.com>
    Message-id: 20161201192652.9509-4-stefanha@redhat.com
    Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
    4a1cba38
trace-events 9.5 KB