• J
    libxl: use driver-wide ctx in fd and timer event handling · 57db83ae
    Jim Fehlig 提交于
    Long ago I incorrectly associated libxl fd and timer registrations
    with per-domain libxl_ctx objects.  When creating a libxlDomainObjPrivate,
    a libxl_ctx is allocated, and libxl_osevent_register_hooks is called
    passing a pointer to the libxlDomainObjPrivate.  When an fd or timer
    registration occurred, the registration callback received the
    libxlDomainObjPrivate, containing the per-domain libxl_ctx.  This
    libxl_ctx was then used when informing libxl about fd events or
    timer expirations.
    
    The problem with this approach is that fd and timer registrations do not
    share the same lifespan as libxlDomainObjPrivate, and hence the per-domain
    libxl_ctx ojects.  The result is races between per-domain libxl_ctx's being
    destoryed and events firing on associated fds/timers, typically manifesting
    as an assert in libxl
    
    libxl_internal.h:2788: libxl__ctx_unlock: Assertion `!r' failed
    
    There is no need to associate libxlDomainObjPrivate objects with libxl's
    desire to use libvirt's event loop.  Instead, the driver-wide libxl_ctx can
    be used for the fd and timer registrations.
    
    This patch moves the fd and timer handling code away from the
    domain-specific code in libxl_domain.c into libxl_driver.c.  While at it,
    function names were changed a bit to better describe their purpose.
    
    The unnecessary locking was also removed since the code simply provides a
    wrapper over the event loop interface.  Indeed the locks may have been
    causing some deadlocks when repeatedly creating/destroying muliple domains.
    There have also been rumors about such deadlocks during parallel OpenStack
    Tempest runs.
    Signed-off-by: NJim Fehlig <jfehlig@suse.com>
    57db83ae
libxl_driver.c 148.0 KB