• Juergen Gross's avatar
    xen: avoid deadlock in xenbus · 529871bb
    Juergen Gross authored
    When starting the xenwatch thread a theoretical deadlock situation is
    possible:
    
    xs_init() contains:
    
        task = kthread_run(xenwatch_thread, NULL, "xenwatch");
        if (IS_ERR(task))
            return PTR_ERR(task);
        xenwatch_pid = task->pid;
    
    And xenwatch_thread() does:
    
        mutex_lock(&xenwatch_mutex);
        ...
        event->handle->callback();
        ...
        mutex_unlock(&xenwatch_mutex);
    
    The callback could call unregister_xenbus_watch() which does:
    
        ...
        if (current->pid != xenwatch_pid)
            mutex_lock(&xenwatch_mutex);
        ...
    
    In case a watch is firing before xenwatch_pid could be set and the
    callback of that watch unregisters a watch, then a self-deadlock would
    occur.
    
    Avoid this by setting xenwatch_pid in xenwatch_thread().
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    529871bb
xenbus_xs.c 21.2 KB